Странное поведение Solr / Lucene с логическими операторами - PullRequest
10 голосов
/ 09 сентября 2011

Я сталкиваюсь со странным поведением операторов - в синтаксисе запросов Solr / Lucene.Если я выполню запрос

-text AND -text 

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

-text AND (-text) 

или

(-text) AND (-text) 

, тогдаЯ не получаю результатов вообще.Я не могу понять почему.У вас есть объяснение этому поведению?

Заранее спасибо.

Ответы [ 2 ]

11 голосов
/ 14 сентября 2011

На вопрос очень хорошо ответили в Список рассылки Solr . Они также добавили запись в официальный FAQ, которая гласит:

Булевы запросы должны иметь хотя бы одно «положительное» выражение (т.е. ДОЛЖНО или СЛЕДУЕТ) для соответствия. Solr пытается помочь с этим, и если его попросят выполнить BooleanQuery, который содержит только отрицательные предложения на самом верхнем уровне , он добавляет запрос на сопоставление всех документов (то есть: *: *)

Если BoolenQuery верхнего уровня содержит где-то внутри него вложенный BooleanQuery, который содержит только отрицательные предложения, этот вложенный запрос не будет изменен, и он (по определению) не будет соответствовать ни одному документу - если это требуется, то означает, что внешний запрос не будет совпадать.

Таким образом, выражения с только «отрицательными» значениями всегда возвращают 0 результатов, за исключением самого верхнего уровня, где анализатор тихо добавляет *:* в начале запроса.

Поэтому -text AND -text преобразуется в *:* -text AND -text, и поэтому он имеет результаты, в то время как (-text) не преобразуется в (*:* -text), потому что он не на самом верхнем уровне, и поэтому (-text) не дает результатов.

1 голос
/ 09 сентября 2011

Объяснение зависит от используемого вами обработчика поиска и всей строки запроса.

Например: вы можете искать по нескольким полям, например

text AND text <- которые искаливо всех (по умолчанию) полях - в зависимости от обработчика поиска </p>

FIELD1:text AND text <- который использует <code>AND для поиска внутри FIELD1

FIELD1:text1 AND (-text2) <- поиск (насколько я помню правильно)для text1 в FIELD1, а НЕ text2 во всех других (по умолчанию) документах - в зависимости от обработчика поиска. </p>

Я думаю, использование () изменяет область / поля поиска.

Возможноповедение, которое вы описываете, имеет отношение к чему-то подобному?!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...