Elasticsearch 6.x版本全文檢索學習之Search API

Elasticsearch 6.x版本全文檢索學習之Search API。java

1)、Search API,實現對es中存儲的數據進行查詢分析,endpoind爲_search,以下所示。正則表達式

  方式1、GET /_search,對es中全部的數據進行查詢。
  方式2、GET /my_index/_search,針對單個索引的數據進行查詢。
  方式3、GET /my_index1,my_index2/_search,針對兩個索引的數據進行查詢。
  方式4、GET /my_*/_search,指定索引查詢,能夠一次查詢多個。
api

2)、查詢的主要有兩種形式。數組

  形式1、URI Search。a、優勢,操做簡便,方便經過命令行測試。b、缺點,僅包含部分查詢語法。案例以下:ruby

GET /test_search_index/_search?q=username:al*

  形式2、Request Body Search。a、es提供完備的查詢語法Query DSL語法(Domain Specific Language)。案例以下:
網絡

GET /test_search_index/_search
{
  "query": {
    "term": {
      "username": {
        "value": "alfred"
      }
    }
  }
}

一、URI Search。經過url query參數來實現搜素,經常使用參數以下。學習

1)、q指定查詢的語句,語法爲Query String Syntas。q是關鍵字,後面跟的是查詢的內容。
    term與phrase詞語。語法1、alfred way這種term查詢等效於alfred OR way。語法2、"alfred way"這種phrase詞語查詢,要求前後順序。
    泛查詢。alfred等效於在全部字段去匹配該term。
    指定字段。name:alfred。
2)、df q中不指定字段時候默認查詢的字段,若是不指定,es會查詢全部字段。
3)、sort排序。
4)、timeout指定超時時間,默認不超時。
5)、from,size用於分頁。
6)、Group分組設定,使用括號指定匹配的規則。括號的概念,是將值作一個分組,OR和AND是布爾操做符。括號制定了匹配的優先級。
  (quick OR brown) AND fox。這個方式的意思是值先判斷前面括號內的,再判斷後面的。
測試

  status:(active OR pending)。括號的另外一個概念,就是將關鍵字做爲一個總體,返回statusactive或者pending的全部文檔。ui

  status:active OR pending。若是不加括號的意思是,status的值是active的,或者全部文檔有pending值的文檔。url

  title:(full text search)。類比上面便可。

7)、GET /test_search_index/_search?q=alfred&df=username&sort=age:asc&from=1&size=10&timeout=1s

  解釋:查詢username字段包含alfred的文檔,結果按照age升序排列,返回第1~3個文檔,若是超過1s沒有結束,則以超時結束。

泛查詢的使用以下所示:    

根據指定字段進行查詢、term與phrase詞語、Group分組設定。

二、布爾操做符。

a、AND(&&)、OR(||)、NOT(!)。操做符必須,注意大寫,不能小寫。
    舉例:name:(tom NOT lee)。name裏面不要有lee的,可是能夠包含tom的。

b、+、-分別對應must和must_not。+在url中會被解析爲空格,要使用encode後的結果才能夠,爲%2B。
    舉例:name:(tom +lee -alfred)。返回,必定包含lee,必定不包含alfred,能夠包含tom的文檔。
          name:((lee && !alfred) || (tom && lee && !alfred))。和上面同樣效果的。

三、範圍查詢,支持數值和日期。

a、區分寫法,閉區間用[],開區間用{}。
    舉例以下所示。
        age:[1 TO 10],意爲1<=age<=10。
        age:[1 TO 10},意爲1<=age<10。
        age:[1 TO * ],意爲age>=1。
        age:[* TO 10],意爲age<=10。
b、算數符合寫法。
    舉例以下所示。
        age:>1
        age:(>=1&&<=10)或者age:(+>=1 +<=10)。

四、通配符查詢。

a、?表明1個字符,*表明0或者多個字符。
    舉例以下所示。
        name:t?m。
        name:tom*。
        name:t*m。
