【问题标题】:Search Query about phone number in ElasticsearchElasticsearch中关于电话号码的搜索查询
【发布时间】:2020-02-24 19:21:09
【问题描述】:

我有一个关于 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
    }
  ]
}

我需要一个帮助,即使我没有括号和连字符的号码,结果显示真实的电话号码和信息。

【问题讨论】:

    标签: elasticsearch phone-number elasticsearch-query


    【解决方案1】:

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

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

    示例:

    (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 字符过滤器,我们去除了除原始数字之外的所有内容,这意味着每当我们匹配电话号码时,“(213)234-1111”实际上存储为“2132341111”。由于这个 pattern_replace 也适用于查询时,我们现在可以在电话号码中搜索有和没有特殊字符并获得匹配项。

    【讨论】:

    • 感谢您的精彩回答。我对此有疑问。在我公司,2132341111实际上存储为(213)234-1111。我看不到公司索引的确切方式,但我的同事说该号码存储为 (213)234-1111。我的团队和部门没有关于索引或编辑它的访问或权限。那么,有没有办法在没有连字符或括号的情况下搜索数字?
    • 如果您无法更改索引,我认为您最简单的做法是改为在客户端上完成工作。编写一个正则表达式将任何 10 个数字范围转换为 (nnn)nnn-nnnn 并在 should 子句中搜索这两种变体。如果您关心性能,则应始终尝试实现直接匹配。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    • 1970-01-01
    相关资源
    最近更新 更多