美文网首页
term,match,match_phrase的区别

term,match,match_phrase的区别

作者: 宙斯是只猫 | 来源:发表于2019-07-14 00:40 被阅读0次
  1. term查询是基于词项的查询,而且当设置为term查询时,es不会对这个词做任何处理,但是在文本进行分词时,通常都会将大写转为小写,这个时候就会出现查不出来的情况,比如:
POST /test_2017/_doc
{
  "name":"Pantheon"
}

这样创建出来的doc可以看到明显做了lowercase,因为用的standard分词器
GET /test_2017/_analyze
{
  "field": "name",
  "text": "Pantheon"
  
}

所以当使用下面的语句去查时,会没有结果
GET /test_2017/_search
{
  "query": {
    "term": {
      "name": {
        "value": "Pantheon"
      }
    }
  }
}
所以需要使用es给字段额外添加的一个元数据信息.keyword,在生成文本时,es也会将该字段原封不动的保存到keyword属性当中去,所以下面这个语句可以查询出来

GET /test_2017/_search
{
  "query": {
    "term": {
      "name.keyword": {
        "value": "Pantheon"
      }
    }
  }
}
  1. match 和match_pharse查询都是属于全文查询,全文查询会给当前的句子进行分词,通常来讲,索引的时候咋分的词,查询的时候就是用的什么分词器,默认是不用设置的,但是如果有个别场景,也可以自己设置分词器,ok,他两的区别举个例子,"I am Pantheon",这句话如果用match来查,会搜出字段中有"I","am","Pantheon"的文档,也就是说默认是只要这段话中有这查询几个词的一个就返回文档,当然也可以设置他的'operator'属性为'and',要求查出来的必须包含"I am Pantheon"这几个词",而match_pharse可以精确的查询"I am Pantheon"这一段话,这几个词之间有没有间隔可以通过slot属性来设置,比如设置了slot为1,那就可以查出"I am not Pantheon"这样的句子,举例如下:
POST /test_2017/_bulk
{ "index": { "_id": 1 }}
{ "desc":"I am Pantheon" }
{ "index": { "_id": 2 }}
{ "desc":"I am not Pantheon" }
{ "index": { "_id": 3 }}
{ "desc":"I am Leo" }

### 结果1
GET /test_2017/_search
{
  "query": {
    "match": {
      "desc": "I am Pantheon"
    }
  }
}
### 结果2
GET /test_2017/_search
{
  "query": {
    "match": {
      "desc":{
        "query": "I am Pantheon",
        "operator": "and"
      }
    }
  }
}
### 结果3
GET /test_2017/_search
{
  "query": {
    "match_phrase": {
      "desc":{
        "query": "I am Pantheon"
      }
    }
  }
}
### 结果4
GET /test_2017/_search
{
  "query": {
    "match_phrase": {
      "desc":{
        "query": "I am Pantheon",
        "slop": 1
      }
    }
  }
}
结果1 结果2 结果3 结果4

3.总结
这三种查询都是对分词组合不同的玩法,term查询,只是查分词,不会对查询语句做任何处理,match查询,查询语句分词后对文档是否包含的一种,match_phase是对查询语句分词后,各词项间隔距离多少的玩法

相关文章

网友评论

      本文标题:term,match,match_phrase的区别

      本文链接:https://www.haomeiwen.com/subject/zwmvkctx.html