2013-07-12 3 views
5

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

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

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

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

Update: Если Математически это будет выглядеть следующим образом:

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

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

ответ

3

Filter queries (fq) специально разработаны для быстрого ограничения от результата, не вычисляя счет.

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

См. Также a question discussing this issue from the opposite direction.

+0

Thanx Alexandre, основанный на моем первоначальном тестировании, могу сказать, что он решает мою проблему. Также я вижу, что время занято намного меньше, чем решение Гуса. Комбинация вашего и решения Gus должна решить мою проблему всесторонне. – user2575429

0

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

+0

Эй, спасибо, я знаю о грани, но я не хочу его использовать. Свернув часть, я хотел бы сделать это в программе. Конечный пользователь увидит только окончательный набор из 50 результатов и ничего больше. После первого запроса я хотел бы запустить второй запрос по результатам, полученным с совершенно разными параметрами. – user2575429

2

Я считаю, что вы хотите использовать вложенный запрос, как это:

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

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

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

+0

Thanx Gus, я думаю, что это хороший подход для моего требования, и я больше изучаю его, проведу немного и посмотрю, как он работает. Я ценю вашу помощь. – user2575429

5

Два вероятной реализация происходит со мной. Самый простой подход - просто добавить первый запрос ко второму запросу;

+(first query) +(new query) 

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

q=field:query2&fq=categoryField:query1 

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

 Смежные вопросы

  • Нет связанных вопросов^_^