Поисковый запрос о номере телефона в Elasticsearch - PullRequest
0 голосов
/ 24 февраля 2020

У меня вопрос по Elasticsearch

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

Например, номер телефона (213)234-1111, а поисковый запрос -

GET _msearch
{ "query": {"fuzzy": { "tel": {"value": "2132341111", "max_expansions" : 100}}}}

результат равен

{
  "took" : 0,
  "responses" : [
    {
      "took" : 0,
      "timed_out" : false,
      "_shards" : {
        "total" : 1,
        "successful" : 1,
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : {
        "total" : {
          "value" : 0,
          "relation" : "eq"
        },
        "max_score" : null,
        "hits" : [ ]
      },
      "status" : 200
    }
  ]
}

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

1 Ответ

0 голосов
/ 24 февраля 2020

Чтобы обеспечить эффективный запрос, убедитесь, что документы проиндексированы соответствующим образом.

В этом примере, который я только что сделал, я проверяю, чтобы номера телефонов были проиндексированы без дефисов и скобок. Это позволяет мне выполнять запросы без использования этих символов.

Пример:

(1) Создать индекс:

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "default": {
          "tokenizer": "standard",
          "char_filter": [
            "my_char_filter"
          ]
        }
      },
      "char_filter": {
        "my_char_filter": {
          "type": "pattern_replace",
          "pattern": "\\((\\d+)\\)(\\d+)-(\\d+)",
          "replacement": "$1$2$3"
        }
      }
    }
  }
}

(2 ) Добавить документ в указатель:

POST my_index/doc
{
  "Description": "My phone number is (213)234-1111"
}

(3) Запрос с исходным номером телефона:

GET my_index/_search
{
  "query": {
    "match": {
      "Description": "(213)234-1111"
    }
  }
}

(1 result)

(4) Запрос без специальных символов:

GET my_index/_search
{
  "query": {
    "match": {
      "Description": "2132341111"
    }
  }
}

(1 result)

Так как же это работало?

Используя фильтр pattern_replace char, мы убираем все, кроме необработанных чисел, что означает, что "(213 ) 234-1111 "фактически сохраняется как" 2132341111 "всякий раз, когда мы сопоставляем номер телефона. Поскольку это pattern_replace также применяется во время запроса, теперь мы можем выполнять поиск как с использованием специальных символов в номере телефона, так и без них, и получить совпадение.

...