ElasticSearch 中 match、match_phrase、query_string 和 term 的區別

HuDu發表於2020-11-13

一、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 協議》,轉載必須註明作者和本文連結

相關文章