Соответствие Elasticsearch и термин в фильтре
Я не вижу разницы между термином и совпадением в фильтре:
POST /admin/_search
{
"query": {
"bool": {
"filter": [
{
"term": {
"partnumber": "j1knd"
}
}
]
}
}
}
И результат также содержит не совсем совпадающие номера деталей, например: "52527.J1KND-H"
Почему?
1 ответ
Термические запросы не анализируются и означают, что все, что вы отправляете, будет использоваться для сопоставления токенов в инвертированном индексе, в то время как запросы сопоставления анализируются, и тот же анализатор применяется к полям, который используется во время индекса и, соответственно, соответствует документу.
Узнайте больше о запросе термина и запросе на совпадение. Как упоминалось в запросе на совпадение:
Возвращает документы, соответствующие указанному тексту, числу, дате или логическому значению. Предоставленный текст анализируется перед сопоставлением.
Вы также можете использовать 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"
}
}
]
}