Solr запрос с несколькими отрицаниями
На Solr 6.5.1 у меня есть *_txt_en
поле и string
поле типа документа. На этих полях я хотел бы построить запрос в форме:
Сопоставить все документы определенного типа, где:
- Определенные фразы ("первая фраза", "вторая фраза") должны встречаться в текстовом поле для сопоставления.
- Но если другие фразы ("фраза три", "фраза четыре", "фраза пять") также встречаются в этом поле, не сопоставляйте его.
Мой текущий запрос 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 исправляет это, но не цитируйте меня)
Для более подробного объяснения того, почему она отличается от логической логики в стиле БД, посмотрите мой ответ здесь