ElasticSearch基本查詢

布爾查詢

  布爾查詢是最經常使用的組合查詢,不只將多個查詢條件組合在一塊兒,而且將查詢的結果和結果的評分組合在一塊兒。當查詢條件是多個表達式的組合時,布爾查詢很是有用,實際上,布爾查詢把多個子查詢組合(combine)成一個布爾表達式,全部子查詢之間的邏輯關係是與(and)只有當一個文檔知足布爾查詢中的全部子查詢條件時,ElasticSearch引擎才認爲該文檔知足查詢條件。布爾查詢支持的子查詢類型共有四種,分別是:must,should,must_not和filter:html

  • must子句:文檔必須匹配must查詢條件;
  • should子句:文檔應該匹配should子句查詢的一個或多個;
  • must_not子句:文檔不能匹配該查詢條件;
  • filter子句:過濾器,文檔必須匹配該過濾條件,跟must子句的惟一區別是,filter不影響查詢的score

 一般狀況下,should子句是數組字段,包含多個should子查詢,默認狀況下,匹配的文檔必須知足其中一個子查詢條件。sql

若是查詢須要改變默認匹配行爲,查詢DSL必須顯式設置布爾查詢的參數minimum_should_match的值,該參數控制一個文檔必須匹配的should子查詢的數量,我遇到一個布爾查詢語句,其should子句中包含兩個查詢,若是不設置參數minimum_should_match,其默認值是0。建議在布爾查詢中,顯示設置參數minimum_should_match的值數據庫

注:布爾查詢的四個子句,均可以是數組字段,所以,支持嵌套邏輯操做的查詢。數組

例如,對於如下should查詢,一個文檔必須知足should子句中兩個以上的詞條查詢緩存

"should" : [
        {  "term" : { "tag" : "azure" } },
        {  "term" : { "tag" : "elasticsearch" } },
        {  "term" : { "tag" : "cloud" } }
    ],
"minimum_should_match" : 2

布爾查詢的各個子句之間的邏輯關係是與(and),這意味着,一個文檔只有同時知足全部的查詢子句時,該文檔才匹配查詢條件,做爲結果返回。app

在布爾查詢中,對查詢結果的過濾,建議使用過濾(filter)子句和must_not子句,這兩個子句屬於過濾上下文(Filter Context),常用filter子句,使得ElasticSearch引擎自動緩存數據,當再次搜索已經被緩存的數據時,可以提升查詢性能;因爲過濾上下文不影響查詢的評分,而評分計算讓搜索變得複雜,消耗更多CPU資源,所以,filter和must_not查詢減輕搜索的工做負載elasticsearch

查詢和過濾上下文ide

在布爾查詢中,查詢被分爲Query Context 和 Filter Context,查詢上下文由query參數指定,過濾上下文由filter和must_not參數指定。這兩個查詢上下文的惟一區別是:Filter Context不影響查詢的評分(score)。在布爾查詢中,Filter參數和must_not參數使用Filter Context,而must和should使用Query Context,常用Filter Context,引擎會自動緩存數據,提升查詢性能。post

GET _search
{
  "query": { 
    "bool": { 
      "must": [
        { "match": { "title":   "Search"        }}, 
        { "match": { "content": "Elasticsearch" }}  
      ],
      "filter": [ 
        { "term":  { "status": "published" }}, 
        { "range": { "publish_date": { "gte": "2015-01-01" }}} 
      ]
    }
  }
}
View Code

對於上述查詢請求,must子句處於query context中,filter子句處於filter context中:性能

  • 在query context中,must子句將返回同時知足匹配(match)查詢的文檔;
  • 在filter context中,filter子句是一個過濾器,將不知足詞條查詢和範圍查詢條件的文檔過濾掉,而且不影響匹配文檔的score;

參考:ElasticSearch查詢 第五篇:布爾查詢

詞條查詢

  字符串的徹底匹配是指字符的大小寫,字符的數量和位置都是相同的,詞條(term)查詢使用字符的徹底匹配方式進行文本搜索,詞條查詢不會分析(analyze)查詢字符串,給定的字段必須徹底匹配詞條查詢中指定的字符串。因爲詞條查詢的字符串是未經分析(analyzed)的詞條,所以,詞條查詢常常用於結構化的數據,例如,數值,日期等,當用於文本搜索時,最好在索引映射中設置字符串字段不被索引,也就是說,設置index屬性爲not_analyzed,不然,只能對該字段進行單詞條搜索,也可使用多字段(fields)屬性,定義一個不被分析的字段,原始字段用於全文搜索,而多字段用於詞條搜索:

