Я пытаюсь создать точное совпадение в моем Java-API, аналогично тому, как фильтры добавляются в кибане.
Скажем, мой индексированный объект
{
"fieldValue": "some value"
}
Когда я фильтрую для точногоЗначение в текстовом поле в кибане, он генерирует следующий запрос dsl:
{
"query": {
"match": {
"fieldValue": {
"query": "some value",
"type": "phrase"
}
}
}
}
Это приводит к желаемым результатам, потому что, когда я ищу "некоторые", я хочу только точные совпадения. то есть «некоторое значение» не должно быть возвращено. Приведенный выше запрос кибана дает желаемое поведение.
MatchQueryBuilder
Принимает fieldName / объект без компоновщика для "type"
QueryBuilder queryBuilder = QueryBuilders.matchQuery("fieldValue", "some value");
Resultsв сгенерированном запросе:
"query" : {
"match" : {
"fieldValue" : {
"value" : "some value",
"boost" : 1.0
}
}
},
В этом случае значение не соответствует точно. Если я изменю поле на value.keyword, результаты не будут возвращены.
Кроме того, я попытался использовать MatchPhraseQueryBuilder, но у меня возникла та же проблема. На данный момент я думаю о том, чтобы написать свой собственный конструктор запросов, но похоже, что это поведение уже реализовано.
Я нахожусь на Elastic Search версии 6.8