首页 >数据库 >mysql教程 >如何优化Elasticsearch中电子邮件和电话号码的模糊匹配?

如何优化Elasticsearch中电子邮件和电话号码的模糊匹配?

Patricia Arquette
Patricia Arquette原创
2024-10-30 15:51:02486浏览

How to Optimize Fuzzy Matching of Emails and Phone Numbers in Elasticsearch?

Elasticsearch 中模糊匹配电子邮件和电话号码

Elasticsearch 提供灵活的方法来模糊匹配数据,包括电子邮件和电话号码。本文探讨了如何使用自定义分析器和标记过滤器来优化此类查询的性能。

用于模糊匹配的自定义分析器

要有效地模糊匹配电子邮件和电话号码,需要建议在 Elasticsearch 中创建自定义分析器。这些分析器由一个准备分析输入数据的分词器和一组执行特定转换的过滤器组成。

电子邮件分析器

index_email_analyzer 分析器利用标准分词器来分解输入。然后,它应用 lowercase、name_ngram_filter 和 trim 等过滤器将电子邮件转换为小写,生成不同长度的 ngram(3 到 20 个字符),并删除空格。

search_email_analyzer 类似地使用标准分词器,但仅使用小写和修剪过滤器。这为搜索准备了输入,其中不需要 ngram 过滤器。

电话分析器

对于电话号码,index_phone_analyzer 利用 digital_edge_ngram_tokenizer 生成不同长度的 ngram以数字开头的(1 到 15 个字符)。这允许匹配电话号码的任何前缀。 digital_only 字符过滤器会删除非数字字符,以确保仅分析数字值。

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”结尾的电子邮件或以“136”开头的电话号码,您可以发出如下查询:

POST myindex
{
  "query": {
    "term": {
      "email": "@gmail.com"
    }
  }
}

POST myindex
{
  "query": {
    "term": {
      "phone": "136"
    }
  }
}

这些查询将利用自定义分析器生成模糊所需的 ngram匹配。

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

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