ElasticSearch查詢 第一篇:搜索API

《ElasticSearch查詢》目錄導航:html

 

不一樣於SQL語言,對ElasticSearch引擎發送的查詢請求,有兩種方式:第一種方式是使用RESTful 風格的API請求對數據進行搜索或更新,這意味着,必須使用搜索API向ElasticSearch引擎發起搜索請求;第二種方式是使用Qeury DSL,將查詢語言封裝成JSON結構,在JSON結構中,封裝查詢請求的參數,做爲請求主體(Request Body),發送給ElasticSearch引擎處理。數組

DSL是領域專用語言(Domain-Specific Language)的首字母縮寫,是一種通用的大數據查詢語言,用於實現海量數據的檢索分析。curl

本系列是ElasticSearch的入門文章,用於介紹搜索API的使用方法,只求快速入門,想要深刻了解,最好的文檔永遠是官方手冊。elasticsearch

一,約定格式ide

在《ElasticSearch查詢》系列文章中,爲了簡化描述,突出重點,約定將URL字符串中host:port/index/type 省略,post

 curl -XGET 'http://localhost:9200/twitter/tweet/_search?q=user:kimchy'

簡寫爲只包含「HTTP動詞+端點+查詢參數」的簡寫格式,以下:大數據

GET /_search?q=user:kimchy

將帶有POST請求主體的查詢,以下:ui

curl -XGET 'http://localhost:9200/twitter/tweet/_search' -d '{
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}'

簡寫爲只包含「HTTP動詞+端點+請求主體JSON」的格式,以下:url

GET /_search -d
{
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}

二,查詢端點(Endpoint)spa

查詢端點容許RESTful API或客戶端查詢ElasticSearch引擎中存儲的數據,經過HTTP動詞定義操做,經過URI定位數據資源。

1,用於搜索數據的端點

查詢ElasticSearch引擎,主要使用_search 和_query端點,_search端點容許執行搜索查詢,返回查詢結果。在_search端點上,可以執行RESTful API查詢和Qeury DSL查詢,例如一下腳本:

GET /_search?q=user:kimchy
GET /_search -d
{
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}

ElasticSearch的全部查詢請求都發送到_search端點,對於_query端點,只用於將查詢的結果刪除:

DELETE /_query?q=user:kimchy

2,分析端點(_analyze)

分析端點_analyze,用於對查詢參數進行分析,並返回分析的結果

POST /_analyze?field=title -d
ElasticSearch Sever

3,計數端點(_count)

在計數端點_count上,執行查詢,獲取知足查詢條件的文檔數量

GET /_count?q=user:jim

4,解釋端點(_explain)

用於驗證指定的文檔是否知足查詢條件,格式是index/type/_id/_explain,例如

GET index/type/1/_explain?q=message:search

三,根據文檔標識ID搜索單個文檔

根據文檔標識符搜索文檔時,使用「index/type/_id」 格式,以下,搜索文檔標識爲13的文檔:

GET /13

四,檢查是否有文檔知足查詢條件

GET /_search/exists?q=user:kimchy

五,URI搜索

請求參數位於_search端點以後,參數之間使用&分割,例如:

GET /_search?pretty&q=title:azure&explain=true&from=1&size=10&sort=title:asc&fields:user,title,content

1,pretty參數

默認狀況下,API返回的JSON對象忽略換行符,在請求(Request)中加上pretty參數,強制ElasticSearch引擎在響應(Response)中加上換行符,使返回的結果集JSON可讀。

2,查詢條件(q)參數

查詢條件(q)參數用於指定返回的文檔必須匹配的查詢條件,例如:q=title:azure,指定搜索title字段中包含azure關鍵字的文檔;

能夠設置一個字段包含多個關鍵字,關鍵字之間使用空格或逗號分隔,例如:q=title:(azure,aws,cloud),或 q=title:(azure aws cloud),指定搜索title字段中包含azure,aws或cloud的文檔;只要title字段包含任意一個關鍵字,文檔就知足查詢條件;

q參數能夠指定搜素一個短語,短語使用雙引號標識,例如:q=title:"azure vs aws",指定搜索title中包含短語「azure vs aws」的文檔;

在查詢條件中,也能夠指定操做符:+或-,操做符 + 用於指定返回的文檔必須匹配查詢條件;操做符 - 用於指定返回的文檔不匹配查詢條件;操做符之間以空格分隔,操做符是位於查詢條件=號右側,字段前面,例如 q=+title:azure -title:aws,指定搜索字段title中只能包含azure,不能包含aws;

