Solr запрос с несколькими отрицаниями

На Solr 6.5.1 у меня есть *_txt_en поле и string поле типа документа. На этих полях я хотел бы построить запрос в форме:

Сопоставить все документы определенного типа, где:

  1. Определенные фразы ("первая фраза", "вторая фраза") должны встречаться в текстовом поле для сопоставления.
  2. Но если другие фразы ("фраза три", "фраза четыре", "фраза пять") также встречаются в этом поле, не сопоставляйте его.

Мой текущий запрос Solr, который я написал, выглядит следующим образом:

(documenttype:references AND (field:"phrase one" OR field:"phrase two")) AND NOT field:"phrase three" AND NOT field:"phrase four" AND NOT field:"phrase five"

Я могу придумать альтернативу:

(documenttype:references AND (field:"phrase one" OR field:"phrase two")) AND NOT (field:"phrase three" OR field:"phrase four" OR field:"phrase five")

Представленные выше запросы, похоже, работают с набором игрушечных данных из нескольких примеров. Но я узнал, что с Solr существуют некоторые неписаные правила и неочевидные подводные камни, особенно с отрицаниями как частью булевых запросов.

Для запроса, как я описал, это правильный синтаксис для их формирования?

1 ответ

Решение

Ваш запрос выглядит хорошо для меня.

NOT в lucene/solr используется для фильтрации результатов и не подразумевает сопоставления со всем остальным, как в базе данных (ну, иногда это происходит в solr). Простой способ думать о том, как отрицания в lucene работают, это предположить, что всегда есть AND перед ними.

  • term1 OR NOT term2 на самом деле получить результаты term1 AND NOT term2
  • NOT term1 не будет работать в Lucene, потому что AND NOT term1 не имеет смысла. (solr выполнит эту работу, автоматически преобразовав ее в *:* AND NOT term1Таким образом, почему Solr лечение NOT вроде противоречиво)
  • term1 AND (NOT term2) не будет работать, потому что он собирается оценить AND NOT term2 прежде чем перейти к деталям вне скобок (я не думаю, что Solr исправляет это, но не цитируйте меня)

Для более подробного объяснения того, почему она отличается от логической логики в стиле БД, посмотрите мой ответ здесь

Другие вопросы по тегам