Могу ли я вернуть значения полей нескольких документов в запросе Solr?

Предположим, у меня есть эти поля в схеме документа:

<field name="id" type="string" indexed="true" stored="true" multiValued="false" />
<field name="type" type="string" indexed="true" stored="true" multiValued="false" />
<field name="referenceDataValues" type="string" indexed="true" stored="true" multiValued="true" />
<field name="text" type="text" indexed="true" stored="false" multiValued="true" />

Документ A имеет следующие значения для перечисленных полей:

  • id: "все равно"
  • тип: "Заказ на продажу"
  • referenceDataValues: ["abcdefg", "hijklmn", "opqrst"]
  • текст: ["делать", "не", "заботиться", "либо"]

Документ B имеет следующие значения:

  • id: "все равно"
  • тип: "Заказ на продажу"
  • referenceDataValues: ["hijklmn", "opqrst"]
  • текст: ["красный", "краска"]

Документ C имеет следующие значения:

  • идентификатор: "abcdef"
  • тип: "Клиент"
  • referenceDataValues: (нулевой)
  • текст: ["привет", "мир", "как", "я", "делаю"]

Документ D имеет следующие значения:

  • идентификатор: "hijklmn"
  • тип: "Клиент"
  • referenceDataValues: (нулевой)
  • текст: ["привет", "мир", "как", "я", "делаю"]

Поиск по умолчанию осуществляется только в текстовом поле.

Если пользователь вводит запрос «SalesOrder красная краска, клиент, привет, мир», я хочу создать запрос Solr, который возвращает только документ B. Это означает, что вы получите (SalesOrders, текст которых имеет красный цвет ИЛИ краска), которые ссылаются на клиентов, чей текст имеет привет ИЛИ мир

Алгоритм достижения этого будет таким:

Во-первых, результаты этого запроса:

q="привет, мир"&fq=type:Customer&fl=id

которые будут документами C и D, содержащими только идентификаторы. Однако я хочу получить эти значения в каждом из полей идентификатора, а не в документах, чтобы увидеть, существуют ли они в полях referenceDataValues ​​в документах SalesOrders.

q="красная краска"&fq=type:SalesOrder&fq=referenceDataValues: (здесь размещаются значения id из предыдущего запроса)

Можно ли вернуть значения полей ID в первом запросе? Если да, то как будет выглядеть синтаксис этого вложенного запроса?

Прямо сейчас запрос, который я пытаюсь использовать, выглядит так:

q=red paint&start=0&rows=25&fq=type:SalesOrder&fq=referenceDataValues:(_query_:"{!lucene fq=type:CustomerPartyMaster&fl=id} hello world")

person Matthew Steven Monkan    schedule 20.09.2011    source источник


Ответы (2)


То, чего вы пытаетесь достичь, - это своего рода соединение с идентификаторами. Идентификатор документа C и D является внешним ключом в значениях справочных данных для документа A и B.

Вы можете проверить патч соединения — https://issues.apache.org/jira/browse/SOLR-2272

Если это не сработает, вы можете в конечном итоге проиндексировать документы и их справочные данные как единое целое, чтобы вы могли выполнять поиск и фильтровать соответствующим образом.

person Jayendra    schedule 21.09.2011
comment
Судя по моим исследованиям, патч соединения наиболее близок к выполнению того, что я хочу, в одном запросе. Однако я использую Solr 1.x, и патч будет готов для версии 4.0. Тем временем я создал собственное объединение из нескольких запросов, и производительность у него хорошая. - person Matthew Steven Monkan; 28.09.2011

Пробовали ли вы использовать параметр FieldList??

Вы можете указать, какие поля должен возвращать ваш запрос, а затем просто выполнить второй запрос, где вы фильтруете по ссылкеDataValues:returnedID

Но вам нужно проверить, как это работает (я думаю о производительности), когда результат первого запроса содержит много идентификаторов.

person Dorin    schedule 21.09.2011
comment
Это то, что я по существу пытаюсь сделать. Однако можно ли получить этот результат одним запросом? Если у вас есть referenceDataValues:returnedID, я хочу внедрить запрос, возвращающий одно или несколько значений идентификатора вместо returnID. Но я не уверен, что вложенный запрос действительно может вернуть строку (строки) из поля id (запрос всегда возвращает сами документы, верно?). - person Matthew Steven Monkan; 21.09.2011
comment
Таким образом, встраивая этот запрос в другой: q=hello world&fq=type:Customer&fl=id , я надеюсь, что будет возвращена группа строк идентификатора, а не группа документов. Затем окружающий запрос фильтрует referenceDataValues, используя эти идентификаторы. - person Matthew Steven Monkan; 21.09.2011
comment
Я понимаю. Я не знаю, возможно ли это сделать в одном запросе. Предложение, предложенное Джатендрой Патил, похоже, решит вашу проблему с помощью одного запроса. Используя мой подход, вам нужно сделать 2 запроса. Если вы используете fl=id в своем запросе, он вернет только одно поле в документе. - person Dorin; 22.09.2011