請求參數(shù)的查詢(QueryString)
查詢[字段]包含[內(nèi)容]的文檔
GET請求 http://192.168.1.181:9200/shop/_doc/_search?q=desc:我真帥
GET請求 http://192.168.1.181:9200/shop/_doc/_search?q=desc:我真帥&q=age:18
這種方式一般稱之為QueryString查詢方式,參數(shù)都是在URL中作為請求參數(shù)的。
點擊一下,咻的一下就可以查看官方文檔了,可直接翻譯es DSL操作官方文檔
DSL基本語法
QueryString用的很少,一旦參數(shù)復雜就很難構(gòu)建,所以大多數(shù)查詢都是使用dsl來進行查詢比較好。
- Domain Specific Language
- 特定領(lǐng)域語言
- 基于JSON格式的數(shù)據(jù)查詢
- 查詢更靈活,有利于復雜查詢
1、match語法
#查詢
POST http://192.168.1.181:9200/shop/_doc/_search
{
"query":{
"match":{
"desc":"我真帥"
}
}
}
# 同等于: GET http://192.168.1.181:9200/shop/_doc/_search?q=desc:我真帥
#判斷某個字段是否存在
{
"query":{
"exists":{
"field":"desc"
}
}
}
!補充:語法格式為一個json object,內(nèi)容都是key-value鍵值對,json可以嵌套。 key可以是一些es的關(guān)鍵字,也可以是某個field字段
2、match_all
在索引中查詢所有的文檔
GET http://113.98.58.50:9200/shop/_doc/_search
POST http://113.98.58.50:9200/shop/_doc/_search
{
"query":{
"match_all":{}
},
"_source":["id","nickname","age"], # 類似mysql中select * 替換
"from": 0, # 從那一條數(shù)據(jù)開始
"size": 10 # 每一頁展示多少條數(shù)據(jù)
}
3、match_phrase
match:分詞后只要有數(shù)據(jù)就會進行匹配然后返回
match_phrase:分詞結(jié)果必須在text字段分詞中都包含,而且順序必須相同,而且必須都是連續(xù)的(搜索相對而言比較嚴格)
# slop:允許詞語間跳過的數(shù)量
POST http://113.98.58.50:9200/shop/_doc/_search
{
"query": {
"match_phrase": {
"desc": {
"query": "大學 畢業(yè) 研究生",
"slop": 2
}
}
}
}
4、match 擴展
operator:
- or:搜索內(nèi)容分詞后,只要存在一個詞語匹配就能有結(jié)果
- and:搜索內(nèi)容分詞后,都要滿足詞語匹配
POST http://113.98.58.50:9200/shop/_doc/_search
{
"query": {
"match": {
"desc": "我真帥!"
}
}
}
# 等同于
{
"query": {
"match": {
"desc": {
"query": "xbox游戲機",
"operator": "or"
}
}
}
}
# 相當于 select * from shop where desc='xbox' or|and desc='游戲機'
- minimum_should_match:最低匹配精度,至少有[分詞后的詞語個數(shù)]百分位,的出一個數(shù)據(jù)值取整。舉個??:當前屬性設置為70,若一個用戶查詢檢索內(nèi)容分詞后有10個詞語,那么匹配度就是1070%=7,則desc中至少需要有7個成語進行匹配,就展示。若分詞后有八個,則8*70% =5.6,則desc中至少需要有5個成語匹配,就展示。
- minimum_shodld_match 也能設置具體的數(shù)字,表示個數(shù)
POST http://113.98.58.50:9200/shop/_doc/_search
{
"query": {
"match": {
"desc": {
"query": "女友在我生日的時候送了我一雙限量版球鞋,可把我開心壞了。",
"minimum_should_match": "60%"
}
}
}
}
根據(jù)文檔主鍵ids搜索
#查詢當個
GET /shop/_doc/1001
#查詢多個
POST http://113.98.58.50:9200/shop/_doc/_search
{
"query": {
"ids": {
"type": "_doc",
"values": ["1001", "1010", "1008"]
}
}
}
5、multi_match/boost
#滿足使用match在多個字段中進行查詢的需求
POST http://113.98.58.50:9200/shop/_doc/_search
{
"query": {
"multi_match": {
"query": "王二 18",
"fields": ["name", "age"]
}
}
}
#boost
#權(quán)重,為某個字段設置權(quán)重,權(quán)重越高,文檔相關(guān)性得分就越高。通暢來說搜索商品名稱要比商品簡介的權(quán)重更高。
{
"query": {
"multi_match": {
"query": "王二 18",
"fields": ["name", "age^10"]
}
}
}
#age^10 代表搜索提升10倍相關(guān)性,也就是說用戶搜索的時候其實以這個age為主,name為輔,age的匹配相關(guān)度當然要提高權(quán)重比例了。
6、term
搜索的時候會吧用戶搜索內(nèi)容,比如:"你是真的丑爆了!"作為一個整體的關(guān)鍵字去搜索,而不會對其他的分詞后在搜索。
POST http://113.98.58.50:9200/shop/_doc/_search
{
"query":{
"term":{
"desc":"你是真的丑爆了!"
}
}
}
# 可以對比:
{
"query": {
"match": {
"desc": "你是真的丑爆了!"
}
}
}
# terms 多個詞語匹配檢索
# 相當于是tag標簽查詢,比如慕課網(wǎng)的一些淘寶會打上衣服、褲子、鞋子、襪子這樣的標簽,可以完全匹配做類似標簽的查詢
{
"query":{
"terms":{
"desc":["衣服","褲子","鞋子"]
}
}
}
!注:match會對"你是真的丑爆了!"些進行分詞(其實就是全文搜索),在查詢,而term則不會,直接吧"你是真的丑爆了!"作為一個整的詞匯去搜索。
6、布爾查詢
可以組合多重查詢
- must:查詢必須匹配搜索條件,比如and
- should: 查詢匹配滿足1個以上條件,比如or
- must_not:不匹配搜索條件,一個都不需要滿足
POST http://113.98.58.50:9200/shop/_doc/_search
實操1:
{
"query": {
"bool": {
"must": [
{
"multi_match": {
"query": "我可真帥",
"fields": ["desc", "nickname"]
}
},
{
"term": {
"sex": 1
}
},
{
"term": {
"birthday": "1996-01-14"
}
}
]
}
}
}
{
"query": {
"bool": {
"should(must_not)": [
{
"multi_match": {
"query": "學習",
"fields": ["desc", "nickname"]
}
},
{
"match": {
"desc": "游戲"
}
},
{
"term": {
"sex": 0
}
}
]
}
}
}
實操2:
{
"query": {
"bool": {
"must": [
{
"match": {
"desc": "愛"
}
},
{
"match": {
"nickname": "愛"
}
}
],
"should": [
{
"match": {
"sex": "0"
}
}
],
"must_not": [
{
"term": {
"birthday": "1998-12-24"
}
}
]
}
}
}
#為指定詞語加權(quán)
#特殊場景下,某些詞語可以單獨加權(quán),這樣可以排得更加靠前。
{
"query": {
"bool": {
"should": [
{
"match": {
"desc": {
"query": "律師",
"boost": 18
}
}
},
{
"match": {
"desc": {
"query": "進修",
"boost": 2
}
}
}
]
}
}
}
7、過濾器
對搜索出來的結(jié)果進行數(shù)據(jù)過濾。不會到es庫里去搜,不會去計算文檔的相關(guān)度分數(shù),所以過濾的性能會比較高,過濾器可以和全文搜索結(jié)合在一起使用。
post_filter元素是一個頂層元素,只會對搜索結(jié)果進行過濾。不會計算數(shù)據(jù)的匹配度相關(guān)性分數(shù),不會根據(jù)分數(shù)去排序,query則相反,會計算分數(shù),也會按照分數(shù)去排序。
使用場景:
- query:根據(jù)用戶搜索條件檢索匹配記錄
- post_filter:用于查詢后,對結(jié)果數(shù)據(jù)的篩選
實操:查詢賬戶金額大于80元,小于160元的用戶。并且生日在1998-07-14的用戶
- gte:大于等于
- lte:小于等于
- gt:大于
-
lt:小于
(除此以外還能做其他的match等操作也行)
POST http://113.98.58.50:9200/shop/_doc/_search
{
"query": {
"match": {
"desc": "玩吃雞滴滴我呀!我鋼槍賊6"
}
},
"post_filter": {
"range": {
"money": {
"gt": 60,
"lt": 1000
}
}
}
}
8、排序
es的排序同sql,可以desc也可以asc。也支持組合排序。
實操:
POST http://113.98.58.50:9200/shop/_doc/_search
{
"query": {
"match": {
"desc": "玩吃雞滴滴我呀!我鋼槍賊6"
}
},
"post_filter": {
"range": {
"money": {
"gt": 55.8,
"lte": 155.8
}
}
},
"sort": [
{
"age": "desc"
},
{
"money": "desc"
}
]
}
對文本排序
由于文本會被分詞,所以往往要去做排序會報錯,通常我們可以為這個字段增加額外的一個附屬屬性,類型為keyword,用于做排序。
- 創(chuàng)建新的索引
POST /shop2/_mapping
{
"properties": {
"id": {
"type": "long"
},
"nickname": {
"type": "text",
"analyzer": "ik_max_word",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
- 插入數(shù)據(jù)
POST /shop2/_doc
{
"id": 1001,
"nickname": "美麗的風景"
}
{
"id": 1002,
"nickname": "漂亮的小哥哥"
}
{
"id": 1003,
"nickname": "飛翔的巨鷹"
}
{
"id": 1004,
"nickname": "完美的天空"
}
{
"id": 1005,
"nickname": "廣闊的海域"
}
- 排序
{
"sort": [
{
"nickname.keyword": "desc"
}
]
}
9、高亮highlight
高亮顯示
POST http://113.98.58.50:9200/shop/_doc/_search
{
"query": {
"match": {
"desc": "你真帥"
}
},
"highlight": {
"pre_tags": ["<tag>"],
"post_tags": ["</tag>"],
"fields": {
"desc": {}
}
}
}