Solr документы с дочерними элементами? - PullRequest
20 голосов
/ 07 апреля 2011

Возможно ли как-нибудь создать документ solr, который содержит подэлементы?

Например, как бы я представлял что-то вроде этого:

<person first="Bob" last="Smith">
   <children>
      <child first="Little" last="Smith" />
      <child first="Junior" last="Smith" />
   </children>
</person>

Как обычно решить эту проблему?

Ответы [ 3 ]

21 голосов
/ 13 октября 2014

Начиная с Solr 4.7 и 4.8, Solr поддерживает вложенные документы:

{
"id": "chapter1",
"title" : "Indexing Child Documents in JSON",
"content_type": "chapter",
"_childDocuments_": [
  {
    "id": "1-1",
    "content_type": "page",
    "text": "ho hum... this is page 1 of chapter 1"
  },
  {
    "id": "1-2",
    "content_type": "page",
    "text": "more text... this is page 2 of chapter 1"
  }
]
}

Подробнее см. В примечаниях к выпуску Solr .

13 голосов
/ 07 апреля 2011

Вы можете смоделировать это по-разному, в зависимости от ваших потребностей поиска / огранки.Обычно вы будете использовать многозначные или динамические поля.В следующих примерах я опущу тип поля, индексированные и сохраненные флаги:

<field name="first"/>
<field name="last"/>
<field name="child_first" multiValued="true"/>
<field name="child_last" multiValued="true"/>

Вам решать, как соотнести имена и фамилии детей.Или вы можете просто поместить оба в одно поле:

<field name="first"/>
<field name="last"/>
<field name="child_first_and_last" multiValued="true"/>

Еще одно:

<field name="first"/>
<field name="last"/>
<dynamicField name="child_first_*"/>
<dynamicField name="child_last_*"/>

Здесь вы должны хранить поля 'child_first_1', 'child_last_1', 'child_first_2', 'child_last_2 'и т. д. Опять же, вы должны соотносить значения, но, по крайней мере, у вас есть индекс.С помощью некоторого кода вы можете сделать это прозрачным.

Итог: как гласит Solr wiki : «Solr предоставляет одну таблицу. Хранение набора таблиц базы данных в индексе обычно требует денормализации некоторых изТаблицы. Попытки избежать денормализации обычно терпят неудачу. "Вы должны денормализовать ваши данные в соответствии с вашими поисковыми потребностями.

ОБНОВЛЕНИЕ: начиная с версии 4.5 Solr и непосредственно поддерживает вложенные документы: https://cwiki.apache.org/confluence/display/solr/Other+Parsers#OtherParsers-BlockJoinQueryParsers

7 голосов
/ 28 сентября 2011

Наличие отдельных полей для детей приводит к ложно положительным совпадениям. Объединенные поля работают в некотором смысле, но это действительно ограниченный подход. У нас большой опыт в подобных задачах в блоге на http://blog.griddynamics.com/2011/06/solr-experience-search-parent-child.html

...