如何通过Elasticsearch模糊匹配电子邮件或电话?

2024-06-20

我想通过 Elasticsearch 对电子邮件或电话进行模糊匹配。例如:

匹配所有以以下结尾的电子邮件@gmail.com

or

匹配所有电话开头136.

我知道我可以使用通配符,

{
 "query": {
    "wildcard" : {
      "email": "*gmail.com"
    }
  }
}

但性能很差。我尝试使用正则表达式:

{"query": {"regexp": {"email": {"value": "*163\.com*"} } } }

但不起作用。

有更好的制作方法吗?

卷曲 -XGET 本地主机:9200/user_data

{
    "user_data": {
        "aliases": {},
        "mappings": {
            "user_data": {
                "properties": {
                    "address": {
                        "type": "string"
                    },
                    "age": {
                        "type": "long"
                    },
                    "comment": {
                        "type": "string"
                    },
                    "created_on": {
                        "type": "date",
                        "format": "dateOptionalTime"
                    },
                    "custom": {
                        "properties": {
                            "key": {
                                "type": "string"
                            },
                            "value": {
                                "type": "string"
                            }
                        }
                    },
                    "gender": {
                        "type": "string"
                    },
                    "name": {
                        "type": "string"
                    },
                    "qq": {
                        "type": "string"
                    },
                    "tel": {
                        "type": "string"
                    },
                    "updated_on": {
                        "type": "date",
                        "format": "dateOptionalTime"
                    },
                }
            }
        },
        "settings": {
            "index": {
                "creation_date": "1458832279465",
                "uuid": "Fbmthc3lR0ya51zCnWidYg",
                "number_of_replicas": "1",
                "number_of_shards": "5",
                "version": {
                    "created": "1070299"
                }
            }
        },
        "warmers": {}
    }
}

映射:

{
  "settings": {
    "analysis": {
      "analyzer": {
        "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": "3",
          "max_gram": "15",
          "token_chars": [ "digit" ]
        }
      },
      "filter": {
        "name_ngram_filter": {
          "type": "ngram",
          "min_gram": "3",
          "max_gram": "20"
        }
      }
    }
  },
  "mappings" : {
    "user_data" : {
      "properties" : {
        "name" : {
          "type" : "string",
          "analyzer" : "ik"
        },
        "age" : {
          "type" : "integer"
        },
        "gender": {
          "type" : "string"
        },
        "qq" : {
          "type" : "string"
        },
        "email" : {
          "type" : "string",
          "analyzer": "index_email_analyzer",
          "search_analyzer": "search_email_analyzer"
        },
        "tel" : {
          "type" : "string",
          "analyzer": "index_phone_analyzer",
          "search_analyzer": "search_phone_analyzer"
        },
        "address" : {
          "type": "string",
          "analyzer" : "ik"
        },
        "comment" : {
          "type" : "string",
          "analyzer" : "ik"
        },
        "created_on" : {
          "type" : "date",
          "format" : "dateOptionalTime"
        },
        "updated_on" : {
          "type" : "date",
          "format" : "dateOptionalTime"
        },
        "custom": {
          "type" : "nested",
          "properties" : {
            "key" : {
              "type" : "string"
            },
            "value" : {
              "type" : "string"
            }
          }
        }
      }
    }
  }
}

执行此操作的一个简单方法是创建一个自定义分析器,该分析器使用n 元词法过滤器 https://www.elastic.co/guide/en/elasticsearch/reference/2.2/analysis-ngram-tokenfilter.html对于电子邮件(=> 见下文index_email_analyzer and search_email_analyzer + email_url_analyzer用于精确的电子邮件匹配)和边缘-ngram 标记过滤器 https://www.elastic.co/guide/en/elasticsearch/reference/2.2/analysis-edgengram-tokenfilter.html对于手机(=> 见下文index_phone_analyzer and 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"
        }
      }
    }
  }
}

现在,让我们一点一点地剖析它。

For the phone字段,其想法是将电话值索引为index_phone_analyzer,它使用 Edge-ngram 分词器来索引电话号码的所有前缀。所以如果您的电话号码是1362435647,将产生以下代币:1, 13, 136, 1362, 13624, 136243, 1362435, 13624356, 13624356, 136243564, 1362435647.

然后在搜索时我们使用另一个分析器search_phone_analyzer它将简单地获取输入数字(例如136)并将其与phone字段使用一个简单的match or term query:

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

For the email字段,我们以类似的方式进行,我们用index_email_analyzer,它使用 ngram 令牌过滤器,它将生成可从电子邮件值中获取的不同长度(1 到 20 个字符之间)的所有可能令牌。例如:[email protected] /cdn-cgi/l/email-protection将被标记为j, jo, joh, ..., gmail.com, ..., [email protected] /cdn-cgi/l/email-protection.

然后在搜索时,我们将使用另一个名为search_email_analyzer它将获取输入并尝试将其与索引标记进行匹配。

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

The email_url_analyzer本示例中未使用分析器,但我已将其包含在内,以防您需要匹配确切的电子邮件值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过Elasticsearch模糊匹配电子邮件或电话? 的相关文章

