ElasticSearch查詢 第四篇:匹配查詢(Match)
不同于SQL語言陨献,對(duì)ElasticSearch引擎發(fā)送的查詢請(qǐng)求,有兩種方式:第一種方式是使用RESTful 風(fēng)格的API請(qǐng)求對(duì)數(shù)據(jù)進(jìn)行搜索或更新懂更,這意味著眨业,必須使用搜索API向ElasticSearch引擎發(fā)起搜索請(qǐng)求急膀;第二種方式是使用Qeury DSL,將查詢語言封裝成JSON結(jié)構(gòu)龄捡,在JSON結(jié)構(gòu)中卓嫂,封裝查詢請(qǐng)求的參數(shù),作為請(qǐng)求主體(Request Body)聘殖,發(fā)送給ElasticSearch引擎處理晨雳。
DSL是領(lǐng)域?qū)S谜Z言(Domain-Specific?Language)的首字母縮寫,是一種通用的大數(shù)據(jù)查詢語言奸腺,用于實(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ù)背桐,通過HTTP動(dòng)詞定義操作,通過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 /_query?q=user:kimchy
2役听,分析端點(diǎn)(_analyze)
分析端點(diǎn)_analyze,用于對(duì)查詢參數(shù)進(jìn)行分析,并返回分析的結(jié)果
POST /_analyze?field=title -dElasticSearch 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/13
四栏渺,檢查是否有文檔滿足查詢條件
GET /_search/exists?q=user:kimchy
五,URI搜索
請(qǐng)求參數(shù)位于_search端點(diǎn)之后锐涯,參數(shù)之間使用&分割磕诊,例如:
GET/_search?pretty&q=title:azure&explain=true&from=1&size=10&sort=title:asc&fields:user,title,content
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è)短語,短語使用雙引號(hào)標(biāo)識(shí)溉贿,例如:q=title:"azure vs aws"枫吧,指定搜索title中包含短語“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í),通過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é)果中的文檔中包含額外的解釋信息;
分頁(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)求
搜索API可以轉(zhuǎn)換為查詢請(qǐng)求,如下代碼醒第,查詢請(qǐng)求的查詢條件是詞條查詢渔嚷,查詢參合URI搜索的參數(shù)是對(duì)應(yī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,排序
排序sort字段指定排序的字段及其排序的方向司恳,并且排序值(Sort Value)作為查詢結(jié)果返回:
"sort":[?
? {? "post_date":{"order":"asc" }},
? {? "name":"desc"? }
]
排序的方向:升序asc途乃,降序desc,對(duì)于_score字段扔傅,默認(rèn)的排序方式是降序desc耍共,對(duì)于其他字段烫饼,默認(rèn)的排序方向是asc。
當(dāng)對(duì)字符串字段進(jìn)行排序時(shí)试读,該字段最好不被分詞(analyzed或tokenized)杠纵,如果字符串字段被分析,那么ElasticSearch引擎將隨機(jī)選取字段的一個(gè)分詞(Term)進(jìn)行排序钩骇,這可能不是你想要的排序值淡诗。
3,投影伊履,選取返回的字段
投影字段(fields),用來限制返回的字段款违,該字段必須存儲(chǔ)在倒排索引中唐瀑,也就是說,在索引映射中插爹,該字段的store屬性為ture哄辣。推薦使用_source字段,從文檔源數(shù)據(jù)中赠尾,指定需要返回的字段力穗。示例,使用_source 字段气嫁,控制結(jié)果hits數(shù)組中当窗,每個(gè)文檔_source字段必須返回的字段:
{
? ? "_source": {
? ? ? ? "include": ["filed1","field2" ],
? ? ? ? "exclude": [ "field3" ]
? ? },
? ? "query" : {
? ? ? ? "term": {"user":"kimchy" }
? ? }
}
4,窗口字段
窗口字段 from 和 size寸宵,用來限制返回的文檔數(shù)量
來源:http://www.cnblogs.com/ljhdo/p/4486978.html