Elasticsearch檢索分類深入詳解—基礎篇
Elasticsearch中當我們設定Mapping(分詞器、欄位型別)完畢後,就可以按照設定的方式匯入資料。
有了資料後,我們就需要對資料進行檢索操作。根據實際開發需要,往往我們需要支援包含但不限於以下型別的檢索: 1)精確匹配,類似mysql中的 “=”操作; 2)模糊匹配,類似mysql中的”like %關鍵詞% “查詢操作; 3)字首匹配; 4)萬用字元匹配; 5)正則表示式匹配; 6)跨索引匹配; 7)提升精讀匹配。
細數一下,我們的痛點在於: 1)ES究竟支援哪些檢索操作?
2)如何實現ES精確值檢索、指定索引檢索、全文檢索?
這些就是本文著重參考ES最新官方文件,針對ES5.X版本探討的內容。
0、檢索概覽
檢索子句的行為取決於查詢應用於過濾(filter)上下文還是查詢/分析(query)上下文。
過濾上下文——對應於結構化檢索 1)核心回答的問題是:“這個文件是否符合這個查詢條款?”
2)答案是簡單的是或否,不計算分數。
3)過濾器上下文主要用於過濾結構化資料。類似於Mysql中判定某個欄位是否存在: 例如:
- 時間戳欄位:是否屬於2015年或2016年?
- 狀態欄位:是否設定為“已釋出”?
經常使用的過濾器將被Elasticsearch自動快取,以加快效能。
分析上下文——對應於全文檢索 1)核心回答了“本文件與此查詢子句是否匹配?”的問題。
2)除了決定文件是否匹配之外,查詢子句還會計算一個_score,表示文件與其他文件的匹配程度。
綜合應用場景如下:
GET /_search
{ "query": { "bool": { "must": [
{ "match": { "title": "Search" }},
{ "match": { "content": "Elasticsearch" }}
], "filter": [
{ "term": { "status": "published" }},
{ "range": { "publish_date": { "gte": "2015-01-01" }}}
]
}
}
}
以上檢索,title中包含"Search”並且content中包含 “Elasticsearch”,status中精確匹配”published”,並且publish_date 大於“2015-01-01”的全部資訊。
以下,以“腦圖”的形式直觀展示檢索分類。
其中,3-7隨著我開發深入再做更新。