ES查询-match VS match_phrase

我们以一个查询的示例开始,我们在student这个type中存储了一些学生的基本信息,我们分别使用match和match_phrase进行查询。

首先,使用match进行检索,关键字是“He is”:

GET /test/student/_search
{
  "query": {
    "match": {
      "description": "He is"
    }
  }
}

执行这条查询,得到的结果如下:

{
   "took": 3,
   "timed_out": false,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "hits": {
      "total": 4,
      "max_score": 0.2169777,
      "hits": [
         {
            "_index": "test",
            "_type": "student",
            "_id": "2",
            "_score": 0.2169777,
            "_source": {
               "name": "februus",
               "sex": "male",
               "age": 24,
               "description": "He is passionate.",
               "interests": "reading, programing"
            }
         },
         {
            "_index": "test",
            "_type": "student",
            "_id": "1",
            "_score": 0.16273327,
            "_source": {
               "name": "leotse",
               "sex": "male",
               "age": 25,
               "description": "He is a big data engineer.",
               "interests": "reading, swiming, hiking"
            }
         },
         {
            "_index": "test",
            "_type": "student",
            "_id": "4",
            "_score": 0.01989093,
            "_source": {
               "name": "pascal",
               "sex": "male",
               "age": 25,
               "description": "He works very hard because he wanna go to Canada.",
               "interests": "programing, reading"
            }
         },
         {
            "_index": "test",
            "_type": "student",
            "_id": "3",
            "_score": 0.016878016,
            "_source": {
               "name": "yolovon",
               "sex": "female",
               "age": 24,
               "description": "She is so charming and beautiful.",
               "interests": "reading, shopping"
            }
         }
      ]
   }
}

而当你执行match_phrase时:

GET /test/student/_search
{
  "query": {
    "match_phrase": {
      "description": "He is"
    }
  }
}

结果如下:

{
   "took": 3,
   "timed_out": false,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "hits": {
      "total": 2,
      "max_score": 0.30685282,
      "hits": [
         {
            "_index": "test",
            "_type": "student",
            "_id": "2",
            "_score": 0.30685282,
            "_source": {
               "name": "februus",
               "sex": "male",
               "age": 24,
               "description": "He is passionate.",
               "interests": "reading, programing"
            }
         },
         {
            "_index": "test",
            "_type": "student",
            "_id": "1",
            "_score": 0.23013961,
            "_source": {
               "name": "leotse",
               "sex": "male",
               "age": 25,
               "description": "He is a big data engineer.",
               "interests": "reading, swiming, hiking"
            }
         }
      ]
   }
}

占的篇幅有点长,但是如果能基于此看清这两者之间的区别,那也是值得的。

我们分析一下这两者结果的差别:

1.非常直观的一点,对于同一个数据集,两者检索出来的结果集数量不一样;
2.对于match的结果,我们可以可以看到,结果的Document中description这个field可以包含“He is”,“He”或者“is”;
3.match_phrase的结果中的description字段,必须包含“He is”这一个词组;
4.所有的检索结果都有一个_score字段,看起来是当前这个document在当前搜索条件下的评分,而检索结果也是按照这个得分从高到低进行排序。
       我们要想弄清楚match和match_phrase的区别,要先回到他们的用途:match是全文搜索,也就是说这里的搜索条件是针对这个字段的全文,只要发现和搜索条件相关的Document,都会出现在最终的结果集中,事实上,ES会根据结果相关性评分来对结果集进行排序,这个相关性评分也就是我们看到的_score字段;总体上看,description中出现了“He is”的Document的相关性评分高于只出现“He”或“is”的Document。(至于怎么给每一个Document评分,我们会在以后介绍)。
相关性(relevance)的概念在Elasticsearch中非常重要,而这个概念在传统关系型数据库中是不可想象的,因为传统数据库对记录的查询只有匹配或者不匹配。

那么,如果我们不想将我们的查询条件拆分,应该怎么办呢?这时候我们就可以使用match_phrase:
match_phrase是短语搜索,亦即它会将给定的短语(phrase)当成一个完整的查询条件。当使用match_phrase进行搜索的时候,你的结果集中,所有的Document都必须包含你指定的查询词组,在这里是“He is”。这看起来有点像关系型数据库的like查询操作。

原文地址:https://www.cnblogs.com/loveyouyou616/p/10364082.html

时间: 2024-10-08 00:59:52

ES查询-match VS match_phrase的相关文章

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

es查询

POST   地址/_search 普通查询 body { "query":{ "match" { "key":value }, "sort":[排序规则] } } 聚合查询 { "aggs":{ "grades_word_count":{ "min":{ "field":"word_count" } } } } 高级查询 1

es 查询更新操作

# es 查询更新操作 # _*_ coding: utf-8 _*_ import time import datetime import pymysql from elasticsearch import Elasticsearch from urllib3.connectionpool import xrange # class EsClient(): es_host = "192.168.8.190" port = 9200 timeout = 15000 global ind

Es查询结果集默认是10000,更新设置

Es查询结果集默认是10000,结果集大小是int,最大为21亿左右 PUT _all/_settings?preserve_existing=true { "index.max_result_window" : "2000000000" } 将所有的索引结果窗口集改为20亿,这个是已经存在的索引 新建的索引还会默认是10000,需要修改模板配置 删除模板,在原模板加入"max_result_window":2000000000     然后重新

Elasticsearch查询match、term和bool区别

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

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 收藏 ter

python 配合 es 查询数据

1.python脚本 [[email protected] ~]# cat python-es.py #!/usr/bin/env python3 from elasticsearch import Elasticsearch from json import dumps es = Elasticsearch( ['127.0.0.1:9200'], # 认证信息 # http_auth=('elastic', 'elastic') ) #print(es.ping()) #print(es.c

ES query_string match的区别之一

今天线上发现一个问题,从而引出对query_string 和 match 的区别的思考. curl -XGET 'http://localhost:9200/*/offer/_search?pretty' -d '{ "from" : 0, "size" : 10, "fields" : ["title"], "query": { "query_string" : { "que

ES查询操作

/** * * method_name:simpleSearch * date:2016年11月4日上午11:10:53 * author:terry * return_type:List<Map<String,Object>> * description:简单查询 */ public static List<Map<String,Object>> simpleSearch(String alias,String[] indexNames,String[]