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"}}]}}
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2022-1990年 各省碳排放Co2数据集(含数据及参考文献)

碳排放是指人类活动产生的二氧化碳(CO2)等温室气体释放到大气中的过程。通过划分排放源的范围以避免重复计算的思想,由世界资源研究所在关于企业温室气体排放清单编制的指南中首次提出。城市碳排放核算边界界定借鉴该思想,可分为3…

SQL语句

约束具体表现在表的层面,属性具体表现在字段的层面。 1.SQL语句的类型 根据作用进行分类: DDL 数据定义语言 create,drop,alter DML 数据操作语言(对数据本身做操作,增删改查) insert&am…

风电功率预测 | 基于PSO-BP神经网络实现风电功率预测(附matlab完整源码)

风电功率预测 风电功率预测完整代码风电功率预测 基于粒子群优化算法(Particle Swarm Optimization, PSO)的BP神经网络是一种常见的方法,用于实现风电功率预测。下面是一个基于PSO-BP神经网络实现风电功率预测的一般步骤: 数据准备:收集与风电场发电功率相关的数据,包括…

答辩PPT制作成本高?推荐3个aippt工具

这些网站我愿称之为制作答辩PPT的神! 很多快要毕业的同学在做答辩PPT的时候总是感觉毫无思路,一窍不通。但这并不是你们的错,对于平时没接触过相关方面,第一次搞答辩PPT的人来说,这是很正常的一件事。一个好的答辩PPT…

PG pageinspect使用与块空间清理学习

1.创建有时候会报错 ERROR: could not open extension control file "/usr/local/pgsql/share/extension/pageinspect.control": No such file or directory 解决方案: 2.使用 PostgreSQL中,对于每一行数据(称为一个tuple&#…

JavaScript异步编程——10-async异步函数【万字长文,感谢支持】

异步函数(用 async 声明的函数) 异步函数的定义 使用async关键字声明的函数,称之为异步函数。在普通函数前面加上 async 关键字,就成了异步函数。语法举例: // 写法1:函数声明的写法async function foo1(…

Python | Leetcode Python题解之第90题子集II

题目: 题解: class Solution:def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:if not nums:return list()results list()nums.sort()visited [False] * len(nums)self.dfs(nums, results, list(), visited, 0)return resultsdef df…

Pytorch读取自己的数据集

数据集 流程图 导包设置tfs创建datasets.ImageFolder创建torch.utils.data.DataLoader() import time import os from tqdm import tqdm import pandas as pd import numpy as np import torch import torchvision import torch.nn as nn import torch.nn.functional as F im…

数据结构与算法学习笔记七---链栈的表示和实现(C++)

目录 1.链栈的概念 2.链栈的链式存储实现 1.初始化 2.销毁 3.清空栈 4.判断栈空 5.栈长 6.获取栈顶元素 7.入栈 8.出栈 9.遍历 10.完整代码 1.链栈的概念 链栈是指采用链式存储结构实现的栈。通常使用单链表来表示。链栈的示意图如下&…

ACL访问控制列表

ACL概述 为什么会有ACL 因为我们要过滤数据流量,要做访问控制,要保障内网安全 ACL是什么 ACL:访问控制列表是一个包含了多个规则的列表,不同规则通过规则号进行区分每个规则都包含动作条件两部分内容动作分为:允许…

【C#】学习获取程序执行路径,Gemini 帮助分析

一、前言: 在Delphi中,如果想要获取当前执行程序的目录,程序代码如下: ExtractFilePath(ParamStr(0)); 今天在分析一个别人做的C#程序时看到了一段C#代码,意思是获取执行程序所在的文件目录: public stat…

使用 scrapyd 部署 scrapy

1.scrapyd 是什么? Scrapyd 是一个用于部署和运行 Scrapy 爬虫项目的服务器应用程序。它使得你可以通过 HTTP 命令来部署、管理和执行多个 Scrapy 爬虫,非常适合持续集成和生产环境中的爬虫部署。 2.安装scrapyd 并使用 2.1 安装 scrapyd F:\scrapydTes…

智能革新:如何用会话式AI提升您的工作效率?

提升职场竞争力,会话式AI产品助你走在时代前沿 在当今的职场环境中,提高工作效率是每一位人力资源管理者追求的目标。而在效率的背后,往往隐藏着工作方法的正确与否。在众多提升效率的方法中,人工智能技术无疑是一股不可忽视的力量…

汇聚荣科技:拼多多开店没有流量应该怎么办?

拼多多开店没有流量是一个常见的问题,许多新手商家都会遇到这样的困境。那么,如何解决这个问题呢?下面从四个方面进行详细阐述。 一、优化店铺和商品 首先,要确保店铺和商品的质量。店铺要有自己独特的风格和特色,商品要有高质量…

Java | Leetcode Java题解之第90题子集II

题目&#xff1a; 题解&#xff1a; class Solution {List<Integer> t new ArrayList<Integer>();List<List<Integer>> ans new ArrayList<List<Integer>>();public List<List<Integer>> subsetsWithDup(int[] nums) {Arra…

RK3568平台开发系列讲解(SPI篇)spi_dev 驱动分析

🚀返回专栏总目录 文章目录 一、结构体二、API三、spidev驱动分析3.1、init3.2、probe3.3、spidev_write3.4、spidev_read3.5、spidev_open四、spi_register_driver分析五、spi_dev缺点沉淀、分享、成长

docker 部署 prometheus + Grafana +

# prometheus安装 # 1.拉镜像 docker pull prom/prometheus:v2.43.0 # 2.创建配置文件 mkdir /opt/prometheus/data cd /opt/prometheus/ vi prometheus.yml # 3.使用root用户启动 docker run --name prometheus -d -p 9090:9090 -v /opt/prometheus/prometheus.yml:/etc/pro…

前端 performance api使用 —— mark、measure计算vue3页面echarts渲染时间

文章目录 ⭐前言&#x1f496;vue3系列文章 ⭐Performance api计算持续时间&#x1f496; mark用法&#x1f496; measure用法 ⭐计算echarts渲染的持续时间⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享关于 前端 performance api使用 —— mark、measure计…

刷题之最长连续序列

哈希表 class Solution { public:int longestConsecutive(vector<int>& nums) {//set记录并且去重nums中的数unordered_set<int>set;for(int i0;i<nums.size();i){set.insert(nums[i]);}int result0;//遍历所有数for(auto iset.begin();i!set.end();i){//如…

求正方形阴影部分面积

正方形边长6&#xff0c;求阴影部分面积 xy6① vw6② 1/26v1/23x1/263③ 1/26v1/26y1/266④ ③是左下角三角形的面积&#xff0c;④是左上角三角形的面积。 求解方程组得到x2 阴影部分面积1/2*3x3.