b、通配符匹配執行效率低,且佔用較多內存,不建議使用,若是無特殊需求,不要將?/*放在最前面。

c、正則表達式匹配。
    舉例以下所示。
        name:/[mb]oat/。返回全部包含moat的文檔或者包含boat的文檔。

五、模糊匹配fuzzy query、近似度查詢proximity search。

a、模糊匹配fuzzy query。
    舉例以下所示。
        name:roam~1。
        匹配與roam差1個character的詞,好比foam、roams等等。
b、近似度查詢proximity search。
    舉例以下所示。
        "fox quick"~5。
        以term爲單位進行差別比較,好比"quick fox"、"quick brown fox"都會被匹配。

 六、Request Body Search,將查詢語句經過http request body發送到es,主要包含以下參數。query符合Query DSL語法的查詢語句。包含query、from、size、timeout、sort等等關鍵查詢參數。

1)、基於JSON定義的查詢語句,主要包含以下兩種類型。
  a、字段類查詢,如term(針對詞的查詢)、match(針對全文檢索的查詢)、range(針對範圍的查詢)等等,只針對某一個字段進行查詢。
  b、複合查詢,如bool查詢(符合查詢關鍵字)等等,包含一個或者多個字段類查詢或者複合查詢語句。

2)、字段類查詢主要包含如下兩類。
  a、全文匹配,針對text類型的字段進行全文檢索,會對查詢語句先進行分詞處理,而後拿着分詞結果去es中存倒排索引的term匹配,如match、match_phrase(詞語查詢)等等query類型。
  b、單詞匹配,不會對查詢語句作分詞處理,直接拿着查詢語句的內容去匹配字段的倒排索引,如term、terms、range等等類型。
3)、Query DSL複合查詢,複合查詢是指包含字段類查詢或者複合查詢的類型,主要包括如下幾類。

方式1、constant_score query。
  該查詢將其內部的查詢結果文檔得分都設定爲1或者boost的值。多用於結合bool查詢實現自定義得分。
方式2、bool query。
  布爾查詢由一個或者多個布爾子句組成,主要包含以下4個。
    a、filter只過濾符合條件的文檔,不計算相關性得分。
    b、must文檔必須符合must中的全部條件,會影響相關性得分。
    c、must_not文檔必須不符合must_not中的全部條件。
    d、should文檔能夠符合should中的條件,會影響相關性得分。
方式3、dis_max query。
方式4、function_score query。
方式5、boosting query。

Match Phrase Query(詞語類查詢,與Match Query的區別就是待查詢的語句分詞之後,es去匹配的時候,對分詞後的term即詞語有順序要求的),對字段做檢索,有順序要求,API示例以下所示:

Query String Query,相似於URI Search中的q參數查詢。 

Simple Query String Query,相似Query String,可是會忽略錯誤的查詢語法,而且僅支持部分查詢語法。其經常使用的邏輯符號,不能使用AND、OR、NOT等關鍵詞。可使用+代指AND、|代指OR、-代指NOT。

Term Query,Terms Query,將查詢語句做爲整個單詞進行查詢,即不對查詢語句作分詞處理。

Range Query,範圍查詢主要針對數值和日期類型。

針對日期提供的一種更友好的計算方式。
a、now - 1d。基準日期,也能夠是具體的日期,好比2019-01-01,使用具體日期的時候要用||作隔離。
    計算公式,主要有以下3種方式。+1h是加1個小時。-1d是減1天。/d是將時間舍入到天。
b、單位主要有以下幾種。
    y是years,M是months,w是weeks,d是days,h是hours,m是minues,s是seconds。

七、Query DSL複合查詢,複合查詢是指包含字段類查詢或者複合查詢的類型,主要包括如下幾類。

1)、constant_score query。
    該查詢將其內部的查詢結果文檔得分都設定爲1或者boost的值。多用於結合bool查詢實現自定義得分。
2)、bool query。
    布爾查詢由一個或者多個布爾子句組成,主要包含以下4個。
    a、filter只過濾符合條件的文檔,不計算相關性得分。
    b、must文檔必須符合must中的全部條件,會影響相關性得分。
    c、must_not文檔必須不符合must_not中的全部條件。
    d、should文檔能夠符合should中的條件,會影響相關性得分。
3)、dis_max query。
4)、function_score query。
5)、boosting query。

constant_score query。該查詢將其內部的查詢結果文檔得分都設定爲1或者boost的值。多用於結合bool查詢實現自定義得分。 

bool query。布爾查詢由一個或者多個布爾子句組成,主要包含以下4個。 

filter、must、must_not、should,支持數組的,能夠傳條件進去,match query,term query,terms query,score query等等查詢方式。

must_not,關鍵詞,查詢job中包含java關鍵詞,但不包含ruby關鍵詞的文檔列表。

should,關鍵詞,should使用分兩種狀況。
a、bool查詢中只包含should,不包含must查詢。只包含should時,文檔必須知足至少一個條件。

  minimum_should_match能夠控制知足條件的個數或者百分比。

b、bool查詢中同時包含should和must的查詢。

  同時包含should和must的時候,文檔沒必要知足should中的條件,可是若是知足條件,會增長相關性得分。

bool查詢中同時包含should和must的查詢,同時包含should和must的時候,文檔沒必要知足should中的條件,可是若是知足條件,會增長相關性得分。 

Query Context和Filter Context的區別。當一個查詢語句位於Query或者Filter上下文時,es執行的結果會不一樣。

must下的query上下文,會進行相關性算分。須要作相關性算分、須要作全文檢索的的能夠放到query裏面。

filter下的filter上下文,不會影響算分,只會過濾符合條件的文檔。不須要作相關性算分的能夠放到filter裏面,

八、count api,獲取符合條件的文檔數,endpoint爲_count。Source Filter過濾返回結果中_source中的字段,能夠減小網絡IO,主要有以下幾種方式。

 

做者:別先生

博客園:https://www.cnblogs.com/biehongli/

若是您想及時獲得我的撰寫文章以及著做的消息推送,能夠掃描上方二維碼,關注我的公衆號哦。

相關文章
相關標籤/搜索