ElasticStack學習(六):ElasticSearch搜索初探

1、ElasticSearch搜索介紹正則表達式

  一、ElasticSearch搜索方式主要分爲如下兩種:less

    1)、URI Search此種查詢主要是使用Http的Get方法,在URL中使用查詢參數進行查詢;post

    如:http://localhost:9200/kibana_sample_data_ecommerce/_search?q=customer_first_name:Jim學習

    這條URL中,q表示查詢的內容,用來搜索名叫Jim的客戶。用Postman進行查詢,搜索結果以下圖所示:搜索引擎

    

     2)、Request Body Search(DSL查詢)此種查詢是使用ElasticSearch提供的,能夠採用Get或Post的方法,基於JSON格式的更加完備的DSL(Query Domain Specific Language);spa

    如:http://localhost:9200/kibana_sample_data_ecommerce/_search 3d

    在請求體中寫入:    code

{
    "query":{"match_all":{}}
}

    其中match_all表明返回全部的文檔。  blog

    或一樣查詢customer_first_name:Jim,以下: 排序

{
    "profile": true,
    "query": {
        "match": {"customer_first_name":"Jim"}
    }
}

    用Postman進行查詢,結果以下圖所示:

    took表示查詢用時;hits表示查到了多少結果,ElasticSearch默認列出10條;_score表示相關度評分;_source表示文檔原始信息;

    因此,大致上可根據如下語法進行查詢:  

/_search 
查詢範圍:集羣上全部的索引;

/index-name1/_search
查詢範圍:只查詢index-name1索引;

/index-name1,index-name2/_search
查詢範圍:查詢index-name1,index-name2兩個索引;

/index*/_search
查詢範圍:查詢以index開頭的索引;

   二、搜索相關性

  搜索是用戶與搜索引擎的對話,比較關注的有以下幾點:

    1)是否能夠找到全部相關的內容;

    2)有多少不相關的內容被返回了;

    3)文檔的打分是否合理;

    4)結合業務需求,平衡結果排名;  

  三、搜索結果的衡量

    1)Precision-查準率:儘量返回較少的無關文檔,公式爲:返回的相關結果/(返回的相關結果+返回的無關結果)

    2)Recall-查全率:儘可能返回較多的相關文檔,公式爲:返回的相關結果/(返回的相關結果+應該返回但沒有返回結果)

    3)Ranking-排名:是否可以按照相關度進行排序;

 2、ElasticSearch URI搜索操做

  經過URI Query實現搜索,語法以下:  

Get /movies/_search?q=2012&df=title_name&sort=year:desc&from=0&size=10&timeout=1s
{
  "profile":true
}

    q:指定的查詢語句,使用Query String 語法;

  df:默認字段,若不指定,會對全部字段進行查詢;

  sort:用於排序;

  from、size:用於分頁;

  profile:用於展現查詢是如何被執行的;

  一、指定字段查詢、泛查詢

  指定字段查詢:就是查詢的值是在某個字段範圍內進行的查詢。對movies索引中的title字段作2012信息的查詢,查詢結果以下圖所示:

  

  泛查詢:就是查詢的值是對索引中全部字段進行匹配,以下圖所示:

   

  二、Term【詞語】查詢與Phrase【短語】查詢

  二者區別在於,若要查詢一條信息,如Iron Man

  對於Term查詢,Iron Man等效於Iron OR Man;

  對於Phrase查詢,「Iron Man"等效於Iron AND Man,並且要求先後順序要保持一致;

  注意:對於Term查詢,須要加上括號才能夠;對於Phrase查詢,須要加上引號才能夠;

  以下圖所示:

  

  

  三、布爾查詢

  布爾表示符:AND/OR/NOT(+、-),注意:符號必須大寫。具體操做以下圖所示:

  

  在AND查詢中,咱們會發現查詢出8條結果,與Phrase查詢結果並不相同。緣由在於:Phrase查詢要求查詢信息先後順序必須是一致的,而AND查詢並無這個要求,所以多出兩條查詢數據。

  

  在OR查詢中,咱們會發現與Term查詢結果是相同的,包括profile中所列出的description都是同樣的。不相同的是查詢類型,Term查詢是TermQuery,Or查詢是BooleanQuery。

  

  四、範圍查詢

  []:表示閉區間;{}:表示開區間;以下圖所示:

  

  

  上圖中,開區間查詢,在profile中會發現,查詢範圍是從2016至2019,開區間意味着要大於開區間的起始值。

  五、算數符號查詢

  包括:>、>=、<、<=,以下圖所示:

  

   

  六、通配符查詢

  通配符查詢效率低、佔用內存大,故不建議使用。

  ?:表明1個字符;*:表明0或多個字符;

  

  

  七、模糊/近似度匹配查詢

  

  

  從上面兩圖中能夠看出,近似度查詢中的~1表示一個詞中容許有一個字母與正確單詞不差異;~2表示對一個短語進行搜索,能夠搜索到缺失1個或2個詞的短語,2個以上的不屬於此搜索範圍。

  八、正則表達式查詢

