Яке використання типу поля «multiValued» у Solr?


75

Я новачок у Apache Solr. Навіть прочитавши частину документації , мені важко чітко зрозуміти функціональність та використання властивості multiValuedтипу поля.

Що внутрішньо Solr робить / обробляє / обробляє поле, позначене як multiValued ?

Яка різниця в індексації в Solr між полем, яке є багатозначним, і тим, яке не є?

Хтось може пояснити на хорошому прикладі?

Док каже:

multiValued = true | false

Істинно, якщо це поле може містити кілька значень на документ, тобто якщо воно може з'являтися кілька разів у документі

Відповіді:


74

Багатозначне поле корисне, коли для поля присутнє більше одного значення. Простим прикладом можуть бути теги, може бути декілька тегів, які потрібно проіндексувати. отже, якщо у нас є поле тегів як багатозначне, тоді відповідь solr поверне список замість рядкового значення. Одним моментом, на який слід звернути увагу, є те, що вам потрібно подати кілька рядків для кожного значення тегів, наприклад:

<field name = "tags"> tag1 </tags>
<field name = "tags"> tag2 </tags>
...
<field name = "tags"> tagn </tags>

Отримавши всі індекси значень, ви можете шукати або фільтрувати результати за будь-яким значенням, e, g. Ви можете знайти всі документи з тегом1, використовуючи такий запит

q=tags:tag1

або використовуйте теги, щоб відфільтрувати результати, наприклад

q=query&fq=tags:tag1

5
Яка різниця / перевага між заняттями search or filter results by any value? У цьому випадку, яка різниця при пошуку за тегами: tag1 у 'q' або fq?
— Gnanam

1
кожне значення може бути рядком, і ви можете точно збігатись із набором рядків. У випадку однозначного поля ви можете мати маркерні слова або цілий рядок. Іншим використанням є зберігання значень, які є списками, як я вже згадував у випадку тегів, можуть бути числами, як список числових значень.
— Умар,

6
@Gnanam: Відфільтровані запити кешуються і не впливають на оцінку. Їх основна мета - створити фіксовану "надмножину" документів, яку потім можна буде шукати. Приклад: Користувач вводить запит, і програма застосовує додаткові обмеження, наприклад, лише для пошуку документів, якими володіє користувач. У цьому випадку програма надсилатиме обмеження "лише даному користувачеві" як fqі фактичний пошуковий запит як q.
— Даніель Ріковський,

Що робити, якщо ви не знаєте значень тегів. Наприклад, під час індексації збірника статей ви хочете встановити "ключове слово" як поле multiValue, але ви не знаєте всіх значень!
— fanchyna

15

multiValued визначає у схемі, чи дозволено поле мати більше одного значення.

Наприклад:
якщо у мене є fieldType, який називається ID, який є multiValued = false індексує документ, такий як цей:

doc {
  id : [ 1, 2]
  ...
}

спричинило б викид у потік індексування, і документ не буде проіндексовано (перевірка схеми не вдасться).

З іншого боку, якщо у мене є кілька значень для поля, я хотів би встановити multiValued = true, щоб гарантувати, що індексація зроблена правильно, наприклад:

doc {
  id : 1
  keywords: [ hello, world ]
  ...
}

У цьому випадку ви б визначили "ключові слова" як багатозначне поле.


1
Повідомте мене, чи правильно я це зрозумів. Наприклад, якщо я спробую індексувати дані безпосередньо з бази даних за допомогою, DataImportHandlerі якщо одним із типів тегів мого поля бази даних є VARCHAR[](масив varchar), то має сенс зіставити це поле тегу в полі сонячної схеми як multiValued. Чи правильно я розумію?
— Gnanam

1
пізно до гри тут, але я б загалом сказав так ... але ніколи не говори ніколи і ніколи не говори завжди
— markgiaconia

12

Я використовую кілька полів значень лише з полями копіювання, тому думайте так, скажімо, всі поля будуть однозначними, якщо це не поле копіювання, наприклад, у мене є такі поля:

<field name="id" type="string" indexed="true" stored="true"/>
<field name="name" type="string" indexed="true" stored="true"/>
<field name="subject" type="string" indexed="true" stored="true"/>
<field name="location" type="string" indexed="true" stored="true"/>

Я хочу запитати лише одне поле і, можливо, здійснити пошук у всіх 4 полях вище, тоді нам потрібно використовувати поле копіювання. спочатку створити нове польове виклик 'all', а потім скопіювати все в 'all'

<field name="all" type="text" indexed="true" stored="true" multiValued="true"/>
<copyField source="*" dest="all"/>

Тепер поле "все" має бути багатозначним.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.