Elasticsearch 5.0 開始,就把 string 這個 data type 給一分為二。
string 根據情況選用
- text: 用來做 full-text search ,也就是以前的 analyzed string type
- keyword: 適合用來做一整個字串當作一個關鍵字,也就是之前的 not_analyzed string
再沒有設定 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
沒有留言:
張貼留言