第九章:深入搜尋--結構化搜尋
一.精確搜尋,多個精確搜尋
1.term
查詢
term
查詢可以用它處理數字(numbers)、布林值(Booleans)、日期(dates)以及文字(text).
使用bulk建立檔案文件
POST /my_store/products/_bulk { "index": { "_id": 1 }} { "price" : 10, "productID" : "XHDK-A-1293-#fJ3" } { "index": { "_id": 2 }} { "price" : 20, "productID" : "KDKE-A-9947-#kL5" } { "index": { "_id": 3 }} { "price" : 30, "productID" : "JODL-X-1937-#pV7" } { "index": { "_id": 4 }} { "price" : 30, "productID" : "QQPX-R-3956-#aD8" } { "index": { "_id": 5 }} { "price" : 40, "productID" : "你好ds" }
term處理數字 :
在 Elasticsearch 的查詢表示式(query DSL)中,使用 term
查詢會查詢我們指定的精確值。
constant_score
: 查詢以非評分模式
GET /my_store/products/_search
{
"query": {
"constant_score": {
"filter": {
"term": {
"price":40
}
}
}
}
}
term處理文字: 在處理文字的時候,ES的analyze
API會把文字才分成一個單詞,大寫的會變成小寫,特殊的字元會進行過濾
例如 :"XHDK-A-1293-#fJ3" 會才分成 "xhdk", "a","1293","fj3"
可以使用 GET /{索引}/_analyze 語法進行查詢才分的情況,如下
GET /my_store/_analyze { "field": "productID", "text": "XHDK-A-1293-#fJ3" }
term的文字查詢
GET /my_store/products/_search { "query" : { "_score" : { "filter" : { "terms" : { "productID": ["a","你"] } } } } }
2.多個精確搜尋
多個精確搜尋,只要在 term
後面加個s
GET /my_store/products/_search { "query" : { "constant_score" : { "filter" : { "terms" : { "price" : [20, 30] } } } } }
二.組合過濾器
1.bool查詢
bool
(布林)過濾器。 這是個 複合過濾器(compound filter) ,它可以接受多個其他過濾器作為引數,並將這些過濾器結合成各式各樣的布林(邏輯)組合。
bool
過濾器由三部分組成:
{ "bool" : { "must" : [], "should" : [], "must_not" : [], } }
must
: 所有的語句都 必須(must) 匹配,與 AND
等價。
must_not
: 所有的語句都 不能(must not) 匹配,與 NOT
等價。
should
: 至少有一個語句要匹配,與 OR
等價.
如此sql:
SELECT product FROM products
WHERE (price = 20 OR productID = "XHDK-A-1293-#fJ3")
AND (price != 30)
Elasticsearch中用bool表達此sql的語句 如下:
GET /my_store/products/_search { "query" : { "constant_score": { "filter" : { "bool" : { "should" : [//自少有一個條件符合 { "term" : {"price" : 20}}, { "term" : {"productID" : "fj3"}} ], "must_not" : {//排除條件 "term" : {"price" : 30} } } } } } }
三.範圍查詢
range
查詢
range
查詢可同時提供包含(inclusive)和不包含(exclusive)這兩種範圍表示式,可供組合的選項如下:
gt
:>
大於(greater than)lt
:<
小於(less than)gte
:>=
大於或等於(greater than or equal to)lte
:<=
小於或等於(less than or equal to)
如下事例:
GET /my_store/products/_search { "query" : { "constant_score" : { "filter" : { "range" : { "price" : { "gte" : 20, "lt" : 40 } } } } } }
四.處理NULL值
1.exists
exists
:判斷不是NULL 與sql的 is not null 相同
使用ES的exists
表示 tags IS NOT NULL的判斷
SELECT tags FROM posts WHERE tags IS NOT NULL
如下
GET /my_index/posts/_search { "query" : { "constant_score" : { "filter" : { "exists" : { "field" : "tags" } } } } }
2.missing :
判斷是NULL 與sql的 is null 相同
使用ES的missing
表示 tags IS NULL的判斷
SELECT tags FROM posts WHERE tags IS NULL
如下:
GET /my_index/posts/_search { "query" : { "constant_score" : { "filter": { "missing" : { "field" : "tags" } } } } }