Яке використання типу поля «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.