随机推荐

  • 创建一个从用户输入开始的 java gui 倒计时器

    这是github link https github com syedsadman16 CountdownTimer 所以我试图创建一个应用程序并将其分为 3 个部分 其中之一是创建一个计时器 该计时器有两个字段 一个用于输入分钟 一个用于
  • 太多的导入正在垃圾邮件我的 Java 代码

    在我的项目中我有一个shapes包含我为图形程序设计的形状的包 例如 长方形 and Circle 我还有一两个同名的软件包java awt类 现在 由于我不想重命名代码库中的每个类 为了显示我的源文件 当我声明一个新的矩形时 我需要执行以
  • 在玩笑中运行普通转换后如何转换模块

    用笑话测试 React 组件 其中一些组件使用 OpenLayers ol 软件包 v5 2 0 在 ol 包 v4 中 我应用了 transformIgnorePatterns 来转换 ol 包 jest transformIgnoreP
  • Swift SpriteKit edgeLoopF​​romRect 问题

    下面的代码可以识别底部和顶部边缘场景和球按预期弹开 但是 那左边缘和右边缘现场的情况一直被破坏 如果施加足够的力 球会离开屏幕 然后最终返回 就好像场景的边缘超出了 iPhone 模拟器窗口的边缘 import SpriteKit clas
  • 如何使用 javascript 或 jquery 生成 CSS 路径?

    关于如何生成元素的 CSS 路径有什么建议吗 CSS 路径是识别特定元素所需的 css 选择器的路径 例如 如果我的 html 是 div div class bar ul li 1 li li 2 li li span class sel
  • 如何在java中获得整数的0填充二进制表示?

    例如 对于1 2 128 256输出可以是 16 位 0000000000000001 0000000000000010 0000000010000000 0000000100000000 I tried String format 16s
  • 如何在android中实现触摸平滑图像橡皮擦?

    我已经从 API 演示中看到了finturePaint java 我想实现触摸平滑橡皮擦 通过在android中触摸移动来擦除部分图像 FingerPaint 告诉我要实现这个 mPaint setXfermode new PorterDu
  • 删除行导致锁超时

    当我尝试从表中删除行时 我不断收到这些错误 这里的特殊情况是我可能同时运行5个进程 该表本身是一个 Innodb 表 约有 450 万行 我的 WHERE 子句中使用的列没有索引 其他指数按预期运行 这是在事务中完成的 首先删除记录 然后插
  • 使用 Dapper 插入时出现 NullReferenceException

    当我运行以下代码时 我收到一个 NullReferenceException 异常 指出对象引用未设置到该对象的实例 我已经使用不太复杂但格式相同的对象成功插入了 dapper 所以我不确定我做错了什么 public void Foo IE
  • jquery中文本区域自动调整大小

    我怎样才能做一个
  • C++20:非类型模板参数中的非捕获 lambda

    C 20 是否允许将非捕获 lambda 衰减为函数指针作为非类型模板参数直接传递 如果是这样 正确的语法是什么 我在不同版本的 clang 和 gcc 中尝试了以下代码 std c 2a include
  • Mercurial 和 SVN 并排在同一工作目录中?

    我们的环境目前使用SVN 我想更频繁地提交 但我不想破坏任何主要分支 就我个人而言 我比 SVN 更喜欢 Mercurial 如果我在 SVN 工作副本中初始化一个存储库 如果我只是定期提交到 Mercurial 存储库并将工作修订提交到
  • 如何正确设置Rocks DB上的TTL?

    我正在尝试将 Rocks DB 与 TTL 结合使用 我初始化rocks db的方式如下 options setCreateIfMissing true setWriteBufferSize 8 SizeUnit KB setMaxWrit
  • 测试 AngularJs 的 $http.defaults.headers.common 是否设置了特定标头

    所以我对 JavaScript 和 AngularJS 的世界还是个新手 因此我的代码还没有达到应有的水平 但它正在改进 尽管如此 我开始学习并实现一个带有 REST 后端的简单登录页面 提交登录表单后 将返回一个身份验证令牌并将其设置为默
  • iPhone 上的双精度与浮动

    我刚刚听说 iPhone 本身无法进行双倍操作 从而使它们比常规浮动慢得多 这是真的 证据 我对这个问题很感兴趣 因为我的程序需要高精度计算 而且我将不得不在速度上妥协 iPhone 可以在硬件中执行单精度和双精度算术 在 1176 原始
  • python 中的对数 y 轴 bin

    我正在尝试创建数据列的直方图并以对数方式绘制它 y axis 并且我不确定为什么以下代码不起作用 import numpy as np import matplotlib pyplot as plt data np loadtxt foo
  • 检测 iPhone 是否在运行时运行调试/分发构建

    是否可以在运行时检测正在运行的应用程序是否是通过调试或分发进行编译的 在项目信息中 对于调试配置 添加 DEBUG 预处理器宏 在 GCC 4 2 预处理部分 在代码中 如果您想要包含或不包含某些代码用于调试版本 则可以使用 ifdef 来
  • Visual Studio Code 不显示 Python 的输出

    我对 Python 非常陌生 刚刚开始了 Sendtex 的 Python 3 基础知识 课程 链接 https www youtube com channel UCfzlCWGWYyIQ0aLC5w48gBQ https www yout
  • 如何登录ec2机器?

    我获得了 EC2 机器的一些登录信息 基本上是 ec2 X X X compute X amazonaws com 加上用户名和密码 如何访问机器 我尝试过 ssh ssh email protected cdn cgi l email p
  • 如何通过Elasticsearch模糊匹配电子邮件或电话?

    我想通过 Elasticsearch 对电子邮件或电话进行模糊匹配 例如 匹配所有以以下结尾的电子邮件 gmail com or 匹配所有电话开头136 我知道我可以使用通配符 query wildcard email gmail com