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