ElasticSearch 中 match、match_phrase、query_string 和 term 的区别

一、text字段和keyword字段的区别

在了解这些查询之前的区别之前,先了解一下text字段和keyword字段的区别:

  • 创建索引和类型,引入keyword字段
PUT my_index
{
  "mappings": {
    "properties": {
      "name":{
        "type": "keyword"
      }
    }
  }
}
GET /my_index
可以看到已经创建好了,字段的类型是keyword

ElasticSearch 中 match、match_phrase、query_string 和 term 的区别

默认的索引类型就是_doc
ElasticSearch 中 match、match_phrase、query_string 和 term 的区别

添加一条数据

POST /my_index/_doc/1
{
  "name":"first test"
}

然后查询

GET /my_index/_search
{
  "query": {
    "term": {
      "name":"first"
    }
  }
}

GET /my_index/_search
{
  "query": {
    "term": {
      "name":"test"
    }
  }
}

可以看到没有查到任何数据
ElasticSearch 中 match、match_phrase、query_string 和 term 的区别

然后查询

GET /my_index/_search
{
  "query": {
    "term": {
      "name": "first test"
    }
  }
}

可以看到匹配到了数据
ElasticSearch 中 match、match_phrase、query_string 和 term 的区别
所以将字段设置为keyword,查询的时候已有的值不会被分词

  • 现在添加一个text类型的字段
PUT /my_index/_mapping
{
  "properties":{
    "tag":{
      "type":"text"
    }
  }
}

GET /my_index

ElasticSearch 中 match、match_phrase、query_string 和 term 的区别
往之前已经创建的doc之中添加tag的数据:

POST /my_index/_doc/1
{
  "name":"first test",
  "tag":"second test"
}

或者使用
(推荐)
POST /my_index/_doc/1/_update
{
  "doc":{
    "tag":"second test"
  }
}

ElasticSearch 中 match、match_phrase、query_string 和 term 的区别

可以看到数据已经进去了
ElasticSearch 中 match、match_phrase、query_string 和 term 的区别

然后对tag字段进行查询:

POST /my_index/_search
{
  "query": {
    "term": {
      "tag": "second"
    }
  }
}

POST /my_index/_search
{
  "query": {
    "term": {
      "tag": "test"
    }
  }
}

ElasticSearch 中 match、match_phrase、query_string 和 term 的区别
现在输入全部的查询:

POST /my_index/_search
{
  "query": {
    "term": {
      "tag": "second test"
    }
  }
}

ElasticSearch 中 match、match_phrase、query_string 和 term 的区别
说明text类型的字段会被分词,查询的时候如果使用拆开查可以查到,但是要直接使用全部查询,就查不到。
注意:”1, 2”会被拆分为[1,2],但是”1,2”是不会被拆分的,因为之间少了个空格。

二、match和term的区别

ElasticSearch 中 match、match_phrase、query_string 和 term 的区别

1、term

1)、term查询keyword字段

term不会分词,而keyword字段也不分词。需要完全匹配才可以

ElasticSearch 中 match、match_phrase、query_string 和 term 的区别

但是如果分词查询,会无法匹配到对应的数据

ElasticSearch 中 match、match_phrase、query_string 和 term 的区别

2)、term查询keyword字段

因为text字段会分词,而term不会分词,所以term查询条件必须是text字段分词后的某一个

ElasticSearch 中 match、match_phrase、query_string 和 term 的区别
如果是输入全部查询:

ElasticSearch 中 match、match_phrase、query_string 和 term 的区别
或者部分输入
ElasticSearch 中 match、match_phrase、query_string 和 term 的区别

查询失败,因为现在的tag已经被分词了,存储是[listen,to,music]

2、match查询text字段

match分词,text也分词,只要match的分词结果和text的分词结果有相同就匹配

ElasticSearch 中 match、match_phrase、query_string 和 term 的区别
成功。如果都不相同就失败了。

3、match_phrase

1)、match_phrase匹配keyword字段

match_phrase会被分词,而keyword不会被分词,match_phrase的需要和keyword完全匹配才可以
ElasticSearch 中 match、match_phrase、query_string 和 term 的区别
只有这种情况才是成功的

2)match_phrase匹配text字段

match_phrase是分词的,text也是分词的。match_phrase的分词结果必须再text字段分词中都包含,而且顺序必须相同,而且必须都是连续的

ElasticSearch 中 match、match_phrase、query_string 和 term 的区别

如果不是连续的,就会失败

ElasticSearch 中 match、match_phrase、query_string 和 term 的区别

4、query_string

1)query_string查询key类型的字段,必须是全部匹配

ElasticSearch 中 match、match_phrase、query_string 和 term 的区别

2)query_string查询text类型的字段

和match_phrase区别的是,query_string查询text类型字段,不需要连续,顺序还可以调换

ElasticSearch 中 match、match_phrase、query_string 和 term 的区别

ElasticSearch 中 match、match_phrase、query_string 和 term 的区别

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 1

写的很棒学习了

2个月前 评论
HuDu (楼主) 2个月前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!