Как вы уже столкнулись, недостаток неправильного типа данных приводит к неожиданному поведению. Я тихо не понял, почему значением может быть либо строка чисел c и c. Но, учитывая вариант использования, я бы предложил определить другое поле для другого типа значения. Учитывая запрос, который вы пытаетесь сопоставить, требует сохранения отношения между ключом и полем значения. Поэтому я бы предложил вам определить вложенное поле вместо простого поля объекта.
Причина неиспользования поля объекта заключается в том, что elastisearch выравнивает объект, а затем индексирует его. Уплощение объекта приводит к потере связи между свойствами. Подробнее об этом здесь .
Теперь рассмотрим следующий пример (elasti c 7.x):
Шаг 1: Определите отображение с правильным типом для полей
PUT test
{
"mappings": {
"properties": {
"nestedField": {
"type": "nested",
"properties": {
"key": {
"type": "keyword"
},
"stringValue": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
},
"numericValue": {
"type": "integer"
}
}
}
}
}
}
Мы создали nestedField
с полями key
, stringValue
, numericValue
типа keyword
(не проанализировано), text
(стандарт по умолчанию) анализатор и подполе ключевого слова типа, если требуется точное совпадение), integer
соответственно.
Шаг 2 : индексный документ
PUT test/_doc/1
{
"nestedField": [
{
"key": "foo",
"stringValue": "lisa"
},
{
"key": "bar",
"numericValue": 19
}
]
}
PUT test/_doc/2
{
"nestedField": [
{
"key": "foo",
"stringValue": "mary"
},
{
"key": "bar",
"numericValue": 9
}
]
}
Обратите внимание, как я проиндексировал строку значение и число c значение.
Шаг 3: Запрос по мере необходимости.
Для запроса в поле вложенного типа необходимо использовать вложенный запрос .
GET test/_search
{
"query": {
"nested": {
"path": "nestedField",
"query": {
"bool": {
"filter": [
{
"term": {
"nestedField.key": "bar"
}
},
{
"range": {
"nestedField.numericValue": {
"gt": 10
}
}
}
]
}
}
}
}
}
Приведенный выше запрос вернет только do c 1 , поскольку для do c 2 даже при наличии key: bar
, но соответствующее значение (numericValue
) не превышает 10.