Соответствие Elasticsearch и срок в фильтре - PullRequest
1 голос
/ 26 марта 2020

Я не вижу никакой разницы между термином и соответствием в фильтре:

POST /admin/_search
{
    "query": {
        "bool": {
            "filter": [
                {
                    "term": {
                        "partnumber": "j1knd"
                    }
                }
            ]
        }
    }
}

И результат также содержит не совсем совпадающие номера деталей, например: "52527.J1KND-H"

Почему?

1 Ответ

1 голос
/ 26 марта 2020

Срочные запросы не анализируются и означают, что все, что вы отправляете, будет использоваться как есть для сопоставления токенов в инвертированном индексе, в то время как запросы на совпадение анализируются, и к полям применяется тот же анализатор, который используется во время индекса и, соответственно, соответствует документу.

Подробнее о 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"
        }
      }
    ]

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