1.ES5.0及以后的版本取消了string
類型绑青,將原先的string
類型拆分為text
和keyword
兩種類型邪乍。它們的區(qū)別在于text
會對字段進行分詞處理而keyword
則不會。這就是造成部分字段還會自動生成一個與之對應(yīng)的“.keyword”字段的原因庇楞。
Text vs. keyword
Text:會分詞聂使,然后進行索引
支持模糊弃理、精確查詢
不支持聚合
keyword:不進行分詞,直接索引
支持模糊驻啤、精確查詢
支持聚合
2.當(dāng)你沒有以IndexTemplate等形式為你的索引字段預(yù)先指定mapping的話贼涩,ES就會使用Dynamic Mapping占锯,通過推斷你傳入的文檔中字段的值對字段進行動態(tài)映射。例如傳入的文檔中字段price的值為12,那么price將被映射為long
類型稽穆;字段addr的值為"192.168.0.1"赶撰,那么addr將被映射為ip
類型。然而對于不滿足ip和date格式的普通字符串來說豪娜,情況有些不同:ES會將它們映射為text類型,但為了保留對這些字段做精確查詢以及聚合的能力否灾,又同時對它們做了keyword類型的映射惕虑,作為該字段的fields屬性寫到_mapping中。例如溃蔫,當(dāng)ES遇到一個新的字段"foobar": "some string"時琳猫,會對它做如下的Dynamic Mapping:
{
"foobar": {
"type" "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
在之后的查詢中使用foobar是將foobar作為text類型查詢,而使用foobar.keyword則是將foobar作為keyword類型查詢统刮。前者會對查詢內(nèi)容做分詞處理之后再匹配账千,而后者則是直接對查詢結(jié)果做精確匹配。
3.ES的term query做的是精確匹配而不是分詞查詢鞭衩,因此對text類型的字段做term查詢將是查不到結(jié)果的(除非字段本身經(jīng)過分詞器處理后不變,未被轉(zhuǎn)換或分詞)论衍。此時,必須使用foobar.keyword來對foobar字段以keyword類型進行精確匹配坯台。