text類型
1:支持分詞,全文檢索,支持模糊、精確查詢,不支持聚合,排序操作;
2:test類型的最大支持的字符長度無限制,適合大字段存儲;
使用場景:
存儲全文搜索數據, 例如: 郵箱內容、地址、代碼塊、博客文章內容等。
默認結合standard analyzer(標准解析器)對文本進行分詞、倒排索引。
默認結合標准分析器進行詞命中、詞頻相關度打分。
keyword
1:不進行分詞,直接索引,支持模糊、支持精確匹配,支持聚合、排序操作。
2:keyword類型的最大支持的長度為——32766個UTF-8類型的字符,可以通過設置ignore_above指定自持字符長度,超過給定長度后的數據將不被索引,無法通過term精確匹配檢索返回結果。
使用場景:
存儲郵箱號碼、url、name、title,手機號碼、主機名、狀態碼、郵政編碼、標簽、年齡、性別等數據。
用於篩選數據(例如: select * from x where status='open')、排序、聚合(統計)。
直接將完整的文本保存到倒排索引中。
Dynamic
dynamic屬性:默認值為true,允許動態地向文檔類型中加入新的字段。推薦設置為false,禁止向文檔中添加字段,這樣,文檔類型的所有字段必須在索引映射的properties屬性中顯式定義,在properties字段中未定義的字段都將會ElasticSearch忽略。
dynamic設置為ture:默認值,新增加的字段被添加到索引映射中;
dynamic設置為false:新增加的字段會被忽略;
dynamic設置為strict:當向文檔中新增字段時,ElasticSearch引擎拋出異常;
# index
index定義字段的分析類型以及檢索方式,控制字段值是否被索引.他可以設置成 true 或者 false。沒有被索引的字段將無法搜索
如果是no,則無法通過檢索查詢到該字段;
如果設置為not_analyzed則會將整個字段存儲為關鍵詞,常用於漢字短語、郵箱等復雜的字符串;
如果設置為analyzed則將會通過默認的standard分析器進行分析
# 集群分片
Elasticsearch 有一個硬編碼限制,單個分片內的文檔總數不得超過 2147483519 個。
一般來說這個限制在日志場景下是不太會觸發的,但是如果做 TSDB 用,則需要多加注意!
ES更新到5版本后,取消了 string 數據類型,代替它的是 keyword 和 text 數據類型.那么 text 和keyword有什么區別呢?
# 添加數據
使用bulk往es數據庫中批量添加一些document
POST /book/novel/_bulk
{"index": {"_id": 1}}
{"name": "Gone with the Wind", "author": "Margaret Mitchell", "date": "2018-01-01"}
{"index": {"_id": 2}}
{"name": "Robinson Crusoe", "author": "Daniel Defoe", "date": "2018-01-02"}
{"index": {"_id": 3}}
{"name": "Pride and Prejudice", "author": "Jane Austen", "date": "2018-01-01"}
{"index": {"_id": 4}}
{"name": "Jane Eyre", "author": "Charlotte Bronte", "date": "2018-01-02"}
# 查看mapping
發現name、author的type是text,
還有個field是keyword,keyword的type是keyword:

# 查詢
使用term查詢某個小說:
GET book/novel/_search
{
"query": {
"constant_score": {
"filter": {
"term": {
"name": "Gone with the Wind"
}
},
"boost": 1.2
}
}
}
結果是什么也沒有查到:

然后使用name的keyword查詢:
GET book/novel/_search
{
"query": {
"constant_score": {
"filter": {
"term": {
"name.keyword": "Gone with the Wind"
}
},
"boost": 1.2
}
}
}
可以查詢到一條數據:

# 實驗
使用name不能查到,而使用name.keyword可以查到,我們可以通過下面的實驗來判斷:
使用name進行分詞的時候,結果會有4個詞出來:

使用name.keyword進行分詞的時候,結果只有一個詞出來:

# 結論
text類型:會分詞,先把對象進行分詞處理,然后再再存入到es中。
當使用多個單詞進行查詢的時候,當然查不到已經分詞過的內容!
keyword:不分詞,沒有把es中的對象進行分詞處理,而是存入了整個對象!
這時候當然可以進行完整地查詢!默認是256個字符!
作者:香山上的麻雀
鏈接:https://www.jianshu.com/p/1189ff372c38
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。