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

一)text字段和keyword字段的區別

以下給出一個例子:

首先建立一個索引和類型,引入一個keywork的字段:

複製代碼

PUT my_index
{
  "mappings": {
    "products": {
      "properties": {
        "name": {
          "type": "keyword"
        }
      }
    }
  }
}

複製代碼

然後查詢是否有索引:

GET _cluster/state

可以看到已經創建成功:

 

添加一條數據:

POST my_index/products
{
  "name":"washing machin"
}

然後查詢:

複製代碼

GET my_index/products/_search
{
  "query": {
    "term": {
      "name": "washing"
    }
  }
}

複製代碼

可以看到沒有匹配到任何數據:

然後查詢:

複製代碼

GET my_index/products/_search
{
  "query": {
    "term": {
      "name": "washing machine"
    }
  }
}

複製代碼

可以看到成功匹配到了數據:

所以將字段設置成keyword的時候查詢的時候已有的值不會被分詞。

現在添加一個text類型的字段:

複製代碼

PUT my_index/_mapping/products?update_all_types
{
  "properties": {
      "tag": {
        "type": "text"
      }
  }
}

複製代碼

 

可以看到添加成功:

 

往之前已經創建的doc之中添加tag的數據:

POST my_index/products/AWf9f66WV8yLH435XhgI
{
  "name":"washing machine",
  "tag":"electric household"
}

查詢一下,可以看到:

然後對tag字段進行查詢:

複製代碼

POST  /my_index/products/_search
{
  "query": {
    "term": {
      "tag": "household"
    }
  }
}

複製代碼

可以看到雖然沒有全部輸入,但是已經查詢到了:

現在輸入全部的查詢:

複製代碼

POST  /my_index/products/_search
{
  "query": {
    "term": {
      "tag": "electric household"
    }
  }
}

複製代碼

 發現現在已經查詢不到了:

 

說明text類型的字段會被分詞,查詢的時候如果用拆開查可以查詢的到,但是要是直接全部查,就是查詢不到。

注意「1, 2」會被拆分成[1, 2],但是"1,2"是不拆分的,少了個空格。

(二)match和term的區別

 

 1.term

 1)term查詢keyword字段。

 term不會分詞。而keyword字段也不分詞。需要完全匹配纔可。

 

成功。

但是如果:

則查詢失敗。

 2)term查詢text字段。

因爲text字段會分詞,而term不分詞,所以term查詢的條件必須是text字段分詞後的某一個。

 

查詢成功。

查詢失敗,因爲現在tag已經被分詞了,存儲的是[he, is, silly, man]。

 這樣查詢:

也是失敗了,道理跟上面的是一樣的。

2.

1)match查詢keyword字段

match會被分詞,而keyword不會被分詞,match的需要跟keyword的完全匹配可以。

 

其他的不完全匹配的都是失敗的。

2)match查詢text字段

match分詞,text也分詞,只要match的分詞結果和text的分詞結果有相同的就匹配。

成功。如果都不相同就失敗了。

3.

1)match_phrase匹配keyword字段。

這個同上必須跟keywork一致纔可以。

只有這種情況纔是成功的。

2)match_phrase匹配text字段。

match_phrase是分詞的,text也是分詞的。match_phrase的分詞結果必須在text字段分詞中都包含,而且順序必須相同,而且必須都是連續的。

這是成功的。

如果不是連續的,就會失敗。

 4.

1)query_string查詢key類型的字段,試過了,無法查詢。

失敗的,無法查詢。

2)query_string查詢text類型的字段。

和match_phrase區別的是,不需要連續,順序還可以調換。

成功。

這樣也是可以的。