Как запросить значение * в Elastic Nested Query? - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть документы с вложенными записями, такими как:

"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 и получит совпадение.

1 Ответ

0 голосов
/ 23 апреля 2019

Ваш синтаксис поиска правильный, я думаю, что проблема заключается в значениях, которые вы ищете, и более точно, какие Analyzer использует ваш индекс.

Я предполагаю, что вы используетестандартный анализатор (который по умолчанию используется и в вашем индексе, если не указано иное), в основном это означает, что не ВСЕ ваши данные являются индексом, это лишь некоторые из них, вам следует узнать, какие анализаторы делают то, что, однако, если вы хотите сохранитьникаких специфических символов ALPHANUMERIC, таких как *, вам придется создать собственный анализатор.

TLDR:

Хорошая новость: да, это возможно, создайте собственный анализатор, который ДЕЛАЕТ индекс специального символа *.Плохая новость - это создание нового индекса с нуля и повторная индексация всех данных в нем.

О том, как сделать это проще, вы можете прочитать здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...