刚开始接触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的更多相关文章

  1. hot load那点事

    热加载,最初接触的时候是使用create-react-app的时候,创建一个项目出来,修改一点代码,页面自动刷新了,贫道当时就感叹,这是造福开发者的事情. 再后来编写静态页面的时候使用 VS Code ...

  2. ES match match_phrase term willcard的查询原理

    比如:要求实现SQL中like “%xxxx%”的匹配效果. wildcard通配 这种效果在ES中最匹配的做法是用wildcard query通配,这种情况不会对query分词,而是直接遍历倒排索引 ...

  3. ES查询-match VS match_phrase

    我们以一个查询的示例开始,我们在student这个type中存储了一些学生的基本信息,我们分别使用match和match_phrase进行查询. 首先,使用match进行检索,关键字是“He is”: ...

  4. es 基于match_phrase的模糊匹配原理及使用

    [版权声明]:本文章由danvid发布于http://danvid.cnblogs.com/,如需转载或部分使用请注明出处 在业务中经常会遇到类似数据库的"like"的模糊匹配需求 ...

  5. ES中文分词器之精确短语匹配(解决了match_phrase匹配不全的问题)

    分词器选择 调研了几种分词器,例如IK分词器,ansj分词器,mmseg分词器,发现IK的分词效果最好.举个例子: 词:<<是的>><span>哈<\span ...

  6. es match、match_phrase、query_string和term的区别

    (一)text字段和keyword字段的区别 以下给出一个例子: 首先建立一个索引和类型,引入一个keywork的字段: PUT my_index { "mappings": { ...

  7. ES 应用

    1. ES的不同之处:   全文检索.处理同义词.通过相关性给文档评分, 从同样的数据中生成分析与聚合数据, 实时大型批处理. 安装es与kibana 1.下载:https://www.elastic ...

  8. es中级部分知识点总结

    --------------------------------------------------------------- 搜索开始-------------------------------- ...

  9. ES之二:Elasticsearch原理

    Elasticsearch是最近两年异军突起的一个兼有搜索引擎和NoSQL数据库功能的开源系统,基于Java/Lucene构建.最近研究了一下,感觉 Elasticsearch 的架构以及其开源的生态 ...

随机推荐

  1. Nginx的特性与核心类别及配置文件和模块详解

    1.root path 设置web资源路径,用于指定请求的根文档目录,从根开始匹配 root:root/URI 2.alias path 指定路径别名,只能用于location中,从最后一个/开始匹配 ...

  2. JDK JRE JVM的关系

    JVM:Java Virtual Machine的缩写,即Java虚拟机 JRE:Java Runtime Environment的缩写,即Java运行环境 JDK:Java Development ...

  3. Java线程间和进程间通信

    1 线程与线程间通信 1.1 基本概念以及线程与进程之间的区别联系 关于进程和线程,首先从定义上理解就有所不同: 进程是具有一定独立功能的程序.它是系统进行资源分配和调度的一个独立单位,重点在系统调度 ...

  4. (二)Git时间--版本控制工具进阶

    1. 忽略文件 Git 会检查代码仓库的目录下是否存在一个名为 .gitignore的文件,如果存在的话,就去一行行读取这个文件中的内容,并把每一行指定的文件或目录 排除 在版本 控制之外. 注意,. ...

  5. docker入门(三)

    docker容器IP"暴露"到外网(宿主机外) 首先将docker容器IP固定 Docker自身的4种网络工作方式,简略说明下: host模式,使用--net=host指定. co ...

  6. Javaweb学习笔记——(二)——————CSS概述,进入JavaScript

    day02day01内容回顾 1.html操作思想 **使用标签把要操作的数据包起来,通过修改标签的属性值来是实现标签内数据样式的变化 ***<font size="5"&g ...

  7. yolov3实践(二)

    这次给大家带来一个有趣的项目,项目主要是Python写的,基于Keras,backend是tf. 首先,当我们回顾视觉目标检测这个任务时,我们可能纠结于如何使这个项目变得更加work,我理解的更加wo ...

  8. DSO windowed optimization 代码 (3)

    4 Schur Complement 部分信息计算 参考<DSO windowed optimization 公式>,Schur Complement 部分指 Hsc(\(H_{X\rho ...

  9. SpringBoot使用Redis缓存

    (1).添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId&g ...

  10. py-faster-rcnn + opencv3.0.0 + ubuntu16.04配置(CPU模式)

    最近开始做行人检测,因此开始接触faster-rcnn,这里贴上配置教程(亲测可行),不过是基于cpu的,蓝瘦... 参考博客:http://www.tuicool.com/articles/nYJr ...