Elasticsearch实现内容精确匹配查询
一、 问题描述
- 需要搜索的内容为:【飞科剃须刀】
- 实际搜索,需要满足的条件:
a.检索关键词“飞科”,“剃须”、“刀”,都能搜出这篇文档。
b.干扰搜索“水果刀”,文档不要被检索出来。
c.单个字拆分“剃”、“须”太多干扰文档不要被检索出来。
d.待检索的词“科剃”、“科剃须”不在词典中,但只要在原文中出现,都要检索到。
e.检索关键词“飞科剃须”,能搜出这篇文档
f.检索速度要快,不影响性能。 - 分词测试:
- Standard分词器
GET /my_index/_analyze
{"text":"飞科剃须刀","analyzer":"standard"
}
分词结果:飞、科、剃、须、刀
- ik_max_word分词器
GET /my_index/_analyze
{"text":"飞科剃须刀","analyzer":"ik_max_word"
}
分词结果:飞、科、剃须刀、剃须、刀
- ik_smart分词器
GET /my_index/_analyze
{"text":"飞科剃须刀","analyzer":"ik_smart"
}
分词结果:飞、科、剃须刀
二、问题分析
- 针对要求a,可以采用全文检索(match、match_phrase)。
- match查询实现精确匹配
GET /my_index/_search
{"query":{"match":{"qss":{"query":"飞科" //分别尝试“剃须”、“刀”,都能检索到包含“飞科剃须刀”的文档}}}
}
- match_phrase查询实现完全匹配
文档同时满足下面两个条件才会被搜索到:
(1)分词后所有词项都要出现在该字段中
(2)字段中的词项顺序要一致
GET my_index/_search
{"query": {"match_phrase": {"qss": "飞科" //分别尝试“剃须”、“刀”,都能检索到包含“飞科剃须刀”的文档}}
}
- 针对要求b,match查询检索范围太大、干扰太多,排除;ik_smart分词器没有“剃须”词项,排除match查询后,与 match_phrase 结合使用,依然检索不到,故排除。
- 针对要求c,standard 分词器会出现非常多冗余数据,排除。
- 针对要求d,ik_max_word 有些词项不包含,排除。
- 针对要求e,match_phrase 查询不到,排除。
- 针对要求f,wildcard 模糊查询影响性能,排除。
三、为什么会检索不到?
- 分词原因/词典未收录原因。
在上文问题d中,由于分词器中不包含“科剃”等词项,所以检索不到。 - postition位置不一致。
在上文问题e中,由于分词器分词器对“飞科剃须”和“飞科剃须刀”分词的postition位置不一致,所以检索不到。
飞科剃须 | 飞科剃须刀 | ||
---|---|---|---|
token | position | token | position |
飞 | 0 | 飞 | 0 |
科 | 1 | 科 | 1 |
剃须 | 2 | 剃须刀 | 2 |
剃须 | 3 | ||
刀 | 4 |
四、解决方案
1. match_phrase_prefix结合slop的方案
GET my_index/_search
{"query": {"match_phrase_prefix": {"qss": {“query”:"飞科剃须",“slop”:1 //指定相邻词之间允许相隔多远。设置为0,则为完全匹配。}}}
}
能应对一部分业务。但是分析发现:slop设置不论多大、多小,都可能会引入噪音数据,导致结果不准确。
2. match_phrase结合match should关联匹配。
依然会引入噪音数据。
3. 终极方案:逐个字分词和ik分词结合的方式。
- mapping设置:
PUT mx_index{"mappings": {"_doc": {"properties": {"qss": {"type": "text","analyzer": "ik_max_word","fields": {"standard": {"type": "text","analyzer": "standard"},"keyword": {"type": "keyword","ignore_above": 256}}}}}}
}
- 搜索:
GET mx_index/_search
{"query": {"bool": {"should": [{"match_phrase": {"qss": "科剃"}},{"match_phrase": {"qss.standard": "科剃"}}]}}
}
Elasticsearch实现内容精确匹配查询相关推荐
- Elasticsearch:在搜索引擎中如何实现完全匹配(内容精确匹配)查询
本文地址: http://blog.csdn.net/hereiskxm/article/details/47979013 在有搜索引擎之前,我们查文档常使用顺序匹配.我们需要在文档中顺序扫描,找到完 ...
- ElasticSearch系列 - SpringBoot整合ES:短语匹配查询 match_phrase
文章目录 1. ElasticSearch match_phrase查询是什么?它与match查询有什么区别? 2. ElasticSearch match_phrase 查询的语法是什么? 3. E ...
- element中组件el-autocomplete远程搜索之精确匹配和模糊匹配
在实际开发项目中总是会遇到很多难以预测的情况, 比如el-autocomplete的远程搜索时,经常会从服务器发起搜索,然后把对象带出的相关值赋给其他标签元素,一般模糊匹配没问题,但是精确匹配会存在一 ...
- 【elasticsearch】elasticsearch 精确匹配 与 全文搜索
本文为博主九师兄(QQ:541711153 欢迎来探讨技术)原创文章,未经允许博主不允许转载. 可以加我问问题,免费解答,有问题可以先私聊我,本人每天都在线,会帮助需要的人. 但是本博主因为某些原因, ...
- 49.(leaflet篇)leaflet实现反向匹配查询(ElasticSearch技术实现)(输入坐标查询距离最近的地址信息)
地图之家总目录(订阅之前请先查看该博客) 地图之家:cesium+leaflet+echart+地图数据+地图工具等相关内容的介绍 关联博客: 4.(后端技术篇java)ElasticSearch实现 ...
- ElasticSearch查询 第四篇:匹配查询(Match)
<ElasticSearch查询>目录导航: ElasticSearch查询 第一篇:搜索API ElasticSearch查询 第二篇:文档更新 ElasticSearch查询 第三篇: ...
- Elasticsearch 字段可以模糊查询也可完全匹配查询(实例)
需求: 比如创建用户, 需要判断name是否重复后, 没有重复才插入数据, 创建好之后又需要模糊查询用户昵称name. 这时候name字段类型就需要具备分词并且可完全匹配搜索. 直接上代码: 创建映 ...
- ElasticSearch前缀匹配查询(英文检索)
#前缀匹配查询 #前缀匹配查询 GET /lib3/user/_search {"query": {"match_phrase_prefix": {" ...
- (六)ElasticSearch 6.1.1聚合查询
1 普通类型 1.1 基本操作 1.1.1 导入实战数据 数据字段如下: 字段 类型 作用 price long 汽车售价 color text 汽车颜色 make text 汽车品牌 sold da ...
- ElasticSearch 6.3版本(ES)查询人名关键字不拆词查询
ElasticSearch 6.3版本(ES)查询关键字不拆词查询:类似mysql 的 like 语句. mysql的sql语法类似如下,采用大量like和locate语法,进行模糊查询,导致查询一个 ...
最新文章
- MySQL错误代码:MySQL Workbench中UPDATE期间的1175错误代码
- 5分钟解析Facebook最新推荐算法
- 阿里云云市场双11战报:30分钟破100万,单品销量暴涨300倍!
- 从DevOps到Cloud Native,应用上云姿势全解锁
- 上海市消保委:春节长假期间 共受理消费者投诉4600件
- objectC时间用法
- 谁说EMC、IBM不能替换,还你一个存储虚拟化的真相!
- 3.9 拆解小红书爆文,流量密码原来是这些【玩赚小红书】
- ScrollMagic结合TweenMax的Demo
- 云效首发应用交付和项目协作新品,助力企业DevOps到BizDevOps
- pyqt5 时间控件设为当前日期
- 单元测试和E2E测试
- ubuntu16.04成功安装 百度网盘 by deepin-wine-for-ubuntu
- 【代码】HTML网站维护更新简易单页源码
- python 资源文件_如何用 Python 正确读取资源文件
- Part2:S3C2440裸跑一个LED程序
- 陶瓷工厂的进销存管理系统的设计与实现
- Hadoop之机架感知
- 一只前端程序媛的絮絮叨叨
- 一文了解,如何在VMware指定磁盘分区 扩容
热门文章
- IIS 中 HTTPS 自签名证书 的使用
- python新版个人所得税代码_个人所得税计算代码
- PR模板 有趣的波普艺术网络自媒体宣传PR视频模板
- Error: ImageIO: PNG invalid PNG file: iDOT doesn't point to valid IDAT chunk 解决
- Ubuntu 建立局域网
- 介绍几款AI开源平台
- 【Java程序员面试】直接被SpringBoot干趴?NONONO!拒绝做冤大头!!
- Oracle数据库 1653错误
- 基于STM32单片机设计的红外测温仪(带人脸检测)
- iOS开发IPhone以及iPad尺寸汇总