首页  >  文章  >  数据库  >  如何在 Elasticsearch 中实现电子邮件地址和电话号码的高效模糊匹配?

如何在 Elasticsearch 中实现电子邮件地址和电话号码的高效模糊匹配?

Susan Sarandon
Susan Sarandon原创
2024-10-31 09:19:01742浏览

How can I achieve efficient fuzzy matching for email addresses and phone numbers within Elasticsearch?

Elasticsearch 模糊电子邮件或电话匹配

问题:

如何实现模糊匹配使用 Elasticsearch 获取电子邮件地址或电话号码?具体来说,如何匹配以“@gmail.com”结尾的所有电子邮件或以“136”开头的所有电话号码?

答案:

利用自定义分析器索引和搜索可以促进电子邮件和电话数据的模糊匹配。

电子邮件模糊匹配:

使用以下设置配置分析器:

  • 索引分析器:index_email_analyzer

    • 标准分词器
    • 小写和 name-ngram 过滤器
    • 最大克数:20
  • 搜索分析器:search_email_analyzer

    • 标准分词器
    • 小写过滤器

电话号码模糊匹配:

使用以下设置配置分析器:

  • 索引分析器:index_phone_analyzer

    • 仅数字过滤器
    • Edge-ngram 分词器(3-15 克)
    • 最小克:1
    • 最大克:15
  • 搜索分析器:search_phone_analyzer

    • 仅数字过滤器
    • 关键字标记器

索引示例:

PUT myindex
{
  "settings": {
    "analysis": {
      "analyzer": {
        "email_url_analyzer": {
          "type": "custom",
          "tokenizer": "uax_url_email",
          "filter": [ "trim" ]
        },
        "index_phone_analyzer": {
          "type": "custom",
          "char_filter": [ "digit_only" ],
          "tokenizer": "digit_edge_ngram_tokenizer",
          "filter": [ "trim" ]
        },
        "search_phone_analyzer": {
          "type": "custom",
          "char_filter": [ "digit_only" ],
          "tokenizer": "keyword",
          "filter": [ "trim" ]
        },
        "index_email_analyzer": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": [ "lowercase", "name_ngram_filter", "trim" ]
        },
        "search_email_analyzer": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": [ "lowercase", "trim" ]
        }
      },
      "char_filter": {
        "digit_only": {
          "type": "pattern_replace",
          "pattern": "\D+",
          "replacement": ""
        }
      },
      "tokenizer": {
        "digit_edge_ngram_tokenizer": {
          "type": "edgeNGram",
          "min_gram": "1",
          "max_gram": "15",
          "token_chars": [ "digit" ]
        }
      },
      "filter": {
        "name_ngram_filter": {
          "type": "ngram",
          "min_gram": "1",
          "max_gram": "20"
        }
      }
    }
  },
  "mappings": {
    "your_type": {
      "properties": {
        "email": {
          "type": "string",
          "analyzer": "index_email_analyzer",
          "search_analyzer": "search_email_analyzer"
        },
        "phone": {
          "type": "string",
          "analyzer": "index_phone_analyzer",
          "search_analyzer": "search_phone_analyzer"
        }
      }
    }
  }
}

搜索查询:

  • 匹配所有以“@gmail.com”结尾的电子邮件:
POST myindex
{ 
    "query": {
        "term": 
            { "email": "@gmail.com" }
    }
}
  • 匹配所有以“136”开头的电话号码:
POST myindex
{ 
    "query": {
        "term": 
            { "phone": "136" }
    }
}

通过利用这些自定义分析器,Elasticsearch 可以有效地对电子邮件地址和电话号码进行模糊匹配。

以上是如何在 Elasticsearch 中实现电子邮件地址和电话号码的高效模糊匹配?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn