地方網(wǎng)站域名選擇史上最強(qiáng)大的搜索神器
一、語法
1、請(qǐng)求方式
Elasticsearch(ES)使用基于 JSON 的查詢 DSL(領(lǐng)域特定語言)來與數(shù)據(jù)交互。
一個(gè) ElasticSearch 請(qǐng)求和任何 HTTP 請(qǐng)求一樣由若干相同的部件組成:
curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'
被 < > 標(biāo)記的部件 | 含義 |
VERB | 適當(dāng)?shù)?HTTP 方法 或 謂詞 : GET`、 `POST`、 `PUT`、 `HEAD 或者 `DELETE`。 |
PROTOCOL | http 或者 https`(如果你在 ElasticSearch 前面有一個(gè) `https 代理) |
HOST | ElasticSearch 集群中任意節(jié)點(diǎn)的主機(jī)名,或者用 localhost 代表本地機(jī)器上的節(jié)點(diǎn)。 |
PORT | 運(yùn)行 ElasticSearch HTTP 服務(wù)的端口號(hào),默認(rèn)是 9200 。 |
PATH | API 的終端路徑(例如 _count 將返回集群中文檔數(shù)量)。Path 可能包含多個(gè)組件,例如:_cluster/stats 和 _nodes/stats/jvm 。 |
QUERY_STRING | 任意可選的查詢字符串參數(shù) (例如 pretty 將格式化地輸出 JSON 返回值,使其更容易閱讀) |
BODY | 一個(gè) JSON 格式的請(qǐng)求體 (如果請(qǐng)求需要的話) |
2、大小寫敏感
es是大小寫敏感的。?
二、請(qǐng)求類型
1、GET請(qǐng)求
GET
請(qǐng)求通常用于查詢操作;
它會(huì)通過 URL 參數(shù)傳遞請(qǐng)求數(shù)據(jù),查詢條件較簡(jiǎn)單時(shí)適用。
2、POST請(qǐng)求
POST
請(qǐng)求通常用于提交數(shù)據(jù),如添加或更新文檔;
也可用于執(zhí)行復(fù)雜的查詢:復(fù)雜查詢或聚合(特別是當(dāng)查詢語句較大時(shí),無法通過 URL 傳遞)
三、查詢返回結(jié)果
執(zhí)行命令:索引庫名稱/_search
空搜索的結(jié)果為:
{"took": 2, # 該命令請(qǐng)求花費(fèi)了多長(zhǎng)時(shí)間,單位:毫秒。"timed_out": false, # 搜索是否超時(shí)"_shards": { # 搜索分片信息"total": 3, # 搜索分片總數(shù)"successful": 3, # 搜索成功的分片數(shù)量"skipped": 0, # 沒有搜索的分片,跳過的分片"failed": 0 # 搜索失敗的分片數(shù)量},"hits": { # 搜索結(jié)果集。需要的一切數(shù)據(jù)都是從hits中獲取"total": 21798, # 返回多少條數(shù)據(jù)"max_score": 1, #返回結(jié)果中,最大的匹配度分值"hits": [ # 默認(rèn)查詢前十條數(shù)據(jù),根據(jù)分值降序排序,這里為了節(jié)省地方,把默認(rèn)查詢的前十條數(shù)據(jù)刪了9條,只剩下一條數(shù)據(jù){"_index": "", # 索引庫名稱"_type": "", # 類型名稱"_id": "", # 該條數(shù)據(jù)的id"_score": 1, # 關(guān)鍵字與該條數(shù)據(jù)的匹配度分值"_routing": "", # routing參數(shù)是一個(gè)可選參數(shù),默認(rèn)使用文檔的_id值,用于計(jì)算文檔所屬分片"_source": { # 索引庫中類型,返回結(jié)果字段,不指定的話,默認(rèn)全部顯示出來"id": 1,"orderNo": "","appId": "","componentAppId": "","settleNo": "","outSettleNo": "","settleAmount": 5,"orderAmount": 7,"settleStatus": 3,"paymentChannel": 1,"version": 2,"settleTime": ,"createTime": ,"updateTime": ,"promotionAccountId": "","invoiceStatus": 1,"promotionTypeValue": 0,"commissionRateFeeCentAmount": 0,"commissionChargeFeeCentAmount": 0,"promotionFeeCentAmount": 2,"developerPromotionFeeCentAmount": 0,"promotionType": ""}}]}
}
按照從上到下的順序,一共四個(gè)返回值,took,timed_out,_shards,hits。
1、took
該命令請(qǐng)求花費(fèi)了多長(zhǎng)時(shí)間,單位:毫秒。
2、timed_out
搜索是否超時(shí)。
3、shards
搜索分片信息。
(1)total
搜索分片總數(shù)。
(2)successful
搜索成功的分片數(shù)量。
(3)skipped
沒有搜索的分片,跳過的分片。
(4)failed
搜索失敗的分片數(shù)量。
4、hits
搜索結(jié)果集,需要的一切數(shù)據(jù)都是從hits中獲取。
(1)total
返回多少條數(shù)據(jù)。
(2)max_score
返回結(jié)果中,最大的匹配度分值。
(3)hits
默認(rèn)查詢前十條數(shù)據(jù),根據(jù)分值降序排序。
(4)_index
索引庫名稱。
(5)_type
類型名稱
(6)_id
該條數(shù)據(jù)的id。
(7)_score
關(guān)鍵字與該條數(shù)據(jù)的匹配度分值。
(8)_source
索引庫中類型,返回結(jié)果字段,不指定的話,默認(rèn)全部顯示出來。
四、查詢語法介紹
語法GET /索引/類型/_search? ? ? ? ?查詢條件。
這個(gè)查詢條件有兩種寫法,
1、URL 拼接
在GET的url中指定參數(shù),這種方法比較簡(jiǎn)單。如
(1)查詢所有
GET /索引名稱/_search
(2)?條件查詢:?
GET /es-test/_search?q=blog
(3)分頁查詢:
GET /es-test/_search?size=5&from=10
?2、DSL(常用)
還有一種是ES查詢表達(dá)式 (DSL) 檢索,所有查詢都以 JSON 格式表示,通常包含 query
或 filter
字段。在執(zhí)行查詢時(shí),通常向特定的索引發(fā)起請(qǐng)求,使用 HTTP 方法(GET 或 POST)。JSON 的常用字段有:
(1)sort
封裝排序
(2)?_source
指定查詢結(jié)果的字段,不指定則默認(rèn)返回所有字段
GET /wtyy-test/user/_search
{"query":{"match_all":{}},"_source":["name","age"]
}
(3)query
封裝查詢條件
(4)分頁條件
from、size
(5)highlight高亮
通常自己開發(fā)搜索引擎的時(shí)候,往往需要對(duì)搜索結(jié)果中的關(guān)鍵詞高亮這種功能。注意,帶條件查詢高亮才生效,如無條件分頁查詢高亮是不生效的。
GET wtyy-test/user/_search
{"query": {"match": {"address": "北京"}},"highlight": {"fields": {"address": {}}}
}
返回:
{"took": 61,"timed_out": false,"_shards": {"total": 5,"successful": 5,"failed": 0},"hits": {"total": 1,"max_score": 0.7787034,"hits": [{"_index": "wtyy-test","_type": "user","_id": "1","_score": 0.7787034,"_source": {"name": "王五1","age": 1,"address": "湖北","school": "測(cè)試學(xué)校"},"highlight": {"address": ["湖<em>北</em>"]}}]}
}
在返回體中有一個(gè) highlight 字段,里面對(duì) message 字段進(jìn)行高亮處理: 關(guān)鍵詞使用了?<em></em>
?標(biāo)簽包圍了??梢允褂?css 修改對(duì)?<em>
?標(biāo)簽的樣式,以實(shí)現(xiàn)關(guān)鍵詞高亮效果。?
五、es的并發(fā)處理
使用的樂觀鎖 在 后面加上 version:
POST /user/student/1?version=3
{"name":"zyk","age":0
}
?只有version = 當(dāng)前記錄的version的時(shí)候才能修改成功。es 可以自動(dòng)控制 vserion 通過 ,version_type指定 ,version_type=external 要求 version 大于當(dāng)前的version ,version_type=internal 這個(gè)是默認(rèn)值 ,必須等于當(dāng)前的值<br>version_type=external_gte 大于等于當(dāng)前的version<br>version_type=force 已經(jīng)廢棄了不能用了,我也不知道以前什么意思,提升, Validation Failed:?
1
: version type [force] may no longer be used
POST /user/student/1?version_type=external&version=505
{"name":"zyk","age":0
}