Запрос Elasticsearch не работает со значением @ - PullRequest
0 голосов
/ 20 февраля 2019

Когда я выполняю простой поисковый запрос по электронной почте, он ничего мне не возвращает, если я не удаляю то, что следует за «@», почему?

Я хочу делать запросы на электронные письма внечёткость и автозаполнение.

ИНФОРМАЦИЯ ОБ ЭЛЕКТРИЧЕСКОМ ПОИСКЕ:

{
  "name" : "ZZZ",
  "cluster_name" : "YYY",
  "cluster_uuid" : "XXX",
  "version" : {
    "number" : "6.5.2",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "WWW",
    "build_date" : "2018-11-29T23:58:20.891072Z",
    "build_snapshot" : false,
    "lucene_version" : "7.5.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

MAPPING:

PUT users
{
  "mappings":
  {
    "_doc": { "properties": { "mail": { "type": "text" } } }
  }
}

ВСЕ ДАННЫЕ:

[
    { "mail": "firstname.lastname@company.com" },
    { "mail": "john.doe@company.com" }
]

QUERY WORKS:

Срок запроса работает, но mail == "firstname.lastname@company.com", а не "firstname.lastname" ...

QUERY :
GET users/_search
{ "query": { "term": { "mail": "firstname.lastname" } }}

RETURN :
{
  "took": 7,
  "timed_out": false,
  "_shards": { "total": 6, "successful": 6, "skipped": 0, "failed": 0 },
  "hits": {
    "total": 1,
    "max_score": 4.336203,
    "hits": [
      {
        "_index": "users",
        "_type": "_doc",
        "_id": "H1dQ4WgBypYasGfnnXXI",
        "_score": 4.336203,
        "_source": {
          "mail": "firstname.lastname@company.com"
        }
      }
    ]
  }
}

ЗАПРОС НЕ РАБОТАЕТ:

QUERY :
GET users/_search
{ "query": { "term": { "mail": "firstname.lastname@company.com" } }}

RETURN :
{
  "took": 0,
  "timed_out": false,
  "_shards": { "total": 6, "successful": 6, "skipped": 0, "failed": 0 },
  "hits": {
    "total": 0,
    "max_score": null,
    "hits": []
  }
}

РЕШЕНИЕ:

Изменить отображение (переиндексировать после изменения отображения) с помощью uax_url_email анализатор для писем.

PUT users
{
  "settings":
  {
    "index": { "analysis": { "analyzer": { "mail": { "tokenizer":"uax_url_email" } } } }
  }
  "mappings":
  {
    "_doc": { "properties": { "mail": { "type": "text", "analyzer":"mail" } } }
  }
}

1 Ответ

0 голосов
/ 20 февраля 2019

Если вы не используете другой токенайзер для своего индексированного текстового поля, он будет использовать стандартный токенизатор, который токенизируется на символе @ [У меня нет источника по этому вопросу, но есть доказательства ниже].

Если вы используете запрос термина, а не запрос на совпадение, то этот точный термин будет искать в инвертированном индексе совпадение эластичного поиска с запросом на термин .

Ваш инвертированный индекс выглядит следующим образом

GET users/_analyze
{
  "text": "firstname.lastname@company.com"
}

{
  "tokens": [
    {
      "token": "firstname.lastname",
      "start_offset": 0,
      "end_offset": 18,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "company.com",
      "start_offset": 19,
      "end_offset": 30,
      "type": "<ALPHANUM>",
      "position": 1
    }
  ]
}

Чтобы решить эту проблему, вы можете указать свой собственный анализатор для почтового поля или . Вы можете использовать запрос на совпадение, который проанализирует ваш искомый текст так же, как он анализирует проиндексированный текст.

GET users/_search
{
  "query": {
    "match": {
      "mail": "firstname.lastname@company.com"
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...