Ваша основная проблема в том, что вы не определили явное отображение, поэтому вступит в действие отображение по умолчанию. Предполагая, что вы работаете с последней версией 5 или 6.
При поиске в поле тегов анализируется текст, поэтому он создает для xxx yyy
токенов xxx
и yyy
, которые соответствуют также вашему поиску.
GET _analyze
{
"text": "xxx yyy"
}
Вы можете запросить мультиполе tags.keyword
, которое даст вам точное совпадение (значение поля не анализируется). Например:
GET _search
{
"query": {
"constant_score": {
"filter": {
"term": {
"tags.keyword": "xxx"
}
}
}
}
}
Или другая возможность, и, делая это с самого начала, используйте только тип ключевого слова. tags
обычно имеют тип keyword
или не анализируются.
Определить отображение
PUT test
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0
},
"mappings": {
"doc": {
"properties": {
"tags": {
"type": "keyword"
}
}
}
}
}
PUT test/doc/1
{
"tags": [
"xxx"
]
}
PUT test/doc/2
{
"tags": [
"xxx yyy"
]
}
Используя приведенное выше сопоставление, вы можете искать tags
затем.