一、文檔批量操作
1.批量獲取文檔數(shù)據(jù)
批量獲取文檔數(shù)據(jù)是通過_mget的API來(lái)實(shí)現(xiàn)的
(1)在URL中不指定index和type
-
請(qǐng)求方式:GET
-
請(qǐng)求地址:_mget
-
功能說明 : 可以通過ID批量獲取不同index和type的數(shù)據(jù)
-
請(qǐng)求參數(shù):
-
docs : 文檔數(shù)組參數(shù)
-
_index : 指定index
-
_type : 指定type(7.x的版本不推薦使用)
-
_id : 指定id
-
_source : 指定要查詢的字段
(2)在URL中指定index
-
請(qǐng)求方式:GET
-
請(qǐng)求地址:/{{indexName}}/_mget
-
功能說明 : 可以通過ID批量獲取不同index和type的數(shù)據(jù)
-
請(qǐng)求參數(shù):
-
docs : 文檔數(shù)組參數(shù)
-
_index : 指定index
-
_type : 指定type(7.x的版本不推薦使用)
-
_id : 指定id
-
_source : 指定要查詢的字段
(3)在URL中指定index和type
-
請(qǐng)求方式:GET
-
請(qǐng)求地址:
/{{indexName}}/{{typeName}}/_mget
-
功能說明 : 可以通過ID批量獲取不同index和type的數(shù)據(jù)
-
請(qǐng)求參數(shù):
-
docs : 文檔數(shù)組參數(shù)
-
_index : 指定index
-
_type : 指定type
-
_id : 指定id
-
_source : 指定要查詢的字段
2.批量操作文檔數(shù)據(jù)
批量對(duì)文檔進(jìn)行寫操作是通過_bulk的API來(lái)實(shí)現(xiàn)的
-
請(qǐng)求方式:POST
-
請(qǐng)求地址:_bulk
-
請(qǐng)求參數(shù):通過_bulk操作文檔,一般至少有兩行參數(shù)(或偶數(shù)行參數(shù))
-
第一行參數(shù)為指定操作的類型及操作的對(duì)象(index,type和id)
-
第二行參數(shù)才是操作的數(shù)據(jù)
{“actionName”:{“_index”:“indexName”, “_type”:“typeName”,“_id”:“id”}}
{“field1”:“value1”, “field2”:“value2”}
- actionName:表示操作類型,主要有create,index,delete和update
(1)批量創(chuàng)建文檔create
(2)普通創(chuàng)建或全量替換index
- 如果原文檔不存在,則是創(chuàng)建
- 如果原文檔存在,則是替換(全量修改原文檔)
(3)批量刪除delete
(4)批量修改update
二.DSL語(yǔ)言高級(jí)查詢
1.Query DSL概述
2.無(wú)查詢條件
無(wú)查詢條件是查詢所有,默認(rèn)是查詢所有的,或者使用match_all表示所有
3.有查詢條件
3.1 葉子條件查詢(單字段查詢條件)
3.1.1 模糊匹配
模糊匹配主要是針對(duì)文本類型的字段,文本類型的字段會(huì)對(duì)內(nèi)容進(jìn)行分詞,對(duì)查詢時(shí),也會(huì)對(duì)搜索條件進(jìn)行分詞,然后通過倒排索引查找到匹配的數(shù)據(jù),模糊匹配主要通過match等參數(shù)來(lái)實(shí)現(xiàn)
- match : 通過match關(guān)鍵詞模糊匹配條件內(nèi)容
- prefix : 前綴匹配
- regexp : 通過正則表達(dá)式來(lái)匹配數(shù)據(jù)
match的復(fù)雜用法
match條件還支持以下參數(shù):
-
query : 指定匹配的值
-
operator : 匹配條件類型
-
and : 條件分詞后都要匹配
-
or : 條件分詞后有一個(gè)匹配即可(默認(rèn))
-
minmum_should_match : 指定最小匹配的數(shù)量
3.1.2 精確匹配
- term : 單個(gè)條件相等
- terms : 單個(gè)字段屬于某個(gè)值數(shù)組內(nèi)的值
- range : 字段屬于某個(gè)范圍內(nèi)的值
- exists : 某個(gè)字段的值是否存在
- ids : 通過ID批量查詢
3.2 組合條件查詢(多條件查詢)
組合條件查詢是將葉子條件查詢語(yǔ)句進(jìn)行組合而形成的一個(gè)完整的查詢條件
-
bool : 各條件之間有and,or或not的關(guān)系
-
must : 各個(gè)條件都必須滿足,即各條件是and的關(guān)系
-
should : 各個(gè)條件有一個(gè)滿足即可,即各條件是or的關(guān)系
-
must_not : 不滿足所有條件,即各條件是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 等的子條件是通過 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ù)組
3.3 連接查詢(多文檔合并查詢)
- 父子文檔查詢:parent/child
- 嵌套文檔查詢: nested
3.4 DSL查詢語(yǔ)言中存在兩種:查詢DSL(query DSL)和過濾DSL(filter DSL)
query DSL
在查詢上下文中,查詢會(huì)回答這個(gè)問題——“這個(gè)文檔匹不匹配這個(gè)查詢,它的相關(guān)度高么?”
如何驗(yàn)證匹配很好理解,如何計(jì)算相關(guān)度呢?ES中索引的數(shù)據(jù)都會(huì)存儲(chǔ)一個(gè)_score分值,分值越高就代表越匹配。另外關(guān)于某個(gè)搜索的分值計(jì)算還是很復(fù)雜的,因此也需要一定的時(shí)間。
filter DSL
在過濾器上下文中,查詢會(huì)回答這個(gè)問題——“這個(gè)文檔匹不匹配?”
答案很簡(jiǎn)單,是或者不是。它不會(huì)去計(jì)算任何分值,也不會(huì)關(guān)心返回的排序問題,因此效率會(huì)高一點(diǎn)。
過濾上下文 是在使用filter參數(shù)時(shí)候的執(zhí)行環(huán)境,比如在bool查詢中使用must_not或者filter
另外,經(jīng)常使用過濾器,ES會(huì)自動(dòng)的緩存過濾器的內(nèi)容,這對(duì)于查詢來(lái)說,會(huì)提高很多性能。
3.5 Query方式查詢:案例
- 根據(jù)名稱精確查詢姓名 term, term查詢不會(huì)對(duì)字段進(jìn)行分詞查詢,會(huì)采用精確匹配
注意: 采用term精確查詢, 查詢字段映射類型屬于為keyword.
- 根據(jù)備注信息模糊查詢 match, match會(huì)根據(jù)該字段的分詞器,進(jìn)行分詞查詢
- 多字段模糊匹配查詢與精準(zhǔn)查詢 multi_match
- 未指定字段條件查詢 query_string , 含 AND 與 OR 條件
- 指定字段條件查詢 query_string , 含 AND 與 OR 條件
- 范圍查詢
注:json請(qǐng)求字符串中部分字段的含義
? range:范圍關(guān)鍵字
? gte 大于等于
? lte 小于等于
? gt 大于
? lt 小于
? now 當(dāng)前時(shí)間
- 分頁(yè)、輸出字段、排序綜合查詢
_source :
3.6 Filter過濾器方式查詢,它的查詢不會(huì)計(jì)算相關(guān)性分值,也不會(huì)對(duì)結(jié)果進(jìn)行排序, 因此效率會(huì)高一點(diǎn),查詢的結(jié)果可以被緩存。
Filter Context 對(duì)數(shù)據(jù)進(jìn)行過濾
總結(jié):
- match
match:模糊匹配,需要指定字段名,但是輸入會(huì)進(jìn)行分詞,比如"hello world"會(huì)進(jìn)行拆分為hello和world,然后匹配,如果字段中包含hello或者world,或者都包含的結(jié)果都會(huì)被查詢出來(lái),也就是說match是一個(gè)部分匹配的模糊查詢。查詢條件相對(duì)來(lái)說比較寬松。
- term
term: 這種查詢和match在有些時(shí)候是等價(jià)的,比如我們查詢單個(gè)的詞hello,那么會(huì)和match查詢結(jié)果一樣,但是如果查詢"hello world",結(jié)果就相差很大,因?yàn)檫@個(gè)輸入不會(huì)進(jìn)行分詞,就是說查詢的時(shí)候,是查詢字段分詞結(jié)果中是否有"hello world"的字樣,而不是查詢字段中包含"hello world"的字樣。當(dāng)保存數(shù)據(jù)"hello world"時(shí),elasticsearch會(huì)對(duì)字段內(nèi)容進(jìn)行分詞,“hello world"會(huì)被分成hello和world,不存在"hello world”,因此這里的查詢結(jié)果會(huì)為空。這也是term查詢和match的區(qū)別。
- match_phase
match_phase:會(huì)對(duì)輸入做分詞,但是需要結(jié)果中也包含所有的分詞,而且順序要求一樣。以"hello world"為例,要求結(jié)果中必須包含hello和world,而且還要求他們是連著的,順序也是固定的,hello that world不滿足,world hello也不滿足條件。
- query_string
query_string:和match類似,但是match需要指定字段名,query_string是在所有字段中搜索,范圍更廣泛。
三.文檔映射
1.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)建表字段、類型、長(zhǎng)度、主鍵等,最后才能基于表插入數(shù)據(jù)。
而Elasticsearch中不需要定義Mapping映射(即關(guān)系型數(shù)據(jù)庫(kù)的表、字段等),在文檔寫入Elasticsearch時(shí),會(huì)根據(jù)文檔字段自動(dòng)識(shí)別類型,這種機(jī)制稱之為動(dòng)態(tài)映射。
動(dòng)態(tài)映射規(guī)則如下:
靜態(tài)映射:
靜態(tài)映射是在Elasticsearch中也可以事先定義好映射,包含文檔的各字段類型、分詞器等,這種方式稱之為靜態(tài)映射。
2 動(dòng)態(tài)映射
2.1 刪除原創(chuàng)建的索引
DELETE /es_db
2.2 創(chuàng)建索引
PUT /es_db
2.3 創(chuàng)建文檔(ES根據(jù)數(shù)據(jù)類型, 會(huì)自動(dòng)創(chuàng)建映射)
2.4 獲取文檔映射
GET /es_db/_mapping
3 靜態(tài)映射
3.1 刪除原創(chuàng)建的索引
DELETE /es_db
3.2 創(chuàng)建索引
3.3 設(shè)置文檔映射
“index”: true – name是否需要進(jìn)行分詞 true-需要
“store”:true – 是否存儲(chǔ) true 時(shí)會(huì)將查詢到的數(shù)據(jù)存儲(chǔ)起來(lái)
如果一個(gè)字段的mapping中含有store屬性為true,那么有一個(gè)單獨(dú)的存儲(chǔ)空間為這個(gè)字段做存儲(chǔ),而且這個(gè)存儲(chǔ)是獨(dú)立于_source的存儲(chǔ)的。它具有更快的查詢。存儲(chǔ)該字段會(huì)占用磁盤空間。如果需要從文檔中提?。丛谀_本中和聚合),它會(huì)幫助減少計(jì)算。在聚合時(shí),具有store屬性的字段會(huì)比不具有這個(gè)屬性的字段快。 此選項(xiàng)的可能值為false和true。
3.5 獲取文檔映射
由于ElasticSearch使用索引名稱作為磁盤上的目錄名稱,這些名稱必須符合不同操作系統(tǒng)的約定。
同時(shí)需遵守下列規(guī)則:
- 索引名必須為小寫字母
- 不能包括 , /, *, ?, “, <, >, |, 空格, 逗號(hào), #
- 7.0版本之后不能使用冒號(hào):
- 不能以這些字符 -, _, + 開頭
- 不能包括 . 或 …
- 長(zhǎng)度不能超過 255 個(gè)字符
四.核心類型(Core datatype)
字符串:string,string類型包含 text 和 keyword。
text:該類型被用來(lái)索引長(zhǎng)文本,在創(chuàng)建索引前會(huì)將這些文本進(jìn)行分詞,轉(zhuǎn)化為詞的組合,建立索引;允許es來(lái)檢索這些詞,text類型不能用來(lái)排序和聚合。
keyword:該類型不能分詞,可以被用來(lái)檢索過濾、排序和聚合,keyword類型不可用text進(jìn)行分詞模糊檢索。
數(shù)值型:long、integer、short、byte、double、float
日期型:date
布爾型:boolean
五.keyword 與 text 映射類型的區(qū)別
將 book 字段設(shè)置為 keyword 映射 (只能精準(zhǔn)查詢, 不能分詞查詢,能聚合、排序)
將 book 字段設(shè)置為 text 映射能模糊查詢, 能分詞查詢,不能聚合、排序)
term: 不會(huì)被拆開
match:會(huì)被拆開
六.創(chuàng)建靜態(tài)映射時(shí)指定text類型的ik分詞器
1.設(shè)置ik分詞器的文檔映射
先刪除之前的es_db
再創(chuàng)建新的es_db
定義ik_smart的映射
PUT /es_db
{
“mappings”:{
“properties”:{
“name”:{“type”:“keyword”,“index”:true,“store”:true},
“sex”:{“type”:“integer”,“index”:true,“store”:true},
“age”:{“type”:“integer”,“index”:true,“store”:true},
“book”:{“type”:“text”,“index”:true,“store”:true,“analyzer”:“ik_smart”,“search_analyzer”:“ik_smart”},
“address”:{“type”:“text”,“index”:true,“store”:true}
}
}
}
2.分詞查詢
POST /es_db/_doc/_search
{
“query”: {
“match”: {“address”: “廣”}
}
}
POST /es_db/_doc/_search
{
“query”: {
“match”: {“address”: “廣州”}
}
}
七.對(duì)已存在的mapping映射進(jìn)行修改
具體方法
1)如果要推倒現(xiàn)有的映射, 你得重新建立一個(gè)靜態(tài)索引
2)然后把之前索引里的數(shù)據(jù)導(dǎo)入到新的索引里
3)刪除原創(chuàng)建的索引
4)為新索引起個(gè)別名, 為原索引名
注意: 通過這幾個(gè)步驟就實(shí)現(xiàn)了索引的平滑過渡,并且是零停機(jī)
八.Elasticsearch樂觀并發(fā)控制
在數(shù)據(jù)庫(kù)領(lǐng)域中,有兩種方法來(lái)確保并發(fā)更新,不會(huì)丟失數(shù)據(jù):
1、悲觀并發(fā)控制
這種方法被關(guān)系型數(shù)據(jù)庫(kù)廣泛使用,它假定有變更沖突可能發(fā)生,因此阻塞訪問資源以防止沖突。 一個(gè)典型的例子是讀取一行數(shù)據(jù)之前先將其鎖住,確保只有放置鎖的線程能夠?qū)@行數(shù)據(jù)進(jìn)行修改。
2、樂觀并發(fā)控制
Elasticsearch 中使用的這種方法假定沖突是不可能發(fā)生的,并且不會(huì)阻塞正在嘗試的操作。 然而,如果源數(shù)據(jù)在讀寫當(dāng)中被修改,更新將會(huì)失敗。應(yīng)用程序接下來(lái)將決定該如何解決沖突。 例如,可以重試更新、使用新的數(shù)據(jù)、或者將相關(guān)情況報(bào)告給用戶。
4、實(shí)現(xiàn)_version樂觀鎖更新文檔
本次操作使用的版本時(shí)7.12.1 version關(guān)鍵字已經(jīng)被淘汰了不能使用。
5、ES新版本(7.x)不使用version進(jìn)行并發(fā)版本控制 if_seq_no=版本值&if_primary_term=文檔位置
_seq_no:文檔版本號(hào),作用同_version
_primary_term:文檔所在位置文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-840433.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-840433.html
到了這里,關(guān)于ElasticSearch DSL語(yǔ)法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!