Elasticsearch中當咱們設置Mapping(分詞器、字段類型)完畢後,就能夠按照設定的方式導入數據。mysql
有了數據後,咱們就須要對數據進行檢索操做。根據實際開發須要,每每咱們須要支持包含但不限於如下類型的檢索:
1)精確匹配,相似mysql中的 「=」操做;
2)模糊匹配,相似mysql中的」like %關鍵詞% 「查詢操做;
3)前綴匹配;
4)通配符匹配;
5)正則表達式匹配;
6)跨索引匹配;
7)提高精讀匹配。正則表達式
細數一下,咱們的痛點在於:
1)ES究竟支持哪些檢索操做?
2)如何實現ES精確值檢索、指定索引檢索、全文檢索?sql
這些就是本文着重參考ES最新官方文檔,針對ES5.X版本探討的內容。緩存
檢索子句的行爲取決於查詢應用於過濾(filter)上下文仍是查詢/分析(query)上下文。app
過濾上下文——對應於結構化檢索less
1)核心回答的問題是:「這個文檔是否符合這個查詢條款?」 2)答案是簡單的是或否,不計算分數。 3)過濾器上下文主要用於過濾結構化數據。相似於Mysql中斷定某個字段是否存在:
例如: post
a. 時間戳字段:是否屬於2015年或2016年?
b. 狀態字段:是否設置爲「已發佈」?性能
常常使用的過濾器將被Elasticsearch**自動緩存,以加快性能**。spa
分析上下文——對應於全文檢索
1)核心回答了「本文檔與此查詢子句是否匹配?」的問題。.net
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」的所有信息。如下,以「腦圖」的形式直觀展現檢索分類:
如下內容的原文須要參考ES官方文檔(隨着版本變化,後續會有更新)
針對字段類型: 日期、時間、數字類型,以及精確的文本匹配。
結構化檢索特色:
* 1)結構化查詢,咱們獲得的結果 老是 非是即否,要麼存於集合之中,要麼存在集合以外。
* 2)結構化查詢不關心文件的相關度或評分;它簡單的對文檔包括或排除處理。
term 查詢會查找咱們指定的精確值。term 查詢是簡單的,它接受一個字段名以及咱們但願查找的數值。
想要相似mysql中以下sql語句的查詢操做:
SELECT document FROM products WHERE price = 20;
DSL寫法:
GET /my_store/products/_search { "query" : { "term" : { "price" : 20 } } }
當進行精確值查找時, 咱們會使用過濾器(filters)。過濾器很重要,由於它們執行速度很是快,不會計算相關度(直接跳過了整個評分階段)並且很容易被緩存。以下: 使用 constant_score 查詢以非評分模式來執行 term 查詢並以一做爲統一評分。
GET /my_store/products/_search { "query" : { "constant_score" : { "filter" : { "term" : { "price" : 20 } } } } }
注意:5.xES中,對於字符串類型,要進行精確值匹配。須要講類型設置爲text和keyword兩種類型。mapping設置以下:
POST testindex/testtype/_mapping { "testtype ":{ "properties":{ "title":{ "type":"text", "analyzer":"ik_max_word", "search_analyzer":"ik_max_word", "fields":{ "keyword":{ "type":"keyword" } } } } }
一個 bool 過濾器由三部分組成:
{ "bool" : { "must" : [], "should" : [], "must_not" : [], "filter": [] } }
must ——全部的語句都 必須(must) 匹配,與 AND 等價。
must_not ——全部的語句都 不能(must not) 匹配,與 NOT 等價。
should ——至少有一個語句要匹配,與 OR 等價。
filter——必須匹配,運行在非評分&過濾模式。
就這麼簡單! 當咱們須要多個過濾器時,只須將它們置入 bool 過濾器的不一樣部分便可。
舉例:
GET /my_store/products/_search { "query" : { "filtered" : { "filter" : { "bool" : { "should" : [ { "term" : {"price" : 20}}, { "term" : {"productID" : "XHDK-A-1293-#fJ3"}} ], "must_not" : { "term" : {"price" : 30} } } } } } }
{ "terms" : { "price" : [20, 30] } }
如上,terms是包含的意思,包含20或者包含30。
以下實現嚴格意義的精確值檢索, tag_count表明必須匹配的次數爲1。
GET /my_index/my_type/_search { "query": { "constant_score" : { "filter" : { "bool" : { "must" : [ { "term" : { "tags" : "search" } }, { "term" : { "tag_count" : 1 } } ] } } } } }
range 查詢可同時提供包含(inclusive)和不包含(exclusive)這兩種範圍表達式,可供組合的選項以下:
gt: > 大於(greater than) lt: < 小於(less than) gte: >= 大於或等於(greater than or equal to) lte: <= 小於或等於(less than or equal to)
相似Mysql中的範圍查詢:
SELECT document FROM products WHERE price BETWEEN 20 AND 40
ES中對應的DSL以下:
GET /my_store/products/_search { "query" : { "constant_score" : { "filter" : { "range" : { "price" : { "gte" : 20, "lt" : 40 } } } } } }
mysql中,有以下sql:
SELECT tags FROM posts WHERE tags IS NOT NULL;
ES中,exist查詢某個字段是否存在:
GET /my_index/posts/_search { "query" : { "constant_score" : { "filter" : { "exists" : { "field" : "tags" } } } } }
https://blog.csdn.net/laoyang360/article/details/77623013 1.3接着往下面開始