Запрос Solr Dismax и Edismax дает разные результаты для одного и того же запроса

Есть запрос, который содержит необязательные («следует») обязательные и запрещенные токены. Следующие два запроса возвращают разные результаты. Но должно быть же, не так ли?

+_query_:"{!type=**dismax** mm='2<2 3<3 5<4 7<51%' qf='normalizedField'} opt1 opt2 +mandatory -prohibited"

VS

+_query_:"{!type=**edismax** mm='2<2 3<3 5<4 7<51%' qf='normalizedField'} opt1 opt2 +mandatory -prohibited"

С параметром «Минимальное соответствие» «Должен»:

mm: "2<2 3<3 5<4 7<51%"

Любые идеи? Спасибо

Обновлено В индексе solr есть документ:

{
   ...
   "normalizedField":"opt1 opt3 mandatory"
   ...
}

поиск с помощью запроса dismax:

+_query_:"{!type=dismax mm='2<2 3<3 5<4 7<51%' qf='normalizedField'} opt1 opt2 +mandatory -prohibited"

"parsedquery_toString":"+(((normalizedField:opt1) (normalizedField:opt2) +(normalizedField:mandatory) -(normalizedField:prohibited))~2) ()"

вернуть пустой результат (как и ожидалось)

НО

поиск с помощью запроса edismax:

+_query_:"{!type=edismax mm='2<2 3<3 5<4 7<51%' qf='normalizedField'} opt1 opt2 +mandatory -prohibited"

"parsedquery_toString": "+((normalizedField:opt1) (normalizedField:opt2) +(normalizedField:mandatory) -(normalizedField:prohibited))"

вернуть этот документ. ЗАЧЕМ?


person r.r    schedule 09.06.2016    source источник
comment
dismax работает как положено, а edisamax нет(   -  person r.r    schedule 09.06.2016


Ответы (2)


кажется, я нашел решение. Я ИСПОЛЬЗОВАЛ версию solr 5.2 с известной проблемой (https://issues.apache.org/jira/browse/SOLR-2649). После обновления до версии 5.5.1 проблема решена) и edismax работает так же как и dismax(для моего примера)

person r.r    schedule 09.06.2016

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

  • поддерживает полный синтаксис анализатора запросов Lucene.
  • поддерживает такие запросы, как И, ИЛИ, НЕ, - и +.
  • обрабатывает «и» и «или» как «И» и «ИЛИ» в режиме синтаксиса Lucene.
  • учитывает имена «магических полей» _val_ и _query_. Это не настоящие поля в схеме, но если они используются, они помогают выполнять специальные действия (например, запрос функции в случае _val_ или вложенный запрос в случае _query_). Если _val_ используется в запросе термина или фразы, значение анализируется как функция.
  • включает улучшенное интеллектуальное частичное экранирование в случае синтаксических ошибок; полевые запросы, +/- и фразовые запросы по-прежнему поддерживаются в этом режиме.
  • улучшает усиление близости с помощью словесной черепицы; вам не нужно, чтобы запрос соответствовал всем словам в документе, прежде чем будет применено повышение близости.
  • включает расширенную обработку стоп-слов: стоп-слова не требуются в обязательной части запроса, но по-прежнему используются в части повышения близости. Если запрос состоит из всех стоп-слов, таких как «быть или не быть», то требуются все слова.
  • включает в себя улучшенную функцию повышения: в Extended DisMax функция повышения является множителем, а не дополнением, улучшающим ваши результаты повышения; аддитивные функции повышения DisMax (bf и bq) также поддерживаются.
  • поддерживает чистые отрицательные вложенные запросы: такие запросы, как +foo (-foo), будут соответствовать всем документам.
  • позволяет указать, какие поля разрешено запрашивать конечному пользователю, и запретить прямой поиск по полям.

Я выделил жирным шрифтом те, которые легко могут повлиять на оценку, в то время как такие функции, как «чисто отрицательные вложенные запросы», изменят включенные документы. То же самое может произойти из-за поддержки полного синтаксиса анализатора запросов lucene.

Самый простой способ выяснить, что происходит, — это использовать функцию debugQuery Solr, чтобы вы могли видеть оценки и то, до чего именно расширяется запрос dismax и edismax.

.. и если dismax работает, вы можете просто использовать это.

person MatsLindh    schedule 09.06.2016
comment
я не могу использовать dismax, потому что он не поддерживает fuzzy( - person r.r; 09.06.2016
comment
Обновленный вопрос с примером - person r.r; 09.06.2016