【ES】match_phrase与regexp
刚开始接触es,由于弄不清楚match_phrase和regexp导致很多查询结果与预想的不同。在这整理一下。
regexp:针对的是单个词项
match_phrase:针对的是多个词项的相对位置
它们的查询结果跟分析器分词的方式有很大关系。
比如,我有两个字符串"HELLO-world" 和 "hello.WORLD",字段名称是title。
针对"HELLO-world",看下面两个语句。第二个是可以匹配的,第一个不可以。
{ "regexp": { "title": "hello-w.*" }}
{ "match_phrase": { "title": "hello world" }}
分析一下,可以看到,HELLO-world被分为了两个单词,hello和world。
-GET _analyze
{
"field": "title",
"text": "HELLO-world"
}
---------------------------
{
"tokens" : [
{
"token" : "hello",
"start_offset" : ,
"end_offset" : ,
"type" : "<ALPHANUM>",
"position" :
},
{
"token" : "world",
"start_offset" : ,
"end_offset" : ,
"type" : "<ALPHANUM>",
"position" :
}
]
}
首先,es是没有大写的,所有的字符都被转换成了小写。其次,"-"字符丢失了。
regexp是针对单个词项的,无论是hello还是world,都不符合正则条件,故没有匹配。
match_phrase是针对多个词项的。首先match_phrase的"hello world"被分为了hello和world两个单词,然后这两个单词在title的分词中都可以找到,并且相对位置满足条件,故语句可以匹配。
再看 "hello.WORLD"
{ "regexp": { "title": "hello\\.w.*" }}
{ "match_phrase": { "title": "hello world" }}
结果是,第一个可以匹配,而第二个不能。
原因看分词结果:
-GET_analyze
{
"field": "title",
"text": "hello.WORLD"
}
-------------------------------
{
"tokens" : [
{
"token" : "hello.world",
"start_offset" : ,
"end_offset" : ,
"type" : "<ALPHANUM>",
"position" :
}
]
}
坑爹的情况出现了,"."并不会被切分,整个"hello.world"被视作了一个词项。
match_phrase在词项中查找hello和world都查找不到,故不会匹配
regexp则能找到一个满足正则表达式的词项,故可以匹配。
ES的分词处理非常重要,很大的影响了查询结果!
【ES】match_phrase与regexp的更多相关文章
- hot load那点事
热加载,最初接触的时候是使用create-react-app的时候,创建一个项目出来,修改一点代码,页面自动刷新了,贫道当时就感叹,这是造福开发者的事情. 再后来编写静态页面的时候使用 VS Code ...
- ES match match_phrase term willcard的查询原理
比如:要求实现SQL中like “%xxxx%”的匹配效果. wildcard通配 这种效果在ES中最匹配的做法是用wildcard query通配,这种情况不会对query分词,而是直接遍历倒排索引 ...
- ES查询-match VS match_phrase
我们以一个查询的示例开始,我们在student这个type中存储了一些学生的基本信息,我们分别使用match和match_phrase进行查询. 首先,使用match进行检索,关键字是“He is”: ...
- es 基于match_phrase的模糊匹配原理及使用
[版权声明]:本文章由danvid发布于http://danvid.cnblogs.com/,如需转载或部分使用请注明出处 在业务中经常会遇到类似数据库的"like"的模糊匹配需求 ...
- ES中文分词器之精确短语匹配(解决了match_phrase匹配不全的问题)
分词器选择 调研了几种分词器,例如IK分词器,ansj分词器,mmseg分词器,发现IK的分词效果最好.举个例子: 词:<<是的>><span>哈<\span ...
- es match、match_phrase、query_string和term的区别
(一)text字段和keyword字段的区别 以下给出一个例子: 首先建立一个索引和类型,引入一个keywork的字段: PUT my_index { "mappings": { ...
- ES 应用
1. ES的不同之处: 全文检索.处理同义词.通过相关性给文档评分, 从同样的数据中生成分析与聚合数据, 实时大型批处理. 安装es与kibana 1.下载:https://www.elastic ...
- es中级部分知识点总结
--------------------------------------------------------------- 搜索开始-------------------------------- ...
- ES之二:Elasticsearch原理
Elasticsearch是最近两年异军突起的一个兼有搜索引擎和NoSQL数据库功能的开源系统,基于Java/Lucene构建.最近研究了一下,感觉 Elasticsearch 的架构以及其开源的生态 ...
随机推荐
- array_values
$a = array( "Name" => "Peter", ", "Country" => "USA&qu ...
- 使用sklearn进行数据挖掘
sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...
- Scala进阶之路-正则表达式案例
Scala进阶之路-正则表达式案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 废话不多说,正则大家都很清楚,那在Scala如何使用正则了?我们直接上个案例,如下: /* @au ...
- JAVA记录-Spring两大特性
1.IOC控制反转 Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象 ...
- Java编程思想 学习笔记5
五.初始化与清理 1.用构造器确保初始化 在Java中,通过提供构造器,类的设计者可确保每个对象都会得到初始化.创建对象时,如果其类具有构造器,Java就会在用户有能力操作对象之前自动调用相应的构造 ...
- SQL语句(四)可视化创建和修改表
可视化创建修改表 数据库(teaching)->表->新建表 数据库(teaching)->表->(右键)设计->CHECK约束->添加---->标识(名称) ...
- 使用paramiko远程执行命令、下发文件
写部署脚本时,难免涉及到一些远程执行命令或者传输文件. 之前一直使用sh库,调用sh.ssh远程执行一些命令,sh.scp传输文件,但是实际使用中还是比较麻烦的,光是模拟用户登陆这一点,还需要单独定义 ...
- 词典的实现(4)-使用Hash方式来实现词典
1,实现思路 public class HashedDictionary<K, V> implements DictionaryInterface<K, V>, Seriali ...
- luogu 4158 粉刷匠 dp套dp
dp套dp 每个木板是个递推的dp,外部是个分组背包 #include<bits/stdc++.h> #define rep(i,x,y) for(register int i=x;i&l ...
- Sqoop异常:Exception in thread "main" java.lang.NoClassDefFoundError: org/json/JSONObject
18/12/07 01:09:03 INFO mapreduce.ImportJobBase: Beginning import of staffException in thread "m ...