刚开始接触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. SQL Server sp_executesql介绍和使用

    execute相信大家都用的用熟了,简写为exec,除了用来执行存储过程,一般都用来执行动态Sql sp_executesql,sql2005中引入的新的系统存储过程,也是用来处理动态sql的, 如: ...

  2. C#常用的正则工具类写法

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  3. golang变量声明

    func main() { var a1 int a1 = 1 var a = 1 b := 1 var c, d int c = 1 d = 1 var e, f = 1, 2 g, h := 1, ...

  4. 两年.net码农总结

    一直都是在博客园看文章,几乎每个两三天都会来,不管是看技术分享还是看经验总结,我觉得这真是个好地方. 工作两年,24.5岁,目前达到8.5K(即10W)的.net web. 文章水平不好,各位见谅了, ...

  5. js中常用事件

    鼠标事件 /* onclick:点击某个对象时触发 ondblclick:双击某个对象时触发 onmouseover:鼠标移入某个元素时触发 onmouseout:鼠标移出某个元素时触发 onmous ...

  6. Linux下安装mysql(示例mysql5.6安装)

    1.首先检查你的linux上是否已经安装了mysql rpm -qa|grep mysql 2.如果mysql的版本不是想要的版本.需要把mysql卸载 yum remove mysql mysql- ...

  7. C++中路径的处理方法(string)

    string 类提供字符串处理函数,利用这些函数,程序员可以在字符串内查找字符,提取连续字符序列(称为子串),以及在字符串中删除和添加.我们将介绍一些主要函数. 1.函数find_first_of() ...

  8. html5 流动布局

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  9. Django 2.0 学习(12):Django 模板语法

    Django 模板语法 一.模板 只要是在html里面有模板语法就不是html文件了,这样的文件就叫做模板. 二.模板语法 模板语法变量:{{ }} 在Django模板中遍历复杂数据结构的关键是句点字 ...

  10. Android WebView常见问题及解决方案汇总【很全很实用】

    http://www.cnblogs.com/olartan/p/5713013.html