《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;
對於查詢: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。能夠指定一個或多個字段,字段之間以逗號分隔:
5,排序(sort)參數
排序(sort)參數,用於對結果進行排序,使ElasticSearch按照指定的字段對結果進行排序,值是fieldName:asc/fieldName:desc,默認是升序排序,能夠有多個排序字段,排序字段之間以逗號分割,例如:sort=field1:asc,field:desc
6,其餘參數
六,查詢請求
搜索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