ElasticSearch入門常用查詢語句
es中的查詢請求有兩種方式,一種是簡易版的查詢,另外一種是使用JSON完整的請求體,叫做結構化查詢(DSL)。
由於DSL查詢更為直觀也更為簡易,所以大都使用這種方式。
DSL查詢是POST過去一個json,由於post的請求是json格式的,所以存在很多靈活性,也有很多形式
1. range過濾
range過濾允許我們按照指定範圍查詢一批資料:
{
"range": {
"age": {
"gte": 20,
"lt": 30
}
}
}
範圍操作符包含:
- gt :: 大於
- gte:: 大於等於
- lt :: 小於
- lte:: 小於等於
bool 過濾可以用來合併多個過濾條件查詢結果的布林邏輯,它包含一下操作符:
- must :: 多個查詢條件的完全匹配,相當於 and。
- must_not :: 多個查詢條件的相反匹配,相當於 not。
- should :: 至少有一個查詢條件匹配, 相當於 or。
這些引數可以分別繼承一個過濾條件或者一個過濾條件的陣列:
3. bool查詢{ "bool": { "must": { "term": { "folder": "inbox" }}, "must_not": { "term": { "tag": "spam" }}, "should": [ { "term": { "starred": true }}, { "term": { "unread": true }} ] } }
bool 查詢與 bool 過濾相似,用於合併多個查詢子句。不同的是,bool 過濾可以直接給出是否匹配成功, 而bool 查詢要計算每一個查詢子句的 _score (相關性分值)。
- must:: 查詢指定文件一定要被包含。
- must_not:: 查詢指定文件一定不要被包含。
- should:: 查詢指定文件,有則可以為文件相關性加分。
以下查詢將會找到 title 欄位中包含 "how to make millions",並且 "tag" 欄位沒有被標為 spam。 如果有標識為 "starred" 或者釋出日期為2014年之前,那麼這些匹配的文件將比同類網站等級高:
{ "bool": { "must": { "match": { "title": "how to make millions" }}, "must_not": { "match": { "tag": "spam" }}, "should": [ { "match": { "tag": "starred" }}, { "range": { "date": { "gte": "2014-01-01" }}} ] } }
提示: 如果bool 查詢下沒有must子句,那至少應該有一個should子句。但是 如果有must子句,那麼沒有should子句也可以進行查詢。
4. match語句
最簡單的一個match例子:
查詢和"我的寶馬多少馬力"這個查詢語句匹配的文件
{
"query": {
"match": {
"content" : {
"query" : "我的寶馬多少馬力"
}
}
}
}
上面的查詢匹配就會進行分詞,比如"寶馬多少馬力"會被分詞為"寶馬、
多少 、馬力", 所有有關"寶馬、 多少、 馬力", 那麼所有包含這三個詞中的一個或多個的文件就會被搜尋出來5. match_phrase
比如上面一個例子,一個文件"我的保時捷馬力不錯"也會被搜尋出來,那麼想要精確匹配所有同時包含"寶馬
多少 馬力"的文件怎麼做?就要使用 match_phrase 了
{
"query": {
"match_phrase": {
"content" : {
"query" : "我的寶馬多少馬力"
}
}
}
}
完全匹配可能比較嚴,我們會希望有個可調節因子,少匹配一個也滿足,那就需要使用到slop
{
"query": {
"match_phrase": {
"content" : {
"query" : "我的寶馬多少馬力",
"slop" : 1
}
}
}
}
6. multi_macth
如果我們希望兩個欄位進行匹配,其中一個欄位有這個文件就滿足的話,使用multi_match
{
"query": {
"multi_match": {
"query" : "我的寶馬多少馬力",
"fields" : ["title", "content"]
}
}
}
但是multi_match就涉及到匹配評分的問題了
7. term
term是代表完全匹配,即不進行分詞器分析,文件中必須包含整個搜尋的詞彙
{
"query": {
"term": {
"content": "汽車保養"
}
}
}
查出的所有文件都包含"汽車保養"這個片語的詞彙
8. Teams聚合
它是按照某個欄位中的值來分類。
9. minimum_should_match
引數定義了至少滿足幾個子句,在一個Bool查詢中,如果沒有must或者filter,有一個或者多個should子句,那麼只要滿足一個就可以返回。
{
"bool" : {
"must" : {
"term" : { "user" : "kimchy" }
},
"filter": {
"term" : { "tag" : "tech" }
},
"must_not" : {
"range" : {
"age" : { "from" : 10, "to" : 20 }
}
},
"should" : [
{
"term" : { "tag" : "wow" }
},
{
"term" : { "tag" : "elasticsearch" }
}
],
"minimum_should_match" : 1,
"boost" : 1.0
}
}