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。
這些參數可以分別繼承一個過濾條件或者一個過濾條件的數組:
{
"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
}
}
}
}
如果我們希望兩個字段進行匹配,其中一個字段有這個文檔就滿足的話,使用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
}
}