Эластичный запрос, запрос Term (или _ID) с дефисом в значении

Я изо всех сил пытаюсь найти точное совпадение. Это поле идентично в двух полях в документе, в _id и в одном поле в теле.

Так что я могу искать в любом из этих полей. Есть ли способ настроить запрос термина для поддержки этого? Я пробовал указать анализатор пробелов, но, похоже, это не поддерживаемая конфигурация для термических запросов.

Я пробовал несколько вариантов, но пока ни один из них не помог.

data: {
    query: {
        term: {
            "_id":"4123-0000"            
        }
    }
}

Это ничего не возвращает


person Allen H.    schedule 12.09.2020    source источник
comment
Можете ли вы поделиться своими картами, образцами и ожидаемыми документами?   -  person user156327    schedule 12.09.2020
comment
Не думаю, что у нас есть какое-то специальное отображение. Все просто план-текст, плоские строковые поля.   -  person Allen H.    schedule 12.09.2020


Ответы (1)


Проблема в том, что, поскольку вы используете сопоставление по умолчанию, ваше поле _id кажется заполненным вами, в котором использовалось бы поле text, которое использует анализатор standard и разделяет токены на основе -, поэтому ваше поле _id токенизируется, как показано ниже:

POST / _analyze

{
  "text" : "4123-0000",
  "analyzer" : "standard"
}

И токены

 {
        "tokens": [
            {
                "token": "4123",
                "start_offset": 0,
                "end_offset": 4,
                "type": "<NUM>",
                "position": 0
            },
            {
                "token": "0000",
                "start_offset": 5,
                "end_offset": 9,
                "type": "<NUM>",
                "position": 1
            }
        ]
    }

Теперь, как вы, возможно, знаете, что term запрос не анализируется, т.е. он использует 4123-0000 как есть и пытается найти в инвертированном индексе, который недоступен, поэтому вы не получаете никакого результата.

Решение: просто замените _id на _id.keyword, чтобы получить результат поиска.

person user156327    schedule 12.09.2020
comment
Спасибо, это решение сработало! _id - это идентификатор документа, добавленный logstash / elastic. Но, к счастью, у нас есть еще одно поле (добавленное нами), которое содержит то же значение. Добавление .keyword на этом сработало! - person Allen H.; 12.09.2020
comment
@AllenH. рад, что это было полезно, и да, в этом случае вам повезло, иначе вам пришлось бы все заново индексировать - person user156327; 12.09.2020