Подтвердить что ты не робот

Solr документы с дочерними элементами?

Возможно ли создать файл solr, содержащий подэлементы?

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

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

Каков обычный способ решения этой проблемы?

4b9b3361

Ответ 1

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

<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 предоставляет одну таблицу. Хранение таблиц набора данных в индексе обычно требует денормализации некоторых из таблицы. Попытки избежать денормализации обычно терпят неудачу". Это зависит от вас, чтобы денормализовать ваши данные в соответствии с вашими потребностями поиска.

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

Ответ 2

Как и в 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.

Ответ 3

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