Срочные запросы не анализируются и означают, что все, что вы отправляете, будет использоваться как есть для сопоставления токенов в инвертированном индексе, в то время как запросы на совпадение анализируются, и к полям применяется тот же анализатор, который используется во время индекса и, соответственно, соответствует документу.
Подробнее о term query и match query . Как указано в запросе на совпадение:
Возвращает документы, которые соответствуют предоставленному тексту, номеру, дате или логическому значению. Предоставленный текст анализируется перед сопоставлением.
Вы также можете использовать анализ API , чтобы просмотреть токены, сгенерированные для определенного поля.
Токены, сгенерированные standard analyzer
на 52527.J1KND-H
текст.
POST /_analyze
{
"text": "52527.J1KND-H",
"analyzer" : "standard"
}
{
"tokens": [
{
"token": "52527",
"start_offset": 0,
"end_offset": 5,
"type": "<NUM>",
"position": 0
},
{
"token": "j1knd",
"start_offset": 6,
"end_offset": 11,
"type": "<ALPHANUM>",
"position": 1
},
{
"token": "h",
"start_offset": 12,
"end_offset": 13,
"type": "<ALPHANUM>",
"position": 2
}
]
}
Выше объясните, почему вы получаете тоже не совсем совпадающее partnumbers
, например: "52527.J1KND-H", я бы взял ваш пример и как вы можете заставить его работать.
Отображение индекса
{
"mappings": {
"properties": {
"partnumber": {
"type": "text",
"fields": {
"raw": {
"type": "keyword" --> note this
}
}
}
}
}
}
Индекс документов
{
"partnumber" : "j1knd"
}
{
"partnumber" : "52527.J1KND-H"
}
Поисковый запрос для возврата только точного соответствия
{
"query": {
"bool": {
"filter": [
{
"term": {
"partnumber.raw": "j1knd" --> note `.raw` in field
}
}
]
}
}
Результат
"hits": [
{
"_index": "so_match_term",
"_type": "_doc",
"_id": "2",
"_score": 0.0,
"_source": {
"partnumber": "j1knd"
}
}
]
}