刚开始接触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. 漏洞评估工具Nexpose的配置使用

    nexpose是领先的漏洞评估工具之一.Nexpose社区版是一个免费的程序,其他版本是收费的.在这篇文章中,我们将使用Nexpose免费社区版,里面有扫描32主机的能力.用户界面干净.报告强大.像大 ...

  2. Python介绍以及安装

    Python介绍以及安装 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 借用我的导师的一句话:当你看到这篇文章的时候,那么恭喜你,你已经是踏入了开发的大门!欢迎加入:高级运维工程师 ...

  3. UDP网路会议室的代码

    UDP网络会议室视频已经录制好,这里贴上代码仅供参考 MainWindow代码: using System; using System.Collections.Generic; using Syste ...

  4. Python中re(正则表达式)模块学习

    re.match re.match 尝试从字符串的开始匹配一个模式,如:下面的例子匹配第一个单词. import re text = "JGood is a handsome boy, he ...

  5. UESTC - 1324 卿学姐与公主

    题目链接 某日,百无聊赖的卿学姐打开了某11区的某魔幻游戏 在这个魔幻的游戏里,生活着一个美丽的公主,但现在公主被关押在了魔王的城堡中. 英勇的卿学姐拔出利刃冲向了拯救公主的道路. 走过了荒野,翻越了 ...

  6. Python复习笔记(二)变量进阶

    02. 可变和不可变类型 不可变类型,内存中的数据不允许被修改: 数字类型 int , bool , float , complex , long(2.x) 字符串 str 元组 tuple 可变类型 ...

  7. 使用fastreport以代码方式创建报表

    Report report = new Report();// register the "Products" tablereport.RegisterData(dataSet1. ...

  8. GET和POST有什么区别?及为什么网上多数答案都是错的(转载)

    这仅仅是我认为比较好的关于get和post区别的解答,然后把作者的一些文字踢除留下比较干的部分. 作者:南柯之石链接:http://www.cnblogs.com/nankezhishi/archiv ...

  9. Java并发编程(1)-Java内存模型

    本文主要是学习Java内存模型的笔记以及加上自己的一些案例分享,如有错误之处请指出. 一 Java内存模型的基础 1.并发编程模型的两个问题 在并发编程中,需要了解并会处理这两个关键问题: 1.1.线 ...

  10. MoveIt! 源安装

    rosdep update sudo apt-get update sudo apt-get dist-upgrade sudo apt-get install python-wstool pytho ...