ElasticSearch入門常用查詢語句


es中的查詢請求有兩種方式,一種是簡易版的查詢,另外一種是使用JSON完整的請求體,叫做結構化查詢(DSL)。
由於DSL查詢更爲直觀也更爲簡易,所以大都使用這種方式。
DSL查詢是POST過去一個json,由於post的請求是json格式的,所以存在很多靈活性,也有很多形式



1. range過濾

range過濾允許我們按照指定範圍查找一批數據:

{ 
    "range": { 
        "age": { 
            "gte":  20, 
            "lt":   30 
        } 
    } 
}

範圍操作符包含:

  • gt :: 大於
  • gte:: 大於等於
  • lt :: 小於
  • lte:: 小於等於
2. bool過濾

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   }} 
        ] 
    } 
}


3. bool查詢

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
    }
}

















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章