分布式搜索引擎ElasticSearch(二)---ElasticSearch进阶使用教程
ElasticSearch
- ElasticSearch進(jìn)階教程
- 文檔批量操作
- 批量獲取文檔數(shù)據(jù)
- 批量操作文檔數(shù)據(jù)
- DSL語(yǔ)言高級(jí)查詢(xún)
- 無(wú)條件查詢(xún)
- 有查詢(xún)條件
- 葉子條件查詢(xún)(單字段查詢(xún)條件)
- 組合條件查詢(xún)(多條件查詢(xún))
- 連接查詢(xún)(多文檔合并查詢(xún))
- 查詢(xún)DSL(query DSL)和過(guò)濾DSL(filter DSL)
- Query方式查詢(xún)案例
- 總結(jié)
- 文檔映射
- 動(dòng)態(tài)映射
- 動(dòng)態(tài)映射
- 靜態(tài)映射
- 核心數(shù)據(jù)類(lèi)型
- keyword 與 text 映射類(lèi)型的區(qū)別
- 對(duì)已存在的mapping映射進(jìn)行修改
- Elasticsearch樂(lè)觀并發(fā)控制
ElasticSearch進(jìn)階教程
文檔批量操作
多個(gè)文檔是指,批量操作多個(gè)文檔。
批量獲取文檔數(shù)據(jù)
通過(guò)_mget的API來(lái)實(shí)現(xiàn)的;
- 在URL中不指定index和type
請(qǐng)求方式:GET;
請(qǐng)求地址:_mget;
功能說(shuō)明 : 可以通過(guò)ID批量獲取不同index和type的數(shù)據(jù);
請(qǐng)求參數(shù):
1、 docs:文檔數(shù)組參數(shù)
_index:指定index;
_type:指定type;
_id:指定id;
_source:指定要查詢(xún)的手段;
- 在URL中指定index
請(qǐng)求方式:GET
請(qǐng)求地址:/{{indexName}}/_mget
功能說(shuō)明 : 可以通過(guò)ID批量獲取相同ndex索引庫(kù)不同type的數(shù)據(jù)
請(qǐng)求參數(shù):docs 文檔數(shù)組參數(shù);
_type : 指定type
_id : 指定id
_source : 指定要查詢(xún)的字段
查找es_db索引庫(kù)下,type為_(kāi)doc中,id=3,4的文檔
- 在URL中指定index和type
請(qǐng)求方式:GET
請(qǐng)求地址:/{{indexName}}/{{typeName}}/_mget
功能說(shuō)明 : 可以通過(guò)ID批量獲取相同index和type的數(shù)據(jù)
請(qǐng)求參數(shù):docs : 文檔數(shù)組參數(shù)
_id : 指定id
_source : 指定要查詢(xún)的字段
批量操作文檔數(shù)據(jù)
批量對(duì)文檔進(jìn)行寫(xiě)操作是通過(guò)_bulk的API來(lái)實(shí)現(xiàn)的
請(qǐng)求方式:POST
請(qǐng)求地址:_bulk
請(qǐng)求參數(shù):通過(guò)_bulk操作文檔,一般至少有兩行參數(shù)(或偶數(shù)行參數(shù))
第一行參數(shù)為指定操作的類(lèi)型及操作的對(duì)象(index,type和id);
第二行參數(shù)才是操作的數(shù)據(jù)
actionName:表示操作類(lèi)型,主要有create,index,delete和update
- 批量創(chuàng)建文檔create
- 普通創(chuàng)建或者全量替換index
如果原文檔不存在,則是創(chuàng)建
如果原文檔存在,則是替換(全量修改原文檔)
修改操作:
id不存在,則新創(chuàng)建;
- 批量刪除delete
- 批量修改update
DSL語(yǔ)言高級(jí)查詢(xún)
- Domain Specific Language:領(lǐng)域?qū)S谜Z(yǔ)言
- Elasticsearch provides a ful1 Query DSL based on JSON to define
- queries:Elasticsearch提供了基于JSON的DSL來(lái)定義查詢(xún)。
DSL由葉子查詢(xún)子句和復(fù)合查詢(xún)子句兩種子句組成
無(wú)條件查詢(xún)
無(wú)查詢(xún)條件是查詢(xún)所有,默認(rèn)是查詢(xún)所有的,或者使用match_all表示所
有
有查詢(xún)條件
葉子條件查詢(xún)(單字段查詢(xún)條件)
-
模糊匹配
模糊匹配主要是針對(duì)文本類(lèi)型的字段,文本類(lèi)型的字段會(huì)對(duì)內(nèi)容進(jìn)行分
詞,對(duì)查詢(xún)時(shí),也會(huì)對(duì)搜索條件進(jìn)行分詞,然后通過(guò)倒排索引查找到匹
配的數(shù)據(jù),模糊匹配主要通過(guò)match等參數(shù)來(lái)實(shí)現(xiàn);
1)match : 通過(guò)match關(guān)鍵詞模糊匹配條件內(nèi)容
2)prefix : 前綴匹配
3)regexp : 通過(guò)正則表達(dá)式來(lái)匹配數(shù)據(jù); -
match的復(fù)雜用法
match條件還支持以下參數(shù):
query : 指定匹配的值
operator : 匹配條件類(lèi)型。and : 條件分詞后都要匹配;or : 條件分詞后有一個(gè)匹配即可(默認(rèn))
minmum_should_match : 指定最小匹配的數(shù)量 -
精確匹配
term : 單個(gè)條件相等
terms : 單個(gè)字段屬于某個(gè)值數(shù)組內(nèi)的值
range : 字段屬于某個(gè)范圍內(nèi)的值
exists : 某個(gè)字段的值是否存在
ids : 通過(guò)ID批量查詢(xún)
組合條件查詢(xún)(多條件查詢(xún))
組合條件查詢(xún)是將葉子條件查詢(xún)語(yǔ)句進(jìn)行組合而形成的一個(gè)完整的查詢(xún)
條件;
- bool : 各條件之間有and,or或not的關(guān)系;
must : 各個(gè)條件都必須滿(mǎn)足,即各條件是and的
關(guān)系
should : 各個(gè)條件有一個(gè)滿(mǎn)足即可,即各條件
是or的關(guān)系
must_not : 不滿(mǎn)足所有條件,即各條件是not的
關(guān)系
filter : 不計(jì)算相關(guān)度評(píng)分,它不計(jì)算_score
即相關(guān)度評(píng)分,效率更高
constant_score : 不計(jì)算相關(guān)度評(píng)分
must/filter/shoud/must_not 等的子條件是通
過(guò) term/terms/range/ids/exists/match 等葉子條件為參數(shù)的
注:以上參數(shù),當(dāng)只有一個(gè)搜索條件時(shí),must等對(duì)應(yīng)的是一個(gè)對(duì)象,當(dāng)
是多個(gè)條件時(shí),對(duì)應(yīng)的是一個(gè)數(shù)組
連接查詢(xún)(多文檔合并查詢(xún))
父子文檔查詢(xún):parent/child
嵌套文檔查詢(xún): nested
查詢(xún)DSL(query DSL)和過(guò)濾DSL(filter DSL)
它們兩個(gè)的區(qū)別如下圖
- query DSL
在查詢(xún)上下文中,查詢(xún)會(huì)回答這個(gè)問(wèn)題——“這個(gè)文檔匹不匹配這個(gè)查詢(xún),它的
相關(guān)度高么?”
如何驗(yàn)證匹配很好理解,如何計(jì)算相關(guān)度呢?ES中索引的數(shù)據(jù)都會(huì)存儲(chǔ)一個(gè)
_score分值,分值越高就代表越匹配。另外關(guān)于某個(gè)搜索的分值計(jì)算還是很復(fù)雜
的,因此也需要一定的時(shí)間。 - filter DSL
在過(guò)濾器上下文中,查詢(xún)會(huì)回答這個(gè)問(wèn)題——“這個(gè)文檔匹不匹配?”
答案很簡(jiǎn)單,是或者不是。它不會(huì)去計(jì)算任何分值,也不會(huì)關(guān)心返回的排序問(wèn)
題,因此效率會(huì)高一點(diǎn)。
過(guò)濾上下文 是在使用filter參數(shù)時(shí)候的執(zhí)行環(huán)境,比如在bool查詢(xún)中使用
must_not或者filter
另外,經(jīng)常使用過(guò)濾器,ES會(huì)自動(dòng)的緩存過(guò)濾器的內(nèi)容,這對(duì)于查詢(xún)來(lái)說(shuō),會(huì)提
高很多性能。
Query方式查詢(xún)案例
- 根據(jù)名稱(chēng)精確查詢(xún)姓名 term, term查詢(xún)不會(huì)對(duì)字段進(jìn)行分詞查詢(xún),會(huì)
采用精確匹配
注意: 采用term精確查詢(xún), 查詢(xún)字段映射類(lèi)型應(yīng)為keyword
.
- 根據(jù)備注信息模糊查詢(xún) match, match會(huì)根據(jù)該字段的分詞器,進(jìn)行分
詞查詢(xún)
- 多字段模糊匹配查詢(xún)與精準(zhǔn)查詢(xún) multi_match
- 未指定字段條件查詢(xún) query_string , 含 AND 與 OR 條件
- 指定字段條件查詢(xún) query_string , 含 AND 與 OR 條件
- 范圍查詢(xún)
json請(qǐng)求字符串中部分字段的含義:
range:范圍關(guān)鍵字;
gte 大于等于;
lte 小于等于;
gt 大于;
lt 小于;
now 當(dāng)前時(shí)間;
在這里插入代碼片
- 分頁(yè)、輸出字段、排序綜合查詢(xún)
- Filter過(guò)濾器方式查詢(xún),它的查詢(xún)不會(huì)計(jì)算相關(guān)性分值,也不會(huì)對(duì)結(jié)果進(jìn)
行排序, 因此效率會(huì)高一點(diǎn),查詢(xún)的結(jié)果可以被緩存。
Filter Context 對(duì)數(shù)據(jù)進(jìn)行過(guò)濾
總結(jié)
- match
match:模糊匹配,需要指定字段名,但是輸入會(huì)進(jìn)行分詞,比如"hello
world"會(huì)進(jìn)行拆分為hello和world,然后匹配,如果字段中包含hello或者
world,或者都包含的結(jié)果都會(huì)被查詢(xún)出來(lái),也就是說(shuō)match是一個(gè)部分匹配的模
糊查詢(xún)。查詢(xún)條件相對(duì)來(lái)說(shuō)比較寬松。 - term
term: 這種查詢(xún)和match在有些時(shí)候是等價(jià)的,比如我們查詢(xún)單個(gè)的詞hello,那
么會(huì)和match查詢(xún)結(jié)果一樣,但是如果查詢(xún)"hello world",結(jié)果就相差很大,因
為這個(gè)輸入不會(huì)進(jìn)行分詞,就是說(shuō)查詢(xún)的時(shí)候,是查詢(xún)字段分詞結(jié)果中是否
有"hello world"的字樣,而不是查詢(xún)字段中包含"hello world"的字樣。當(dāng)保存
文本text數(shù)據(jù)"hello world"時(shí),elasticsearch會(huì)對(duì)字段內(nèi)容進(jìn)行分詞,“hello world"會(huì)被分成hello和world,不存在"hello world”,因此這里的查詢(xún)結(jié)果會(huì)為空。這也是term查詢(xún)和match的區(qū)別。 - match_phase
match_phase:會(huì)對(duì)輸入做分詞,但是需要結(jié)果中也包含所有的分詞,而且順序要求一樣。以"hello world"為例,要求結(jié)果中必須包含hello和world,而且還要求
他們是連著的,順序也是固定的,hello that word不滿(mǎn)足,world hello也不滿(mǎn)
足條件。 - query_string
query_string:和match類(lèi)似,但是match需要指定字段名,query_string是在所有字段中搜索范圍更廣泛。
文檔映射
ES中映射可以分為動(dòng)態(tài)映射和靜態(tài)映射
動(dòng)態(tài)映射
在關(guān)系數(shù)據(jù)庫(kù)中,需要事先創(chuàng)建數(shù)據(jù)庫(kù),然后在該數(shù)據(jù)庫(kù)下創(chuàng)建數(shù)據(jù)表,并創(chuàng)建
表字段、類(lèi)型、長(zhǎng)度、主鍵等,最后才能基于表插入數(shù)據(jù)。而Elasticsearch中不
需要定義Mapping映射(即關(guān)系型數(shù)據(jù)庫(kù)的表、字段等),在文檔寫(xiě)入
Elasticsearch時(shí),會(huì)根據(jù)文檔字段自動(dòng)識(shí)別類(lèi)型,這種機(jī)制稱(chēng)之為動(dòng)態(tài)映射。
動(dòng)態(tài)映射規(guī)則如下:
- 靜態(tài)映射
靜態(tài)映射是在Elasticsearch中也可以事先定義好映射,包含文檔的各字段類(lèi)
型、分詞器等,這種方式稱(chēng)之為靜態(tài)映射。
動(dòng)態(tài)映射
- 刪除原創(chuàng)建的索引
DELETE /users - 創(chuàng)建索引
PUT /users - 創(chuàng)建文檔(ES根據(jù)數(shù)據(jù)類(lèi)型, 會(huì)自動(dòng)創(chuàng)建映射)
- 獲取文檔映射
Get /users/_mapping
靜態(tài)映射
- 刪除原創(chuàng)建的索引
-
創(chuàng)建索引
PUT /users2 -
設(shè)置文檔映射
- 根據(jù)靜態(tài)映射創(chuàng)建文檔
- 獲取文檔映射
GET /users2/_mapping
核心數(shù)據(jù)類(lèi)型
- 字符串:string,string類(lèi)型包含 text 和 keyword。
text:該類(lèi)型被用來(lái)索引長(zhǎng)文本,在創(chuàng)建索引前會(huì)將這些文本進(jìn)行分詞,轉(zhuǎn)化為
詞的組合,建立索引;允許es來(lái)檢索這些詞,text類(lèi)型不能用來(lái)排序和聚合。
keyword:該類(lèi)型不能分詞,可以被用來(lái)檢索過(guò)濾、排序和聚合,keyword類(lèi)型不
可用text進(jìn)行分詞模糊檢索。 - 數(shù)值型:long、integer、short、byte、double、float
- 日期型:date
- 布爾型:boolean
keyword 與 text 映射類(lèi)型的區(qū)別
name字段為 keyword 映射 (只能精準(zhǔn)查詢(xún), 不能分詞查詢(xún),能聚合、
排序)
book 字段為 text 映射能模糊查詢(xún), 能分詞查詢(xún),不能聚合、排序)
對(duì)已存在的mapping映射進(jìn)行修改
具體方法
1)如果要推倒現(xiàn)有的映射, 你得重新建立一個(gè)靜態(tài)索引
2)然后把之前索引里的數(shù)據(jù)導(dǎo)入到新的索引里
3)刪除原創(chuàng)建的索引
4)為新索引起個(gè)別名, 為原索引名
我們需要先創(chuàng)建一個(gè)新的索引映射users,再將users2的數(shù)據(jù)轉(zhuǎn)移到users中。
通過(guò)這幾個(gè)步驟就實(shí)現(xiàn)了索引的平滑過(guò)渡,并且是零停機(jī),不需要去重啟服務(wù)器,只需要在客戶(hù)端進(jìn)行命令操作即可。
Elasticsearch樂(lè)觀并發(fā)控制
在數(shù)據(jù)庫(kù)領(lǐng)域中,有兩種方法來(lái)確保并發(fā)更新,不會(huì)丟失數(shù)據(jù):
- 悲觀并發(fā)控制
這種方法被關(guān)系型數(shù)據(jù)庫(kù)廣泛使用,它假定有變更沖突可能發(fā)生,因此阻塞訪問(wèn)
資源以防止沖突。 一個(gè)典型的例子是讀取一行數(shù)據(jù)之前先將其鎖住,確保只有放
置鎖的線程能夠?qū)@行數(shù)據(jù)進(jìn)行修改。 - 樂(lè)觀并發(fā)控制
Elasticsearch 中使用的這種方法假定沖突是不可能發(fā)生的,并且不會(huì)阻塞正在
嘗試的操作。 然而,如果源數(shù)據(jù)在讀寫(xiě)當(dāng)中被修改,更新將會(huì)失敗。應(yīng)用程序接
下來(lái)將決定該如何解決沖突。 例如,可以重試更新、使用新的數(shù)據(jù)、或者將相關(guān)
情況報(bào)告給用戶(hù)。
3、再以創(chuàng)建一個(gè)文檔為例 - ES老版本(7.0之前)
實(shí)現(xiàn)_version樂(lè)觀鎖更新文檔
PUT /users2/_doc/4?version=1 {"name":"daxia","age":20,"sex":1,"book":"java進(jìn)階線程","address":"廣州" }- ES新版本不使用version進(jìn)行并發(fā)版本控制 if_seq_no=版本值
&if_primary_term=文檔位置
_seq_no:文檔版本號(hào),作用同_version
_primary_term:文檔所在位置
總結(jié)
以上是生活随笔為你收集整理的分布式搜索引擎ElasticSearch(二)---ElasticSearch进阶使用教程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 通过 汇编了解C语言 指针 悬垂指针概念
- 下一篇: 软件工程实践总结(个人)