"properties":
{  
    "title":{  "type":"string","index":"analyzed"
               "fields":{ "title_exact":{"type":"string","index":"not_analyzed"} }
    },

1.一、精準查詢:term【至關於sql:field = 1】

  詞條(term)查詢和全文(fulltext)查詢最大的不一樣之處是:

全文查詢首先分析(Analyze)查詢字符串,使用默認的分析器分解成一系列的分詞,term1,term2,termN,而後從索引中搜索是否有文檔包含這些分詞中的一個或多個,若是執行的match查詢,默認的操做符(operator)是,只要文檔的字段值可以匹配任意一個詞條,該文檔就匹配查詢條件;而詞條查詢是字符的徹底匹配,只有當字段的字符徹底匹配【包括大小寫】查詢字符串時,ElasticSearch引擎才斷定文檔匹配查詢條件

詞條查詢:詞條查詢不會分析查詢條件,只有當詞條和查詢字符串徹底匹配時,才匹配搜索。當在未被分析的字段中進行搜索時,和查詢字符串徹底匹配的文檔會被返回;若是在已分析(Analyzed)的字段中進行搜索,詞條必須是小寫的單個詞條,不然,匹配不到任何文檔;

全文查詢:ElasticSearch引擎會先分析(analyze)查詢字符串,將其拆分紅小寫的分詞,只要已分析的字段中包含詞條的任意一個,或所有包含,就匹配查詢條件,返回該文檔;若是不包含任意一個分詞,表示沒有任何文檔匹配查詢條件。

PUT my_index
{
  "mappings": {
    "my_type": {
      "properties": {
        "full_text": {
          "type":  "string" 
        },
        "exact_value": {
          "type":  "string",
          "index": "not_analyzed" 
        }
      }
    }
  }
}

PUT my_index/my_type/1
{
  "full_text":   "Quick Foxes!", 
  "exact_value": "Quick Foxes!"  
}
View Code

字段full_text 默認值被分析的(analyzed),字段exact_value顯式設置不被分析,索引文檔的結果是:在倒排索引中,字段full_text包含兩個分詞:quick和foxes,分詞都是小寫的;而exact_value因爲未被分析,只是整個短語「Quick Foxes!」,只能進行徹底匹配,在查詢條件中,少一個字符或多一個字符,甚至大小寫不一樣都不能匹配。

1.二、通配符查詢:wildcard【至關於sql:field like '張_三*'】

ElsticSearch支持的通配符(wildcard)有2個,分別是:

  • *:0個或多個任意字符
  • ?:任意單個字符

在通配符查詢中,ElasticSearch引擎不會分析查詢字符串,當文檔的字段 匹配通配符查詢條件時,文檔匹配。通配符查詢會使查詢性能變差,爲了提升查詢性能,推薦:查詢字符串不要以通配符開頭,只在查詢字符串中間或末尾使用通配符

{
  "query": {
    "wildcard": {
      "firstname": "Myr*" 
    }
  }
}

1.三、前綴查詢:prefix【至關於sql:field like '張*'】

  前綴匹配查詢是指,文檔的字段包含 以指定的字符(不會被分析)爲前綴的分詞,前綴匹配適用於已分析字段,只能匹配單個分詞的前綴;

也適用於未被分析的字段,這樣,字符串將從原始值的第一個字符開始前綴匹配

{
  "query": {
    "prefix": {
"firstname": "Ma" }}}

1.四、模糊度查詢:fuzzy【經過fuzziness設置能夠錯幾個】

  查找指定字段 包含與指定術語模糊類似的術語的文檔。模糊度是以Levenshtein編輯距離1或2來衡量的。

  • fuzzy搜索技術
  • 搜索的時候,可能輸入的搜索文本會出現誤拼寫的狀況
  • 自動將拼寫錯誤的搜索文本,進行糾正,糾正之後去嘗試匹配索引中的數據
  • 糾正在必定的範圍內若是差異大沒法搜索出來

參數:fuzziness,你的搜索文本最多能夠糾正幾個字母去跟你的數據進行匹配,默認若是不設置,就是2

參數:min_similarity是查詢字符串與數據庫中的字符串匹配的百分比。

參數:max_expansions是Levenshtein距離,經過該距離搜索應該執行。默認50。

1.五、範圍查詢:range【至關於sql:field > 1 and field<30】

  查找指定字段包含指定範圍內的值(日期,數字或字符串)的文檔。

{
    "range" : {
        "age" : {
            "gte" : 10,
            "lte" : 20,
        }
    }
}

範圍查詢使用的比較操做符:

  • gte:大於或等於(Greater-than or equal to)
  • gt:大於(Greater-than)
  • lte:小於或等於(Less-than or equal to)
  • lt:小於(Less-than)

1.六、查詢字符串:query_string

 

1.七、缺失查詢:missing

 missing 過濾能夠用於查找文檔中 沒有某個字段的文檔

總共有3個文檔,查詢一下就剩2個,實際的查詢是轉換爲must_not

參考:ElasticSearch查詢 第三篇:詞條查詢

相關文章
相關標籤/搜索