У меня есть документы с вложенными записями, такими как:
"listOfElements": {
"entries": [{
"key1": "value1",
"key2": "value2"
}, {
"key1": "value3",
"key2": "*"
}
]
}
Таким образом, * во второй записи является действительным значением String, а не подстановочным знаком.
Теперь я пытаюсьзапросить все документы с помощью key1: value3 и key2: *, используя следующее тело:
{
"query": {
"nested" : {
"path" : "listOfElements.entries",
"score_mode" : "avg",
"query" : {
"bool" : {
"must" : [
{ "match" : {"listOfElements.entries.key1" : "value3"} },
{ "match" : {"listOfElements.entries.key2" : "*" } }
]
}
}
}
}
}
Однако это не возвращает никаких документов вообще.
Также, используя "\\ *"как параметр запроса для key2 не помогает.
Можно ли даже запросить * как фактическое строковое значение, а не как подстановочный знак?
РЕДАКТИРОВАТЬ после 1-го ответа с подсказкой к настройкам анализатора: Попытался настроить мой индекс для использования сопоставления char_filter, как описано в документах Elastic:
"settings": {
"analysis": {
"analyzer": {
"rebuilt_standard": {
"tokenizer": "standard",
"char_filter": [
"replace_star_filter"
]
}
},
"char_filter": {
"replace_star_filter": {
"type": "mapping",
"mappings": [
"* => _star_"
]
}
}
}
}
Это работает, если я вызываю URL для анализа вручную, например, с этим телом
{
"analyzer": "rebuilt_standard",
"text": "I'm delighted about it *"
}
Я получаю следующий ответ:
{
"tokens": [
{
"token": "I'm",
"start_offset": 0,
"end_offset": 3,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "delighted",
"start_offset": 4,
"end_offset": 13,
"type": "<ALPHANUM>",
"position": 1
},
{
"token": "about",
"start_offset": 14,
"end_offset": 19,
"type": "<ALPHANUM>",
"position": 2
},
{
"token": "it",
"start_offset": 20,
"end_offset": 22,
"type": "<ALPHANUM>",
"position": 3
},
{
"token": "_star_",
"start_offset": 23,
"end_offset": 24,
"type": "<ALPHANUM>",
"position": 4
}
]
}
РЕДАКТИРОВАТЬ 2: Мне наконец удалось заставить это работать.Мне пришлось предварительно настроить отображение, чтобы в конкретном поле использовался мой собственный анализатор.Сложность и неожиданность для меня заключались в том, что, когда я запускал поисковый запрос, он показывал мне исходный документ с * внутри, но если бы я запускал запрос из API, используя тело JSON, тогда я мог бы использовать star и получит совпадение.