2017年7月21日 星期五

[elasticsarch] Elasticsearch 5 的 string 要設成 text 還是 keyword 怎麼使用 term query 與 match query


Elasticsearch 5.0 開始,就把 string 這個 data type 給一分為二。


string 根據情況選用

  • text: 用來做 full-text search ,也就是以前的 analyzed string type
  • keyword: 適合用來做一整個字串當作一個關鍵字,也就是之前的 not_analyzed string

the string field has split into two new types: text, which should be used for full-text search, and keyword, which should be used for keyword search.

再沒有設定 string 的 type 的時候,elasticsearch 預設使用了從logstash 借鑑來的mapping概念。
string 將會同時產生,text 與keyword 兩個 type 。

{
  "foo": "bar"
}
Then the following dynamic mappings will be created:
{
  "foo": {
    "type" "text",
    "fields": {
      "keyword": {
        "type": "keyword",
        "ignore_above": 256
      }
    }
  }
}

所以,我們可以方便的使用 full-text search 在 foo 這個欄位。
如果要做 keyword search/term query 或是 aggregations 在 foo.keyword 這個欄位。

舉個例子來說,

PUT my_index/my_type/1
{
  "full_text":   "Quick Foxes!", 
  "exact_value": "Quick Foxes!"  
}

先建立一個 document ,這個 document 是預設的 mapping 。
可使用 GET my_index/_mapping 查看。


GET my_index/my_type/_search
{
  "query": {
    "term": {
      "exact_value": "Quick Foxes!" 
    }
  }
}

GET my_index/my_type/_search
{
  "query": {
    "term": {
      "full_text": "Quick Foxes!" 
    }
  }
}

這兩個 term query 並不會有hit 的  record。
因為 term query 是把值當作要 inverted index 查找的 term 。

(The term query looks for the exact term in the field’s inverted index — it doesn’t know anything about the field’s analyzer. )

而使用這樣的query就可以 hit 到
GET my_index/my_type/_search
{
  "query": {
    "term": {
      "exact_value.keyword": "Quick Foxes!" 
    }
  }
}
或是
GET my_index/my_type/_search
{
  "query": {
    "term": {
      "full_text": "foxes" 
    }
  }
}

也可以使用 match query 已下面的例子(type 是 text 也就是 analyzed 的 string)來看,會找出包含 quick 或 foxes 或是兩者都有的 document。
GET my_index/my_type/_search
{
  "query": {
    "match": {
      "full_text": "Quick Foxes!" 
    }
  }
}



Elasticsearch replaces string type with two new types text and keyword. | Elastic
https://www.elastic.co/blog/strings-are-dead-long-live-strings
Term Query | Elasticsearch Reference [5.5] | Elastic
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html


沒有留言:

張貼留言