不同于SQL語(yǔ)言,對(duì)ElasticSearch引擎發(fā)送的查詢請(qǐng)求,有兩種方式:第一種方式是使用RESTful 風(fēng)格的API請(qǐng)求對(duì)數(shù)據(jù)進(jìn)行搜索或更新,這意味著,必須使用搜索API向ElasticSearch引擎發(fā)起搜索請(qǐng)求;第二種方式是使用Qeury DSL,將查詢語(yǔ)言封裝成JSON結(jié)構(gòu),發(fā)送給ElasticSearch引擎。DSL是領(lǐng)域?qū)S谜Z(yǔ)言(Domain-Specific Language)的首字母縮寫,是一種通用的大數(shù)據(jù)查詢語(yǔ)言,用于實(shí)現(xiàn)海量數(shù)據(jù)的檢索分析。
本系列是ElasticSearch的入門文章,用于介紹搜索API的使用方法,只求快速入門,想要深入了解,最好的文檔永遠(yuǎn)是官方手冊(cè)。
一,約定格式
在《ElasticSearch查詢》系列文章中,為了簡(jiǎn)化描述,突出重點(diǎn),約定將URL字符串中host:port/index/type 省略,
curl -XGET 'http://localhost:9200/twitter/tweet/_search?q=user:kimchy'
簡(jiǎn)寫為只包含“HTTP動(dòng)詞+端點(diǎn)+查詢參數(shù)”的簡(jiǎn)寫格式,如下:
GET /_search?q=user:kimchy
將帶有POST請(qǐng)求主體的查詢,如下:
curl -XGET 'http://localhost:9200/twitter/tweet/_search' -d '{ "query" : { "term" : { "user" : "kimchy" } } }'
簡(jiǎn)寫為只包含“HTTP動(dòng)詞+端點(diǎn)+請(qǐng)求主體JSON”的格式,如下:
GET /_search -d { "query" : { "term" : { "user" : "kimchy" } } }
二,查詢端點(diǎn)(Endpoint)
查詢端點(diǎn)允許RESTful API或客戶端查詢ElasticSearch引擎中存儲(chǔ)的數(shù)據(jù),通過(guò)HTTP動(dòng)詞定義操作,通過(guò)URI定位數(shù)據(jù)資源。
1,用于搜索數(shù)據(jù)的端點(diǎn)
查詢ElasticSearch引擎,主要使用_search 和_query端點(diǎn),_search端點(diǎn)允許執(zhí)行搜索查詢,返回查詢結(jié)果。在_search端點(diǎn)上,能夠執(zhí)行RESTful API查詢和Qeury DSL查詢,例如一下腳本:
GET /_search?q=user:kimchy GET /_search -d { "query" : { "term" : { "user" : "kimchy" } } }
ElasticSearch的所有查詢請(qǐng)求都發(fā)送到_search端點(diǎn),對(duì)于_query端點(diǎn),只用于將查詢的結(jié)果刪除:
DELETE /
2,分析端點(diǎn)(_analyze)
分析端點(diǎn)_analyze,用于對(duì)查詢參數(shù)進(jìn)行分析,并返回分析的結(jié)果
GET /ElasticSearch Sever
3,計(jì)數(shù)端點(diǎn)(_count)
在計(jì)數(shù)端點(diǎn)_count上,執(zhí)行查詢,獲取滿足查詢條件的文檔數(shù)量
GET /_count?q=user:jim
4,解釋端點(diǎn)(_explain)
用于驗(yàn)證指定的文檔是否滿足查詢條件,格式是index/type/_id/_explain,例如
GET index/type/1/_explain?q=message:search
三,根據(jù)文檔標(biāo)識(shí)ID搜索單個(gè)文檔
根據(jù)文檔標(biāo)識(shí)符搜索文檔時(shí),使用“index/type/_id” 格式,如下,搜索文檔標(biāo)識(shí)為13的文檔:
GET
四,檢查是否有文檔滿足查詢條件
GET /_search/exists?q=user:kimchy
五,URI搜索
請(qǐng)求參數(shù)位于_search端點(diǎn)之后,參數(shù)之間使用&分割,例如:
GET
1,pretty參數(shù)
默認(rèn)情況下,API返回的JSON對(duì)象忽略換行符,在請(qǐng)求(Request)中加上pretty參數(shù),強(qiáng)制ElasticSearch引擎在響應(yīng)(Response)中加上換行符,使返回的結(jié)果集JSON可讀。
2,查詢條件(q)參數(shù)
查詢條件(q)參數(shù)用于指定返回的文檔必須匹配的查詢條件,例如:q=title:azure,指定搜索title字段中包含azure關(guān)鍵字的文檔;
可以設(shè)置一個(gè)字段包含多個(gè)關(guān)鍵字,關(guān)鍵字之間使用空格或逗號(hào)分隔,例如:q=title:(azure,aws,cloud),或 q=title:(azure aws cloud),指定搜索title字段中包含azure,aws或cloud的文檔;只要title字段包含任意一個(gè)關(guān)鍵字,文檔就滿足查詢條件;
q參數(shù)可以指定搜素一個(gè)短語(yǔ),短語(yǔ)使用雙引號(hào)標(biāo)識(shí),例如:q=title:"azure vs aws",指定搜索title中包含短語(yǔ)“azure vs aws”的文檔;
在查詢條件中,也可以指定操作符:+或-,操作符 + 用于指定返回的文檔必須匹配查詢條件;操作符 - 用于指定返回的文檔不匹配查詢條件;操作符之間以空格分隔,操作符是位于查詢條件=號(hào)右側(cè),字段前面,例如 q=+title:azure -title:aws,指定搜索字段title中只能包含azure,不能包含aws;
3,默認(rèn)操作符(default_operator)參數(shù)
在API中可以包含多個(gè)查詢條件q,默認(rèn)條件下,多個(gè)查詢條件之間的關(guān)系是或(or)關(guān)系,例如:q=title:azure&q=content:azure,指定搜索title字段中包含azure關(guān)鍵字,或者content字段中包含azure關(guān)鍵字的文檔。
查詢條件之間的邏輯關(guān)系由默認(rèn)操作符(default_operator)參數(shù)指定,默認(rèn)值是or,該屬性可以設(shè)置為and 或 or;
當(dāng)設(shè)置為or時(shí),只要一個(gè)查詢條件(q)滿足,就返回文檔;例如:q=title:azure&q=content:azure&default_operator=or
當(dāng)設(shè)置為and時(shí),所有的查詢條件都滿足時(shí),才返回文檔;例如:q=title:azure&q=content:azure&default_operator=and
對(duì)于查詢:q=title:(azure,aws)&q=content:(azure,aws),表示搜索文檔的字段title或content,只要字段值中出現(xiàn)azure 或 aws關(guān)鍵字,就表示該文檔匹配查詢條件,作為查詢結(jié)果返回。
4,投影字段(fields)參數(shù)
默認(rèn)情況下,返回的每個(gè)文檔都包括_index,_type,_id,_score和_source字段,投影參數(shù) fields 用于指定返回的字段列表。在查詢時(shí),通過(guò)fields參數(shù),指定一個(gè)以逗號(hào)分隔的字段列表,這些字段的store屬性必須設(shè)置為true,或存在于_source字段中。默認(rèn)情況下,fields字段的參數(shù)值是_source??梢灾付ㄒ粋€(gè)或多個(gè)字段,字段之間以逗號(hào)分隔:
fields=title
fields=title,user
5,排序(sort)參數(shù)
排序(sort)參數(shù),用于對(duì)結(jié)果進(jìn)行排序,使ElasticSearch按照指定的字段對(duì)結(jié)果進(jìn)行排序,值是fieldName:asc
/fieldName:desc,默認(rèn)是升序排序,可以有多個(gè)排序字段,排序字段之間以逗號(hào)分割,例如:
sort=field1:asc,field:desc
6,其他參數(shù)
解釋(explain)參數(shù):設(shè)置為true時(shí),ElasticSearch將在結(jié)果中的文檔中包含額外的解釋信息;
分頁(yè)(from和size)參數(shù),用于指定結(jié)果窗口,from參數(shù)指定結(jié)果從哪個(gè)記錄開始返回,默認(rèn)值是0;size參數(shù)定義了返回結(jié)果的最大文檔數(shù)量,默認(rèn)值是10,參數(shù)示例:from=10&size=15
小寫詞條(lowercase_expanded_terms)參數(shù):自動(dòng)將詞條轉(zhuǎn)換成小寫,默認(rèn)值是true;
分析通配符(analyze_wildcard)參數(shù):通配符或前綴是否被分析,默認(rèn)值是false;
六,查詢請(qǐng)求
URI搜索,實(shí)際上詞條查詢,可以轉(zhuǎn)換為查詢請(qǐng)求,查詢請(qǐng)求的詞條查詢,如下:
GET /_search -d { "from":0, "size":10, "sort":[ {"post_date":{"order":"asc"}}, { "name":"desc" } ], "fields":[ "name","postDate","age"], "query":{ "term":{ "user":"kimchy"} } }
1,查詢條件
在查詢條件結(jié)點(diǎn)"query"中,指定查詢的類型是詞條(Term),在詞條中指定查詢的條件,例如,只要User中包含kimchy關(guān)鍵字,就滿足查詢條件:
"query" : { "term" : { "user" : "kimchy" } }
2,排序
在排序結(jié)點(diǎn)“sort”中,指定排序的字段和排序的方向
"sort":[ { "post_date":{ "order":"asc" }}, { "name":"desc" } ]
排序的方向:升序asc,降序desc,對(duì)于_score字段,默認(rèn)的排序方式是降序desc,對(duì)于其他字段,默認(rèn)的排序方向是asc。
ElasticSearch將排序值(Sort Value)返回到查詢的結(jié)果中,通過(guò)"sort"數(shù)組,能夠看到ElasticSearch是按照哪個(gè)數(shù)據(jù)值進(jìn)行排序的。
當(dāng)對(duì)字符串字段進(jìn)行排序時(shí),該字段最好不被分詞(analyzed或tokenized),如果字符串字段被分詞,那么ElasticSearch引擎將隨機(jī)選取字段的一個(gè)分詞(Term)進(jìn)行排序,這可能不是你想要的排序值。
3,投影,選取返回的字段
投影字段(fields),用來(lái)限制返回的字段
4,窗口字段
窗口字段 from 和 size,用來(lái)限制返回的文檔數(shù)量
導(dǎo)航:《ElasticSearch查詢》目錄
參考文檔:
Elasticsearch Reference [2.4] ? Search APIs
Elasticsearch Reference [2.4] ? Document APIs
Elasticsearch Reference [2.4] ? Search APIs ? URI Search
Elasticsearch(入門篇)——Query DSL與查詢行為
神奇的 DSL 查詢語(yǔ)言 帶你探尋機(jī)器數(shù)據(jù)的金礦
Elasticsearch _query vs _search
--業(yè)精于勤而荒于嬉,行成于思而毀于隨--
--歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明出處--
分類: ElasticSearch
標(biāo)簽: ElasticSearch, Query