【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 的架构以及其开源的生态 ...
随机推荐
- 求解100以内的所有素数(问题来自PythonTip)
求解100以内的所有素数 (AC/Submit)Ratio(4615|22542)20.47% 描述: 输出100以内的所有素数,素数之间以一个空格区分(注意,最后一个数字之后不能有空格). a=[2 ...
- MYCAT扩容
一.原架构图: 二.扩容 在HOST1上新增节点db_user2 在HOST2上新增节点db_user2 三.操作步骤 1.mycat 所在环境安装 mysql 客户端程序 2.mycat 的 lib ...
- Linux记录-筛选日志sed、find、tail,du,awk命令
1.查看某一段时间的日志 #cat hdfs-audit.log | sed -n '/2018-04-11 10:00:00/,/2018-04-11 10:01:00/ p' | more - ...
- Hive记录-hive权限控制
在使用Hive的元数据配置权限之前必须现在hive-site.xml中配置两个参数,配置参数如下: <property> <name>hive.security.authori ...
- gitlab与pycharm结合
一切都在图中 点开pycharm里的菜单选项 设置git代码仓库的地址 修改了代码之后,如何推送到git服务器上 通过pycharm下载代码仓库 pycharm中如何设置分支 pycharm新建了分支 ...
- ThreadLocal以及内存泄漏
ThreadLocal是什么 ThreadLocal 的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度.但是如果滥用Thr ...
- python遍历数组获取下标
代码 通过枚举实现 a = [,,,,,] for i,j in enumerate(a): print i,j 结果
- Nginx Server 配置
http { include mime.types; // 主模块:实现对配置文件包含的文件设定,可以减少主配置文件的复杂度: default_type application/octet-strea ...
- JavaScript之Ajax(一)创建Ajax对象
// 支持浏览器的源码 function AjaxObject() { var AjaxRequest; // 缓存XHR对象便于 Ajax 使用 try { // Opera 8.0+, Firef ...
- HDU1233 还是畅通工程【最小生成树】
题意: 求出连接各个村庄最小的公路总长度,把最小公路总长度求出来. 思路: 最小生成树原理,带入数据求得. 代码: prim: #include<iostream> #include< ...