elasticsearch如何使用Ngram实现任意位数手机号搜索

 更新时间:2024年05月17日 09:35:38   作者:it噩梦  
Ngram是一种基于统计语言模型的算法,Ngram基本思想是将文本里面的内容按照字节大小进行滑动窗口操作,形成长度是N的字节片段序列,这篇文章主要介绍了elasticsearch使用Ngram实现任意位数手机号搜索,需要的朋友可以参考下

Ngram自定义分词案例

当对keyword类型的字段进行高亮查询时,若值为123asd456,查询sd4,则高亮结果是<em>123asd456<em>。那么,有没有办法只对sd4高亮呢?用一句话来概括问题:明明只想查询ID的一部分,但高亮结果是整个ID串,此时应该怎么办?

实战问题拆解

###定义索引
PUT my_index_0602
{
  "mappings": {
    "properties": {
      "phoneNum": {
        "type": "keyword"
      }
    }
  }
}
####批量写入数据
POST my_index_0602/_bulk
{"index":{"_id":1}}
{"phoneNum":"13511112222"}
{"index":{"_id":2}}
{"phoneNum":"13844248474"}
###执行模糊检索和高亮显示
POST my_index_0602/_search
{
  "highlight": {
    "fields": {
      "phoneNum": {}
    }
  },
  "query": {
    "bool": {
      "should": [
        {
          "wildcard": {
            "phoneNum": "*1111*"
          }
        }
      ]
    }
  }
}

高亮检索结果如下。

也就是说,整个字符串都呈现为高亮状态了,没有达到预期。

检索过程中选择使用wildcard是为了解决子串匹配的问题,wildcard的实现逻辑类似于MySQL的like模糊匹配。传统的text标准分词器,包括中文分词器ik、英文分词器english、standard等都不能解决上述子串匹配问题。

而实际业务需求是这样的:一方面要求输入子串能召回全串;另一方面要求检索的子串实现高亮。对此,只能更换一种分词来实现,即Ngram。

Ngram分词器定义

Ngram分词定义

Ngram是一种基于统计语言模型的算法。Ngram基本思想是将文本里面的内容按照字节大小进行滑动窗口操作,形成长度是N的字节片段序列。此时每一个字节片段称为gram。对所有gram的出现频度进行统计,并且按照事先设定好的阈值进行过滤,形成关键gram列表,也就是这个文本的向量特征空间。列表中的每一种gram就是一个特征向量维度。

该模型基于这样一种假设,第N个词的出现只与前面N-1个词相关,而与其他任何词都不相关,整句的概率就是各个词出现概率的乘积。这些概率可以通过直接从语料中统计N个词同时出现的次数得到。常用的是二元的Bi-Gram(二元语法)和三元的Tri-Gram(三元语法)。

Ngram分词示例

以“你今天吃饭了吗“这一中文句子为例,它的Bi-Gram分词结果如下。

Ngram分词应用场景

场景1:文本压缩、检查拼写错误、加速字符串查找、文献语种识别。

场景2:自然语言处理自动化领域得到新的应用。如自动分类、自动索引、超链的自动生成、文献检索、无分隔符语言文本的切分等。

场景3:自然语言的自动分类功能。针对Elasticsearch检索,Ngram针对无分隔符语言文本的分词(比如手机号检索),可提高检索效率(相较于wildcard检索和正则匹配检索来说)

Ngram分词实战

