Несколько запросов в Solr

Моя проблема в том, что у меня есть n полей (скажем, около 10) в Solr, которые доступны для поиска, все они проиндексированы и сохранены. Я хотел бы сначала выполнить запрос по всему моему индексу, скажем, 5000 документов, который будет включать в среднем около 500 документов. Далее я хотел бы выполнить запрос, используя другой набор ключевых слов для этих 500 документов, а НЕ для всего индекса.

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

Подводя итог, индекс 5000 будет отфильтрован до 500, а затем до 50 (5000>500>50). Это в основном фильтрация, но я хотел бы сделать это в Solr.

У меня есть разумные базовые знания, и я все еще учусь.

Обновление: если представить математически, это будет выглядеть так:

results1=f(query1)
results2=f(query2, results1)
final_results=f(query3, results2)

Я хотел бы, чтобы это было выполнено с помощью программы, и конечный пользователь увидит только 50 результатов. Так что огранка не вариант.


person user2575429    schedule 12.07.2013    source источник


Ответы (4)


Запросы-фильтры (fq) специально разработаны для быстрого ограничения делать какой-либо подсчет очков.

Таким образом, если вы поместите свой первый запрос в параметр fq, а второй запрос, генерирующий очки, в обычный параметр «q», он должен делать то, что вы просите.

См. также вопрос, обсуждающий эту проблему с противоположной стороны.

person Alexandre Rafalovitch    schedule 14.07.2013
comment
Спасибо Александр, основываясь на моем первоначальном тесте, я могу сказать, что он решает мою проблему. Также я вижу, что затраченное время намного меньше, чем решение Гаса. Сочетание вашего решения и решения Гаса должно всесторонне решить мою проблему. - person user2575429; 14.07.2013

Мне приходят в голову две вероятные реализации. Простейшим подходом было бы просто добавить первый запрос ко второму запросу;

+(first query) +(new query)

Это хороший подход, если первый запрос, по которому вы хотите отфильтровать, часто меняется. Если первый запрос представляет собой что-то вроде категории документов или чего-то подобного, где вы можете извлечь выгоду из повторного использования одного и того же фильтра, то лучше использовать запрос с фильтром, используя тег fq параметр, например:

q=field:query2&fq=categoryField:query1

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

person femtoRgon    schedule 12.07.2013

Я полагаю, вы хотите использовать вложенный запрос следующим образом:

text:"roses are red" AND _query_:"type:poems"

Подробнее о вложенных запросах можно прочитать здесь:

http://searchhub.org/2009/03/31/nested-queries-in-solr/

person Gus    schedule 12.07.2013
comment
Спасибо, Гас, я думаю, что это хороший подход к моему требованию, и я больше изучаю его, проведу небольшой тест и посмотрю, как он работает. Я ценю вашу помощь. - person user2575429; 14.07.2013

Следует взглянуть на «фасетный поиск» от Solr: http://wiki.apache.org/solr/SolrFacetingOverview Это поможет вам в подобном "повторяющемся" поиске.

person emgsilva    schedule 12.07.2013
comment
Эй, спасибо, я знаю о фасетах, но я не хочу их использовать. Детализация части, я хотел бы сделать это в программе. Конечный пользователь увидит только окончательный набор из 50 результатов и больше ничего. После первого запроса я хотел бы запустить второй запрос по результатам, полученным с совершенно другими параметрами. - person user2575429; 12.07.2013