3、Request Body搜索操做(DSL操做)

  在ElasticSearch中,通常高階的搜索操做都是經過Request Body來實現。

//經過from size返回查詢結果,注意:獲取靠後的翻頁成本較高。
post /movies/_search
{
    "profile": true,
    「from":10,
    "size":20,
    "query": {
        "match": {"title":"iron man"}
    }
}
//經過sort對查詢結果進行排序,注意:排序字段最好是「數字型」或「日期型」
post /movies/_search
{
    "profile": true,
    "sort":[{"order_date":"desc"}]
    "from":10,
    "size":20,
    "query": {
        "match": {"title":"iron man"}
    }
}  
//經過_source元數據過濾,返回相應的字段,此時,對"iron man"的查詢是iron OR man的邏輯
post /movies/_search
{
  "profile":true,
  "_source":["title","year"],
  "from":10,
  "size":5,
  "sort":[{"year":"desc"}],
  "query":{
    "match": {"title":"iron man"}
  }
}
//若想對"iron man"執行iron AND man的邏輯,可按以下操做
post /movies/_search
{
  "profile":true,
  "_source":["title","year"],
  "from":10,
  "size":5,
  "sort":[{"year":"desc"}],
  "query":{
    "match"{
    "title":{
      "query":"iron man",
      "operator":"AND"
     }
   }
  }
}

   二者執行結果,以下圖所示:

  

//腳本字段,經過script_fields對返回字段進行加工,來算出一個新的字段
post /movies/_search
{
  "profile":true,
  "script_fields":{
    "new_fields":{
      "script":{
        "lang":"painless",
        "source":"doc['year'].value+'-hello'"
        }
      }
    },
  "_source":["title","year"],
  "from":0,
  "size":10,
  "sort":[{"year":"desc"}],
  "query":{
    "match_all":{}
    }
}

   

//短語搜索,注意slop的意思是能夠在iron man之間能夠有1個其餘的字符
post /movies/_search
{
  "profile":true,
  "_source":["title","year"],
  "query":{
    "match_phrase":{
        "title":{
            "query":"iron man",
            "slop":"1"
          }
      }
    }
}

   

4、Query String和Simple Query String搜索(也是DSL操做)

  咱們向索引users中插入兩條文檔:

put /users/_doc/3
{
  "name":"tang bohu",
  "about":"gongfu,wencai,huahua"
}
put /users/_doc/4
{
  "name":"zhang sanfeng",
  "about":"gongfu,youmo"
}

   一、Query String

  在DSL中也是能夠支持相似於URI Query的查詢。

  

  二、Simple Query String

  該種查詢的特色:

  1)此種查詢相似於Query String,可是會忽略錯誤的語法,同時只支持部分查詢語法;

  2)不支持AND、OR、NOT,只會將其做爲字符串處理;

  3)Term之間的默認關係是OR,經過Operator能夠指定其餘關係;

  4)支持部分邏輯:+、-、|;

  

  

  注意:Query、Query String、Simple Query String在使用時,後二者的靈活性下降了,可是更容易寫;而第一種靈活性最大,可是容易出錯。

  

  你們可關注個人公衆號

   

  知識學習來源:阮一鳴:《Elasticsearch核心技術與實戰》  

相關文章
相關標籤/搜索