不同于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”的格式,如下:

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

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

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

二,查詢端點(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查詢,例如一下腳本:

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

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

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

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)求的詞條查詢,如下:

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

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

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

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查詢》目錄

第一篇:搜索API

 

參考文檔:

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)簽: ElasticSearchQuery