match、match_phrase、term示例

https://www.jianshu.com/p/be46656ac73f

https://blog.csdn.net/timothytt/article/details/86775114

____________________________________________________________________________

es中match_phrase和term区别
原创7im0thyZhang 最后发布于2019-02-08 14:40:11 阅读数 2202 收藏
 
term是将传入的文本原封不动地(不分词)拿去查询。
match会对输入进行分词处理后再去查询,部分命中的结果也会按照评分由高到低显示出来。
match_phrase是按短语查询,只有存在这个短语的文档才会被显示出来。

也就是说,term和match_phrase都可以用于精确匹配,而match用于模糊匹配。

之前我以为match_phrase不会被分词,看来理解错了,其官方解释如下:

Like the match query, the match_phrase query first analyzes the query string to produce a list of terms. It then searches for all the terms, but keeps only documents that contain all of the search terms, in the same positions relative to each other.

总结下,这段话的3个要点:

match_phrase还是分词后去搜的
目标文档需要包含分词后的所有词
目标文档还要保持这些词的相对顺序和文档中的一致
只有当这三个条件满足,才会命中文档!

那么,term和match_phrase都可以实现按短语搜索,二者在实际使用中有啥区别呢。

【发现问题】
1.我们先放入一个文档:

2.然后使用match_phrase搜索:

嗯,不出所料,搜索到了。

3.然后我们用term试试

纳尼!!!居然没有?那么全句带进去搜总行了吧

居然还是不行!!这就奇怪了。

【问题分析】我们来看看这句话的分词结果:

我们会发现,中文竟然被默认分词器分词单个字了!尴尬啊!!!
这就不难理解为啥term搜“学习”搜不到,搜全文也搜不到,因为存的是“学”和“习”。

【总结】如果使用term查询,要确保字段是no analyzed的。建索引的时候要注意。
————————————————
版权声明:本文为CSDN博主「7im0thyZhang」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/timothytt/article/details/86775114

____________________________________________________________________________

  • 一、前提内容:
{
    "note":"东北大学在秦皇岛设立的分校。 东北大学秦皇岛分校是经教育部正式批准成立.",
    "value":"岛设fff"
}
{
    "note":"东北大学秦皇岛分校是经教育部正式批准成立,在东北大学统一规划下",
    "value":"岛设"
}

对应的mapping

{
  "ik-test": {
    "mappings": {
      "weibo": {
        "properties": {
          "note": {
            "type": "string",
            "analyzer": "ik"
          },
          "value": {
            "type": "string",
            "index": "not_analyzed",
            "analyzer": "ik"
          }
        }
      }
    }
  }
}

value不进行分析

{
    "query":{
        "match":{"note":"岛设"}
    },
    "highlight":{
        "pre_tags":["<tag1>","<tag2>"],
        "post_tags":["</tag1>","</tag2>"],
        "fields":{
            "note":{}
        }
    }
}

能匹配以上两个文档

{
    "highlight": {
          "note": [
            "东北大学在秦皇<tag1>岛</tag1>设立的分校。 东北大学秦皇<tag1>岛</tag1>分校是经教育部正式批准成立."
          ]
      }
}

{
    "highlight": {
          "note": [
            "东北大学秦皇<tag1>岛</tag1>分校是经教育部正式批准成立,在东北大学统一规划下."
          ]
      }
}
{
    "query":{
        "match_phrase":{"note":"岛设"}
    },
    "highlight":{
        "pre_tags":["<tag1>","<tag2>"],
        "post_tags":["</tag1>","</tag2>"],
        "fields":{
            "note":{}
        }
    }
}

则没有匹配任何内容

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 0,
    "max_score": null,
    "hits": []
  }
}
{
    "query":{
        "term":{"note":"岛设"}
    },
    "highlight":{
        "pre_tags":["<tag1>","<tag2>"],
        "post_tags":["</tag1>","</tag2>"],
        "fields":{
            "note":{}
        }
    }
}

则没有匹配任何内容,因为“岛设”没有作为一个词被分词
但是“东北大学”是有作为词被分词的,可以匹配到

{
    "query":{
        "term":{"note":"东北大学"}
    },
    "highlight":{
        "pre_tags":["<tag1>","<tag2>"],
        "post_tags":["</tag1>","</tag2>"],
        "fields":{
            "note":{}
        }
    }
}
{
    "highlight": {
          "note": [
            "<tag1>东北大学</tag1>在秦皇岛设立的分校。 <tag1>东北大学</tag1>秦皇岛分校是经教育部正式批准成立."
          ]
      }
}

{
    "highlight": {
          "note": [
            "<tag1>东北大学</tag1>秦皇岛分校是经教育部正式批准成立,在<tag1>东北大学</tag1>统一规划下."
          ]
      }
}

对于value没有进行分析器分析的,是完整的内容

{
    "query":{
        "match":{"value":"岛设"}
    },
    "highlight":{
        "pre_tags":["<tag1>","<tag2>"],
        "post_tags":["</tag1>","</tag2>"],
        "fields":{
            "value":{}
        }
    }
}

匹配不到任何内容,但是使用term可以匹配一条

{
    "query":{
        "term":{"value":"岛设"}
    },
    "highlight":{
        "pre_tags":["<tag1>","<tag2>"],
        "post_tags":["</tag1>","</tag2>"],
        "fields":{
            "value":{}
        }
    }
}

匹配结果

