Рейтинг минимальных результатов матчей Solr

В моем приложении Rails у меня есть модель вопроса, настроенная с помощью sunspot solr, с полем «текст», и я хотел бы искать в этом поле, выполняя логическое ИЛИ между словами. Я обнаружил, что установка minimum_match на 1 решает мою проблему, однако я также хотел бы упорядочить результаты, повышая вопросы, которые имеют более 1 совпадения слов. Есть ли способ сделать это с Solr? Документация не очень полезна в отношении функций ранжирования.

Изменить: это полный запрос, который я выполняю в контроллере.

@questions = Question.solr_search do
  fulltext params[:query], :minimum_match => 1
end.results

person Matteo Depalo    schedule 23.05.2012    source источник


Ответы (2)


Согласно http://wiki.apache.org/solr/SchemaXml,

Оператор по умолчанию, используемый парсером запросов Solr (SollrQueryParser), можно настроить с помощью

<solrQueryParser defaultOperator="AND|OR"/>. 

Оператор по умолчанию — «ИЛИ», если он не указан. Предпочтительно не использовать этот параметр и не полагаться на него; вместо этого обработчик запроса или запрос LocalParams должен указать оператор по умолчанию. Этот параметр здесь можно опустить, и он считается устаревшим.

Вы можете изменить свой defaultOperator в solr/conf/schema.xml или использовать LocalParams, чтобы указать ИЛИ с помощью синтаксиса, такого как https://github.com/sunspot/sunspot/wiki/Building-queries-by-hand

Это правда, что оператор Sunspot по умолчанию — «И», как указано в https://github.com/sunspot/sunspot/blob/master/sunspot_solr/solr/solr/conf/schema.xml

person konyak    schedule 12.11.2012

Логическое ИЛИ — это поведение по умолчанию обработчика запросов Dismax, используемого в Sunspot.

Кроме того, чем больше слов соответствует, тем выше оценка документа (что звучит как то, что вы хотите)

Question.search do
  fulltext 'best pizza'
end

... должен возвращать результаты, соответствующие одному или обоим словам (сначала возвращая те, которые соответствуют обоим):

  1. «В Joe's самая лучшая пицца в Нью-Йорке»
  2. "Трудно сказать, какая пиццерия лучшая"
  3. «Пицца — не лучшая еда для вас»
  4. «Меня не волнует, вредна ли вам пицца
  5. "Какой, по вашему мнению, лучший тип фаст-фуда?"

minimum_match полезен только в том случае, если вы хотите отфильтровать результаты с низкой релевантностью (где фактически совпало только определенное небольшое количество или процент терминов). Это не влияет на оценку или поведение логических операций ИЛИ/И.

person Peter Dixon-Moses    schedule 23.05.2012
comment
По моему опыту, а также отметил здесь и здесь в абзаце с минимальным соответствием , поведением поиска по умолчанию является логическое И между словами. Также я использую этот тип фильтра <filter class="solr.NGramFilterFactory" minGramSize="2" maxGramSize="15"/> для текстовых полей, которые, я не знаю, могут ли они вызывать поведение, отличное от стандартного... - person Matteo Depalo; 24.05.2012
comment
Легче думать о dismax скоринге как о преимуществе документов, которые соответствуют большинству терминов из запроса. Такого поведения при поиске ожидает большинство людей. Первая ссылка, которую вы разместили, объясняет это довольно хорошо. :minimum_match => 1 должно быть по умолчанию. Он вступает в силу только в том случае, если вы увеличиваете его (что ограничивает результаты документами, в которых совпадает больше терминов). - person Peter Dixon-Moses; 26.05.2012
comment
NGramFilterFactory действительно полезен только в нескольких конкретных ситуациях (EdgeNGramFilterFactory помогает с поиском по префиксу/автозаполнением). Вы, вероятно, сопоставляете кучу результатов, которые вам не нужны (например, поиск «zz» будет соответствовать чему-либо с «пицца»). Может быть, вы можете опубликовать больше о том, что вы пытаетесь сделать. - person Peter Dixon-Moses; 26.05.2012
comment
Мои пользователи ищут с помощью функции поиска, которая обновляет результаты, пока они пишут, поэтому меня интересуют частичные результаты, чтобы не показывать им ничего, пока они печатают слово. Возможно, как вы заметили, EdgeNGramFilterFactory больше подходит для этой цели. - person Matteo Depalo; 26.05.2012