match_phrase搜不出来,怎么办?
1、问题抛出
某个词组在Elasitcsearch中的某个document中存在,就一定通过某种匹配方式把它搜出来。
举例:
title=公路局正在治理解放大道路面积水问题。
输入关键词:道路,能否搜索到这个document呢?
实际应用中可能需要:
1)检索关键词”理解”、”解放”、”道路”、“理解放大”,都能搜出这篇文档。
2)单个的字拆分“治”、“水”太多干扰,不要被检索出来。
3)待检索的词不在词典中,也必须要查到。
4)待检索词只要在原文title或content中出现,都要检索到。
5)检索要快,要摒弃wildcard模糊匹配性能问题。
2、问题分析
常用的stand标准分词,可以满足要求1)、3)、4)、5)。
标准分词器是什么鬼?
标准分析仪是默认分析仪,如果没有指定,则默认使用该分词器。 它提供了基于语法的标记,并且适用于大多数语言。
对于中文字符串,会逐个汉字分词。
标准分词器的结果如下:
GET /ik_index/_analyze?analyzer=standard
{
"text":"公路局正在治理解放大道路面积水问题"
}
公,路,局,正,在,治,理,解,放,大,道,路,面,积,水,问,题
但,会出现冗余数据非常多。
针对要求2),排除match检索,排除stand分词。
针对要求5),排除wildcard模糊检索。
针对要求3)、4),新词也要被检索到比如:“声临其境”、“孙大剩”等也要能被搜索到。
针对要求1),采用match_phrase貌似靠谱些。
3、小试牛刀
先使用IK-max-word细粒度分词器,结合match_phrase试一试?
步骤1:定义索引和Mapping
PUT ik_index
{"mappings":{"ik_type":{"properties":{"title":{"type":"text","fields":{"ik_my_max":{"type":"text","analyzer":"ik_max_word"},"ik_my_smart":{"type":"text","analyzer":"ik_smart"},"keyword":{"type":"keyword","ignore_above":256}}}}}}}
这里,为了验证分词,同时使用了ik_smart和ik_max两种分词。
实际开发中不需要,因为:两种分词共存,会导致导入数据创建索引的时候,索引会非常大,对磁盘和检索性能都会有影响。
步骤2:插入文档
POST ik_index/ik_type/3
{"title":"公路局正在治理解放大道路面积水问题"
}
步骤3:实施检索
POST ik_index/ik_type/_search
{"profile":"true","query":{"match_phrase":{"title.ik_my_max":"道路"}}
}
搜索结果如下:
无结果返回。
{"took": 1,"timed_out": false,"_shards": {"total": 5,"successful": 5,"failed": 0},"hits": {"total": 0,"max_score": null,"hits": []}
}
为什么使用了max_word细粒度分词,使用了match_pharse检索,为什么没有结果。
分析一下:
细粒度ik_max_word分词结果为:
GET /ik_index/_analyze?analyzer=ik_max_word
{
"text":"公路局正在治理解放大道路面积水问题"
}
公路局 ,公路 ,路局 ,路 ,局正 ,正在 ,正 ,治理 ,治 ,理解 ,
理 ,解放 ,解 ,放大 ,大道 ,大 ,道路 ,道 ,路面 ,路 ,
面积 ,面 ,积水 ,积 ,水 ,问题
以上方式,除了可以返回分词结果外,还能返回词所在的位置position。
构建索引的时候,道路被拆分为:道路:16,道:17,路:19。(注意中间加了18:路面)
{"token": "路面","start_offset": 11,"end_offset": 13,"type": "CN_WORD","position": 18}
而检索的时候,而道路拆分为: 道路0 道1 路2
match_phrase检索时候,文档必须同时满足以下两个条件,才能被检索到:
1)分词后所有词项都出现在该字段中;
2)字段中的词项顺序要一致。
位置信息可以被存储在倒排索引中,因此 match_phrase 查询这类对词语位置敏感的查询, 就可以利用位置信息去匹配包含所有查询词项,且各词项顺序也与我们搜索指定一致的文档,中间不夹杂其他词项。
为了验证如上的解释,新增一篇“道路”相关的title,检验一下:
POST ik_index/ik_type/4
{"title":"党员干部坚持走马克思主义道路的重要性"
}
注意:这时,搜索道路是可以匹配到的。
"hits": {"total": 1,"max_score": 1.9684901,"hits": [{"_index": "ik_index","_type": "ik_type","_id": "4","_score": 1.9684901,"_source": {"title": "党员干部坚持走马克思主义道路的重要性"}}]},
细粒度ik_max_word分词结果为:
党员干部, 党员, 干部, 坚持走, 坚持, 坚, 持, 走马, 马克思主义, 马克思,
马克, 马, 克, 思, 主义, 道路, 道, 路, 重要性, 重要,
要性, 性
构建索引的时候,道路被拆分为:15,16,17位置。
与检索的词项顺序是一致的。
这里解析更详细:http://t.cn/R8pzw9e
4、match_pharse都搜不出来,还有没有别的方案?
有,和match_pharse类似,不过match_phrase_prefix支持最后一个term前缀匹配。
除了把查询文本的最后一个分词只做前缀匹配之外,match_phrase_prefix和match_phrase查询基本一样,参数 max_expansions 控制最后一个单词会被重写成多少个前缀,也就是,控制前缀扩展成分词的数量,默认值是50(官网文档建议50)。
扩展的前缀数量越多,找到的文档数量就越多;
如果前缀扩展的数量太少,可能查找不到相应的文档,遗漏数据。
POST ik_index/ik_type/_search
{"profile":"true","query":{"match_phrase_prefix" : {"title.ik_my_max" : {"query": "道路","max_expansions": 50}}
}
}
经验证: 关键词”理解”、”解放”、”道路”、“理解放大”,都能搜出这篇文档。
5、应用场景
我们自己开发搜索引擎的时候,经常会出现基于title或者content字段进行检索。
如果用match检索,会出现噪音很多的情况;
如果用match_phrase,会出现某些字段检索不出来的情况,如上分析的“道路”;
如果用wildcard,能检索出来,但又有性能问题的存在。
这时候,可以考虑下: match_phrase_prefix。
6、小结
实际开发中,根据应用场景不同,采用不同的分词器。
如果选用ik,建议使用ik_max_word分词,因为:ik_max_word的分词结果包含ik_smart。
匹配的时候,如果想尽可能的多检索结果,考虑使用match;
如果想尽可能精确的匹配分词结果,考虑使用match_phrase;
如果短语匹配的时候,怕遗漏,考虑使用match_phrase_prefix。
match_phrase搜不出来,怎么办?相关推荐
- 【Elasticsearch】match_phrase搜不出来,怎么办
1.概述 博客转载:Elasticsearch实战 | match_phrase搜不出来,怎么办? 主要是自己实践一番,并且加深记忆. 2.问题抛出 某个词组在Elasitcsearch中的某个doc ...
- Elasticsearch实战 | match_phrase搜不出来,怎么办?
1.问题抛出 某个词组在Elasitcsearch中的某个document中存在,就一定通过某种匹配方式把它搜出来. 举例: title=公路局正在治理解放大道路面积水问题. 输入关键词:道路,能否搜 ...
- Elasticsearch系列「」学习路线
Elasticsearch 基础认知 重磅 | Elasticsearch 7.X学习路线图 终于等到你,Elasticsearch 7.X视频教程发布! Elasticsearch 7.0 正式发 ...
- Elasticsearch进阶
本文: 不谈搜索引擎的原理: 不谈倒排索引的原理: 不谈乐观锁.悲观锁的机制: -- 只谈: 从产品开发.项目实战的角度,如何让一个 Java 程序员甚至 C/C++ 的程序员快速上手. 海量的版本中 ...
- 视频推流技术_ai视频流的最新技术进步
视频推流技术 85% of the data consumed over the internet is via videos. About 2.8 exabytes of data is trans ...
- es笔记三之term,match,match_phrase 等查询方法介绍
首先介绍一下在 es 里有两种存储字符串的字段类型,一个是 keyword,一个是 text. keyword 在存储数据的时候是作为一个整体存储的,不会对其进行分词处理 text 存储数据的时候会对 ...
- Elasticsearch match_phrase
转自:https://blog.csdn.net/laoyang360/article/details/79249823 1.问题抛出 某个词组在Elasitcsearch中的某个document中存 ...
- match_phrase 跨值查询中 position_increment_gap 参数用法
文章目录 1.概述 2.match_phrase 短语搜索 3.跨值访问 3.1 问题演示 3.2 原因 3.3 解决方案 3.4 position_increment_gap 参数 1.概述 在 E ...
- 别只会搜日志了,求你懂点检索原理吧
别只会搜日志了,求你懂点检索原理吧 本篇主要内容如下: 前言 项目中我们总是用 Kibana 界面来搜索测试或生产环境下的日志,来看下有没有异常信息.Kibana 就是 我们常说的 ELK 中的 K. ...
最新文章
- [Web API] 如何让 Web API 统一回传格式以及例外处理[转]
- Linux服务器集群系统(二)--转
- 【深度学习】数据降维方法总结
- 微软ping程序源代码完整版(附详细的注释)
- 基于生命周期理论的农业科学数据中心化管理模式
- 安徽省农商行计算机类考试,2017安徽农商行备考:计算机的系统组成
- 虚拟机安装Ubuntu无法通过Xshell登录
- Geoserver:跨域处理
- 网页版-抽签程序源码
- 解决office桌面空白图标和右键无法新建的问题
- 计算机中取消打印任务,取消打印任务的具体方法步骤
- 原生js的e.target.closest()方法
- Leo第一次练习跆拳道--Leo与跆拳道 1
- 免费好用的APP你值得一试
- 天然“降脂药”,帮你“吃掉”血脂!
- 浅析:XSS攻击、SQL注入攻击和CSRF攻击
- Rust模板引擎Tera中文英文对照官方文档
- 机器学习分类算法_达观数据:5分钟带你理解机器学习及分类算法
- 06【群面】(无领导小组)群面基本介绍考察内容流程,群面常见问题解题思路,群面角色分析考官追问
- linux安装qq 中文乱码,在Deepin系统下用Wine运行的QQ音乐界面出现乱码的解决
热门文章
- nginx虚拟主机(基于域名虚拟主机、基于IP地址虚拟主机、基于端口虚拟主机设置)
- liunx--账户文件权限和管理(账户添加删除,组的添加和删除 文件的归宿和权限)
- Linux网络模式及远程连接出错排障
- 微信有电脑客户端吗_微信电脑版有哪些功能呢
- MiniGUI开发环境搭建全记录(嵌入式计X86)
- xp和win 2003远程桌面强制进入命令_远程登录t人命令
- springcloud 子项目怎么导入_「 从0到1学习微服务SpringCloud 」09 补充篇-maven父子模块项目...
- 在php中页面布局 3列左右侧固定中间自适应居中,css三列布局--两边固定中间自适应和中间固定两边自适应...
- java for list i_Java中ArrayList的fori和foreach效率比较
- 计算机与材料化学应用背景介绍,计算机在材料工程中的应用.ppt