2013-03-12 1 views
1

У меня проблема с повышением при использовании Solr. Недавно мы перешли из Луцен в Солр.Борьба с запросом solr и актуальностью

У нас есть 4 (первичных) поля поиска, которые мы ищем против: сущность, ключевые слова, allSearchable и качество; где для каждого документа в индексе сущность содержит первые три слова без остановки в ключевых словах. «ключевые слова» - это всего лишь список ключевых слов. И «allSearchable» содержит данные, которые представляют собой просто набор других данных для данного документа. То, что мы делали в Lucene было сделать 3 поиски для любого данного поиска, которые пользователь вводит в поле поиска (для того, чтобы ранжировать результаты поиска по релевантности), например, так:

слова набранного в SearchBox: tree

Запрос 1: +essence:tree (сортировка по 'качеству') , если Query 1 возвращает достаточно для страницы, которую мы хотим получить, а затем вернемся.

Запрос 2: +keywords:tree (сортировка по 'качеству') Если комбинация запросов 1 и запроса 2 вернула достаточное количество результатов для страницы, на которой мы находимся, верните результаты.

Запрос 3: +allSearchable:tree (сортировка по 'качеству') Вернуться к результатам. Если их нет, то жуткая удача.

Моя проблема с разбиением на страницы. Мне не приходилось посылать разбивку (startIndex, rows) на Lucene. Я мог просто попросить все, а затем перевернуть все, что я вернусь, собрав достаточное количество результатов, чтобы вернуться, в зависимости от страницы, о которой я просил. С Solr я должен передать параметры разбивки на страницы. У нас в нашем индексе более 8 миллионов документов, поэтому получить все, что соответствует запросу типа «дерево», слишком дорого. Проблема в том, что если я попрошу страницу 3 в Query 1, и я не получу достаточных результатов, тогда я должен перейти к запросу 2 (keywords: tree). Но это неправильно, потому что я запрашиваю результаты страницы 3 для запроса 2 (другими словами, дайте мне все документы, которые соответствуют «keywords: tree» на стр. 3). Но на самом деле это не вопрос, который я хочу задать. Я хочу только задать страницу 1 из ключевых слов, если сущность ничего не соответствует. И так далее.

То, что я действительно ищу, - это ОДИН запрос, которого было бы достаточно для этих трех запросов, которые я делал раньше, так что я сначала возвращаю суть, ключевое слово соответствует второму, а совпадение allSearchable - последним.

Я попытался с помощью повышения с этим запросом: essence:tree^4.0 keywords:tree^2.0 allSearchable:tree^1.0

Но это, кажется, не делать трюк, и я не знаю, почему? Я достал вещи, и все еще не вернуло мне правильных результатов. Я использую стандартный метод StandardRequestHandler (который, как представляется, использует LuceneQueryParser (не раздражает или edismax). Я вижу, что boosts отправляются в solr в URL-адресе (я использую boosting, добавляя параметр qf в раздел по умолчанию моего requestHandler в solrconfig.xml). Я, конечно, знаю, что lucene может понять эти параметры. Может ли кто-нибудь сказать мне, как я мог бы построить один запрос, который позволил бы мне получить результаты, как я хочу, как описано выше? enter code here

ответ

0

Я бы порекомендовал используя ExtendedDismax Query Parser (eDisMax), а затем вы можете указать стимулирующая через поля, как показано в следующем примере:

http://localhost:8983/solr/select/?q=tree 
    &defType=edismax&qf=essence^4.0+keywords^2.0+allSearchable^1.0 

вы, возможно, потребуется отрегулировать т он увеличивает значения вверх или вниз по полям, чтобы получить желаемые результаты. Кроме того, есть дополнительные параметры для eDisMax, которые влияют на повышение и как выполняется запрос, который вы должны изучить.

+0

спасибо.Я не знаю, нормально ли задавать последующие вопросы, так что отшлепайте меня, если я уйду. ВОПРОС: Могу ли я отправить запросы lucene (в форме + searchField: searchValue) в edismax? – Tucker

+0

Да, согласно разделу синтаксиса запросов (по ссылке выше), он поддерживает полный LuceneQuerySyntax, включая полевые поисковые запросы. –

+0

ОК. Мои тесты модуля также подтверждают это. Все, что я сделал, было запущено множество различных запросов, изменив defType на edismax, и все тесты прошли. Спасибо, Пейдж! – Tucker