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

文章目录

  • Ngram自定义分词案例
    • 实战问题拆解
  • Ngram分词器定义
    • Ngram分词定义
    • Ngram分词示例
    • Ngram分词应用场景
  • 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"
          }
        }
      ]
    }
  }
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/627112.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

欧洲风景(地理)

1.尼斯湖 尼斯湖亦译内斯湖,位于英国苏格兰高原北部的大峡谷中,湖长39公里,宽2.4公里。面积并不大,却很深。传说这儿住着一只水怪,因此吸引了大量游客。 2.伦敦塔桥 伦敦塔桥是从英国伦敦泰晤士河口算起的第一座桥(泰…

类图及类的关系

类图(Class Diagram)是UML(Unified Modeling Language,统一建模语言)中的一种图,用于描述系统中类的静态结构,包括类的属性、方法以及类之间的关系。 一、类 类(Class)…

Elasticsearch - HTTP

文章目录 安装基本语法索引创建索引查看索引删除索引 文档创建文档更新文档匹配查询多条件查询聚合查询映射 安装 https://www.elastic.co/downloads/past-releases/elasticsearch-7-17-0 下载完成启动bin/elasticsearch服务,可以在Postman调试各种请求。 基本语法…

数据库系统概论(超详解!!!)第八节 数据库设计

1.数据库设计概述 数据库设计是指对于一个给定的应用环境,构造(设计)优化的数据库逻辑模式和物理结构,并据此建立数据库及其应用系统,使之能够有效地存储和管理数据,满足各种用户的应用需求,包…

【Qt问题】windeployqt如何提取Qt依赖库

往期回顾 【Qt问题】Qt Creator 如何链接第三方库-CSDN博客 【Qt问题】Qt 如何带参数启动外部进程-CSDN博客 【Qt问题】VS2019 Qt win32项目如何添加x64编译方式-CSDN博客 【Qt问题】windeployqt如何提取Qt依赖库 考虑这个问题主要是:当我们的程序运行好之后&#…

Nginx生产环境最佳实践之配置灰度环境

你好呀,我是赵兴晨,文科程序员。 下面的内容可以说是干货满满建议先收藏再慢慢细品。 今天,我想与大家深入探讨一个我们日常工作中不可或缺的话题——灰度环境。你是否在工作中使用过灰度环境?如果是,你的使用体验如…

数据结构与算法===优先队列

文章目录 前言一、优先队列二、应用场景三、代码实现总结 前言 之前写过很多数据结构与算法相关的了,今天看一个新的数据结构,优先队列。优先队列类似队列,却又优先于队列,是堆实现的。接下来详细看看。 一、优先队列 优先队列一…

STL库简介

一、STL库的概念 STL:是C标准库的重要追组成部分,不仅是一个可以复用的组件库,而且还是一个包含了数据结构和算法的软件框架。 二、STL的版本 原始版本 Alexander Stepanov、 Meng Lee 在惠普实验室完成的原始版本, 是一个开源…

C语言错题本之<结构体>

以下叙述中正确的是________. A)预处理命令行必须位于源文件的开头 B)在源文件的一行上可以有多条预处理命令 C)宏名必须用大写字母表示 D)宏替换不占用程序的运行时间 答案:D 解析: A:在C、C等编程语言中,预处理指令(…

【PB案例学习笔记】-02 目录浏览器

写在前面 这是PB案例学习笔记系列文章的第二篇,该系列文章适合具有一定PB基础的读者, 通过一个个由浅入深的编程实战案例学习,提高编程技巧,以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码,小凡都上…

RS编码和卷积码总结

RS编码 简要介绍RS编码及其原理 1. RS编码简介 Reed-Solomon编码(RS编码)是一种强大的纠错码,广泛应用于数据存储和传输中。RS编码由Irving S. Reed和Gustave Solomon于1960年提出,属于BCH码的一种,是基于有限域&am…

杨校老师项目之基于单片机STC89C52的智能环境监测系统【嵌入式】

获取全套资料: 有偿获取:mryang511688 技术:C语言、单片机等 摘要: 此设计可分为三个主要部分。此中的温度和湿度的检测功能,通过操纵单总线型温湿度传感器DHT11以数字形式显示,实现了切确测得温湿度的功能…

五分钟“手撕”时间复杂度与空间复杂度

目录 一、算法效率 什么是算法 如何衡量一个算法的好坏 算法效率 二、时间复杂度 时间复杂度的概念 大O的渐进表示法 推导大O阶方法 常见时间复杂度计算举例 三、空间复杂度 常见时间复杂度计算举例 一、算法效率 什么是算法 算法(Algorithm):就是定…

蓝桥杯单片机之模块代码《串口发数据》

过往历程 历程1:秒表 历程2:按键显示时钟 历程3:列矩阵按键显示时钟 历程4:行矩阵按键显示时钟 历程5:新DS1302 历程6:小数点精确后两位ds18b20 历程7:35定时器测量频率 历程8&#xff…

队列的讲解

队列的概念 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头 一端进另一端出 也就是可以做到,先…

[BJDCTF 2020]easy_md5、[HNCTF 2022 Week1]Interesting_include、[GDOUCTF 2023]泄露的伪装

目录 [BJDCTF 2020]easy_md5 ffifdyop [SWPUCTF 2021 新生赛]crypto8 [HNCTF 2022 Week1]Interesting_include php://filter协议 [GDOUCTF 2023]泄露的伪装 [BJDCTF 2020]easy_md5 尝试输入一个1,发现输入的内容会通过get传递但是没有其他回显 观察一下响应…

数据结构与算法-排序算法3-插入排序

目录 1.插入排序: 1.介绍: 2.动态图解 3.举例 4.小结插入排序规则 5.插入排序代码 6.运行时间 代码: 运行结果: 1.插入排序: 1.介绍: 数组中n个元素,把这n个待排序元素看成一个有序序…

深度学习:光流估计新范式

0.概述 在这篇文章中,我们将讨论两种基于深度学习的光流运动估计方法。FlowNet是第一个用于计算光流的CNN方法,RAFT是当前最先进的估计光流的方法。我们还将看到如何使用作者提供的经过训练的模型来使用PyTorch对新数据进行推断。 1. FlowNet FlowNet…

读人工智能时代与人类未来笔记03_演变

1. 演变 1.1. 每个社会都找到了属于自己的一套适应世界的方法 1.1.1. 适应的核心,是有关人类心智与现实之间关系的概念 1.1.2. 人类认识周围环境的能力 1.1.2.1. 这种能力通过知识获得,同时也受到知识…

CentOS 安装 SeaweedFS

1. SeaweedFS 介绍 SeaweedFS 是一个简单且高度可扩展的分布式文件系统。有两个目标: to store billions of files! (存储数十亿个文件!)to serve the files fast! (快速提供文件!) Seaweedfs的中心节点(center master&#xff09…