Код Java, который вы указали, показывает запрос bool, используя предложения must
и must_not
, в которых вы выполняете запрос термина.Что касается запросов к терминам, то они подчиняются анализатору, имеющемуся на ваших полях, стандартному анализатору для полей text
(тип данных вашего поля uri
, подробнее здесь ).удалит все знаки препинания (другими словами, точки в вашем слове) и разделит ваше слово на части.vip.vs.csin.cz
становится vip vs csin cz
.Тип поля text
должен быть зарезервирован только для полнотекстового поиска, в вашем случае я бы выбрал тип поля keyword
( Подробнее здесь ). Причина, по которой ваш запрос в Kibana работает, как и ожидалось, заключается в том, чтокаждый на самом деле не выполняет запрос терминов, а скорее запрос query_string , содержащий запрос lucene: uri: "smart" NOT uri: "vip.vs.csin.cz"
.
Итак, у вас есть несколько вариантов решения вашей проблемы.Вы можете изменить запрос к терминам на match_phrase
запросов, что позволит вам сохранить порядок ваших токенизированных терминов и, возможно, получить правильный результат.Альтернативой может быть выполнение запроса query_string
вместо запроса условий в вашем Java-коде, поскольку вы уже определили, что это дает правильный результат.
Мое предлагаемое решение, однако, состояло бы в том, чтобы переиндексировать uri
с типом поля keyword
, так как этот тип поля не приведет к нежелательному токенизации значений ваших полей в несколько терминов.Вы можете прочитать больше об анализаторе и токенизаторе по умолчанию для поля типа keyword
здесь .Это избавит вас от головной боли в будущем, поскольку вы знаете, что ваши запросы соответствуют значениям вашего поля в точности «как есть».