《ElasticSearch查詢》目錄導航:
- ElasticSearch查詢 第一篇:搜索API
- ElasticSearch查詢 第二篇:文檔更新
- ElasticSearch查詢 第三篇:詞條查詢
- ElasticSearch查詢 第四篇:匹配查詢(Match)
- ElasticSearch查詢 第五篇:布爾查詢
不同於SQL語言,對ElasticSearch引擎發送的查詢請求,有兩種方式:第一種方式是使用RESTful 風格的API請求對數據進行搜索或更新,這意味着,必須使用搜索API向ElasticSearch引擎發起搜索請求;第二種方式是使用Qeury DSL,將查詢語言封裝成JSON結構,在JSON結構中,封裝查詢請求的參數,作為請求主體(Request Body),發送給ElasticSearch引擎處理。
DSL是領域專用語言(Domain-Specific Language)的首字母縮寫,是一種通用的大數據查詢語言,用於實現海量數據的檢索分析。
本系列是ElasticSearch的入門文章,用於介紹搜索API的使用方法,只求快速入門,想要深入了解,最好的文檔永遠是官方手冊。
一,約定格式
在《ElasticSearch查詢》系列文章中,為了簡化描述,突出重點,約定將URL字符串中host:port/index/type 省略,
curl -XGET 'http://localhost:9200/twitter/tweet/_search?q=user:kimchy'
簡寫為只包含“HTTP動詞+端點+查詢參數”的簡寫格式,如下:
GET /_search?q=user:kimchy
將帶有POST請求主體的查詢,如下:
curl -XGET 'http://localhost:9200/twitter/tweet/_search' -d '{ "query" : { "term" : { "user" : "kimchy" } } }'
簡寫為只包含“HTTP動詞+端點+請求主體JSON”的格式,如下:
GET /_search -d { "query" : { "term" : { "user" : "kimchy" } } }
二,查詢端點(Endpoint)
查詢端點允許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