{
  "took": 3,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 1.6931472,
    "hits": [
      {
        "_index": "ik-test",
        "_type": "weibo",
        "_id": "12",
        "_score": 1.6931472,
        "_source": {
          "note": "东北大学秦皇岛分校是经教育部正式批准成立,在东北大学统一规划下",
          "value": "岛设"
        }
      }
    ]
  }
}

Elasticsearch

原文地址:https://www.cnblogs.com/kelelipeng/p/12357385.html

时间: 2024-10-10 10:02:26

match、match_phrase、term示例的相关文章

es match和term的区别

(一)text字段和keyword字段的区别 以下给出一个例子: 首先建立一个索引和类型,引入一个keywork的字段: PUT my_index { "mappings": { "products": { "properties": { "name": { "type": "keyword" } } } } } 然后查询是否有索引: GET _cluster/state 可以看到已经创

(转)Elasticsearch查询规则------match和term

es种有两种查询模式,一种是像传递URL参数一样去传递查询语句,被称为简单搜索或查询字符串(query string)搜索,比如 GET /megacorp/employee/_search //查询全部员工 GET /megacorp/employee/_search?q=last_name:Smith //查询last_name为Smith的员工 另外一种是通过DSL语句来进行查询,被称为DSL查询(Query DSL),DSL是Elasticsearch提供的一种丰富且灵活的查询语言,该语

Elasticsearch查询match、term和bool区别

es中的查询请求有两种方式,一种是简易版的查询,另外一种是使用JSON完整的请求体,叫做结构化查询(DSL).由于DSL查询更为直观也更为简易,所以大都使用这种方式.DSL查询是POST过去一个json,由于post的请求是json格式的,所以存在很多灵活性,也有很多形式.这里有一个地方注意的是官方文档里面给的例子的json结构只是一部分,并不是可以直接黏贴复制进去使用的.一般要在外面加个query为key的机构. match最简单的一个match例子: 查询和"我的宝马多少马力"这个

ES查询-term VS match (转)

原文地址:https://blog.csdn.net/sxf_123456/article/details/78845437 elasticsearch 中term与match区别 term是精确查询 match是模糊查询 term查询 term是代表完全匹配,也就是精确查询,搜索前不会再对搜索词进行分词,所以我们的搜索词必须是文档分词集合中的一个.比如说我们要找标题为北京奥运的所有文档 $curl -XGET http://localhost:9200/index/doc/_search?pr

苹果Xcode帮助文档阅读指南

本文转自:tinyfool 由 tinyfool 发布于 2013年08月21日 | 更新于 3周前 jackwen lionlee Claud 等6人欣赏. 1人反对. 一直想写这么一个东西,长期以来我发现很多初学者的问题在于不掌握学习的方法,所以,Xcode那么好的SDK文档摆在那里,对他们也起不到什么太大的作用.从论坛.微博等等地方看到的初学者提出的问题,也暴露出他们不知道很多他们的疑惑其实在文档里面写的非常清楚.而有时候当他们想从文档去找解决方案的时候,也往往找不到.或者有些人意识到了,

ElasticSearch基础(2) - hello world

上一篇 ES基础(1) 官网原地址:https://www.elastic.co/guide/en/elasticsearch/reference/1.7/_cluster_health.html ES权威指南: http://es.xiaoleilu.com/ 一.Exploring Your Cluster 1.1.Cluster Health 要检测集群的健康状况,需要使用_cat API curl 'localhost:9200/_cat/health?v' 我们可以发现集群ysz的状态

转:苹果Xcode帮助文档阅读指南

一直想写这么一个东西,长期以来我发现很多初学者的问题在于不掌握学习的方法,所以,Xcode那么好的SDK文档摆在那里,对他们也起不到什么太大的作用.从论坛.微博等等地方看到的初学者提出的问题,也暴露出他们不知道很多他们的疑惑其实在文档里面写的非常清楚.而有时候当他们想从文档去找解决方案的时候,也往往找不到.或者有些人意识到了,阅读文档是学习的好办法,但是不得要领. 中国的技术社区有一个很没意思的毛病,就是技术深了,看不懂骂不知所云,技术浅了,看得懂骂没有技术含量.不过管那么孙子做啥,对于现在可能

IOS苹果Xcode帮助文档阅读指南

一直想写这么一个东西,长期以来我发现很多初学者的问题在于不掌握学习的方法,所以,Xcode那么好的SDK文档摆在那里,对他们也起不到什么太大的作用.从论坛.微博等等地方看到的初学者提出的问题,也暴露出他们不知道很多他们的疑惑其实在文档里面写的非常清楚.而有时候当他们想从文档去找解决方案的时候,也往往找不到.或者有些人意识到了,阅读文档是学习的好办法,但是不得要领. 中国的技术社区有一个很没意思的毛病,就是技术深了,看不懂骂不知所云,技术浅了,看得懂骂没有技术含量.不过管那么孙子做啥,对于现在可能

【龙书笔记】用Python实现一个简单数学表达式从中缀到后缀语法的翻译器(采用递归下降分析法)

上篇笔记介绍了语法分析相关的一些基础概念,本篇笔记根据龙书第2.5节的内容实现一个针对简单表达式的后缀式语法翻译器Demo. 备注:原书中的demo是java实例,我给出的将是逻辑一致的Python版本的实现. 在简单后缀翻译器代码实现之前,还需要介绍几个基本概念. 1. 自顶向下分析法(top-down parsing) 顾名思义,top-down分析法的思路是推导产生式时,以产生式开始符号作为root节点,从上至下依次构建其子节点,最终构造出语法分析树.在具体实现时,它会把输入字符串从左到右