###定义索引
PUT my_index_0603
{
    "settings":{
        "number_of_shards":1,
        "number_of_replicas":0,
        "index.max_ngram_diff" : 10,
        "analysis":{
            "analyzer":{
                "phoneNo_analyzer":{
                    "tokenizer": "phoneNo_analyzer"
                }
            },
            "tokenizer":{
                "phoneNo_analyzer":{
                    "type": "ngram",
                    "min_gram": 4,
                    "max_gram": 11,
                    "token_chars": [
                        "letter","digit"
                    ]
                }
            }
        }
    },
    "mappings":{
        "dynamic":"strict",
        "properties":{
            "phoneNo":{
                "type":"text",
                "analyzer": "phoneNo_analyzer"
            }
        }
    }
}
####批量写入数据
POST my_index_0603/_bulk
{"index":{"_id":1}}
{"phoneNo":"13511112222"}
{"index":{"_id":2}}
{"phoneNo":"13844248474"}
POST my_index_0603/_analyze
{
  "analyzer": "phoneNo_analyzer",
  "text": "13511112222"
}
POST my_index_0603/_search
{
  "highlight": {
    "fields": {
      "phoneNo": {}
    }
  },
  "query": {
    "bool": {
      "should": [
        {
          "match_phrase": {
            "phoneNo": "1111"
          }
        }
      ]
    }
  }
}

到此这篇关于elasticsearch如何使用Ngram实现任意位数手机号搜索的文章就介绍到这了,更多相关elasticsearch任意位数手机号搜索内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • idea激活码最新获取方法(idea2020激活码汇总)

    idea激活码最新获取方法(idea2020激活码汇总)

    针对idea激活码失效的情况,我们给大家带来最新的idea激活码以及相关激活教程,分享最新idea激活参数等信息。
    2020-02-02
  • Elasticsearches通过坐标位置实现对附近人的搜索

    Elasticsearches通过坐标位置实现对附近人的搜索

    这篇文章主要为大家介绍了Elasticsearches使用坐标位置实现对附近人的搜索,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • SecureCRT的使用超详细教程

    SecureCRT的使用超详细教程

    SecureCRT是Windows下登录UNIX或Linux服务器主机的软件,优点是可以一次创建多个 Tab Page,连接多台远程主机,下面给大家介绍下SecureCRT的使用超详细教程,感兴趣的朋友一起看看吧
    2021-11-11
  • 数据分析2020年全国各省高考成绩分布情况

    数据分析2020年全国各省高考成绩分布情况

    这篇文章主要介绍了数据分析2020年全国各省高考成绩分布情况,顺便可以用这个数据看每个省市的一本线划分比率,还有其他相关的数据,需要的朋友可以参考下
    2020-07-07
  • Windows下使用Gogs搭建Git服务器

    Windows下使用Gogs搭建Git服务器

    这篇文章介绍了使用Gogs搭建Git服务器的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • Iris 环境搭建详细教程(最新版Go&IDEA&IrisV12)

    Iris 环境搭建详细教程(最新版Go&IDEA&IrisV12)

    这篇文章主要介绍了Iris 环境搭建(最新版Go&IDEA&IrisV12),本文通过示例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-11-11
  • 编译和解释的区别是什么

    编译和解释的区别是什么

    最近发现有很多网友都提出一个问题:程序的编译与解释有什么区别?这篇文章就为大家介绍了编译和解释的区别,需要的朋友可以参考下
    2016-12-12
  • 程序员面试如何提高面试通过率

    程序员面试如何提高面试通过率

    这篇文章主要给大家介绍了关于程序员面试如何提高面试通过率的相关资料,通过文中介绍的方法可以提高面试概率,让大家尽快找到好工作,需要的朋友可以参考下
    2007-04-04
  • Git基础之git与SVN版本控制优缺点区别分析

    Git基础之git与SVN版本控制优缺点区别分析

    这篇文章主要为大家介绍了Git基础之git与SVN优缺点及区别分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • elasticsearch如何使用Ngram实现任意位数手机号搜索

    elasticsearch如何使用Ngram实现任意位数手机号搜索

    Ngram是一种基于统计语言模型的算法,Ngram基本思想是将文本里面的内容按照字节大小进行滑动窗口操作,形成长度是N的字节片段序列,这篇文章主要介绍了elasticsearch使用Ngram实现任意位数手机号搜索,需要的朋友可以参考下
    2024-05-05

最新评论