在 Elasticsearch 中搜索关于 phone 个数字的查询

Search Query about phone number in Elasticsearch

我有一个关于 Elasticsearch 的问题

我搜索了 phone 号码。我的计划是,即使我不放置连字符或括号,结果也会显示 phone 数字。

例如, phone 号码是 (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
    }
  ]
}

我需要帮助,即使我输入的数字没有括号和连字符,结果也显示了真实的 phone 数字和信息。

为了高效查询,请确保相应地为文档编制索引。

在我刚刚制作的这个示例中,我确保 phone-numbers 的索引没有连字符和括号。这使我也可以在不使用这些字符的情况下进行查询。

示例:

(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": ""
        }
      }
    }
  }
}

(2) 添加文档到索引:

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

(3) 用原phone号查询:

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 字符过滤器,我们去除了除原始数字以外的所有内容,这意味着每当我们匹配 phone 数字。由于此 pattern_replace 也在查询时应用,我们现在可以在 phone 数字中使用和不使用特殊字符进行搜索并获得匹配项。