3,默認操做符(default_operator)參數

在API中能夠包含多個查詢條件q,默認條件下,多個查詢條件之間的關係是或(or)關係,例如:q=title:azure&q=content:azure,指定搜索title字段中包含azure關鍵字,或者content字段中包含azure關鍵字的文檔。

查詢條件之間的邏輯關係由默認操做符(default_operator)參數指定,默認值是or,該屬性能夠設置爲and 或 or;

  • 當設置爲or時,只要一個查詢條件(q)知足,就返回文檔;例如:q=title:azure&q=content:azure&default_operator=or
  • 當設置爲and時,全部的查詢條件都知足時,才返回文檔;例如:q=title:azure&q=content:azure&default_operator=and

對於查詢:q=title:(azure,aws)&q=content:(azure,aws),表示搜索文檔的字段title或content,只要字段值中出現azure 或 aws關鍵字,就表示該文檔匹配查詢條件,做爲查詢結果返回。

4,投影字段(fields)參數

默認狀況下,返回的每一個文檔都包括_index,_type,_id,_score和_source字段,投影參數 fields 用於指定返回的字段列表。在查詢時,經過fields參數,指定一個以逗號分隔的字段列表,這些字段的store屬性必須設置爲true,或存在於_source字段中。默認狀況下,fields字段的參數值是_source。能夠指定一個或多個字段,字段之間以逗號分隔:

  • fields=title
  • fields=title,user

5,排序(sort)參數

排序(sort)參數,用於對結果進行排序,使ElasticSearch按照指定的字段對結果進行排序,值是fieldName:asc/fieldName:desc,默認是升序排序,能夠有多個排序字段,排序字段之間以逗號分割,例如:sort=field1:asc,field:desc

6,其餘參數

  • 解釋(explain)參數:設置爲true時,ElasticSearch將在結果中的文檔中包含額外的解釋信息;
  • 分頁(from和size)參數,用於指定結果窗口,from參數指定結果從哪一個記錄開始返回,默認值是0;size參數定義了返回結果的最大文檔數量,默認值是10,參數示例:from=10&size=15
  • 小寫詞條(lowercase_expanded_terms)參數:自動將詞條轉換成小寫,默認值是true;
  • 分析通配符(analyze_wildcard)參數:通配符或前綴是否被分析,默認值是false;

六,查詢請求

搜索API能夠轉換爲查詢請求,以下代碼,查詢請求的查詢條件是詞條查詢,查詢參合URI搜索的參數是對應的:

GET /_search -d 
{  
   "from":0,
   "size":10,
   "sort":[  
      {"post_date":{"order":"asc"}},
      { "name":"desc" }
   ],
   "fields":[ "name","postDate","age"],
   "query":{  
      "term":{ "user":"kimchy"}
   }
}

1,查詢條件

在查詢條件結點"query"中,指定查詢的類型是詞條(Term),在詞條中指定查詢的條件,例如,只要User中包含kimchy關鍵字,就知足查詢條件:

"query" : {
        "term" : { "user" : "kimchy" }
}

2,排序

排序sort字段指定排序的字段及其排序的方向,而且排序值(Sort Value)做爲查詢結果返回:

"sort":[  
   {   "post_date":{   "order":"asc" }},
   {   "name":"desc"  }
]

排序的方向:升序asc,降序desc,對於_score字段,默認的排序方式是降序desc,對於其餘字段,默認的排序方向是asc。

當對字符串字段進行排序時,該字段最好不被分詞(analyzed或tokenized),若是字符串字段被分析,那麼ElasticSearch引擎將隨機選取字段的一個分詞(Term)進行排序,這可能不是你想要的排序值。

3,投影,選取返回的字段

投影字段(fields),用來限制返回的字段,該字段必須存儲在倒排索引中,也就是說,在索引映射中,該字段的store屬性爲ture。推薦使用_source字段,從文檔源數據中,指定須要返回的字段。示例,使用_source 字段,控制結果hits數組中,每一個文檔_source字段必須返回的字段:

{
    "_source": {
        "include": [ "filed1", "field2" ],
        "exclude": [ "field3" ]
    },
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}

4,窗口字段

窗口字段 from 和 size,用來限制返回的文檔數量

 

參考文檔:

Elasticsearch Reference [2.4] » Search APIs

Elasticsearch Reference [2.4] » Document APIs

Elasticsearch Reference [2.4] » Search APIs » URI Search

相關文章
相關標籤/搜索