ElasticSearch數據庫的使用簡介

weixin_43377584 2022-05-14 14:43:34 阅读数:98

elasticsearch使用

ElasticSearch(簡稱ES)是一個開源的高擴展的分布式全文檢索引擎;它可以近乎實時的存儲、檢索數據;本身擴展性很好,可以擴展到上百臺服務器;可以處理PB級別的數據。
是當前流行的企業級搜索引擎。

官方文檔:https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
參考:概述


curl命令行查詢數據

連接es數據庫:

curl -u admin:admin https://master:9200/

查詢所有索引:

curl -u admin:admin 'https://master:9200/_cat/indices?v'

查詢單個索引內容,如查詢cqic_surf_chn_mul_yer索引庫:

curl -u admin:admin https://master:9200/cqic_surf_chn_mul_yer/_search?pretty

根據條件查詢:

curl -u admin:admin https://master:9200/bigdata/_search?q=name:hadoop&pretty

注意:高版本的es增加了安全機制,要求嚴格內容類型查詢,所以在查詢時需要加上請求頭:-H "Content-Type: application/json"


查詢的返回結果

返回結果是JSON格式;
其中最重要的是hits字段,默認包含所查詢結果的前10個文檔,且包含文檔的_index、_type、_id、_source字段;
可以直接從返回結果中獲得整個文檔,而不像其他搜索引擎僅返回文檔的ID,需要單獨去獲取文檔。
_score衡量了文檔與查詢的匹配程度,返回文檔按_score降序排列;
total字段錶示匹配到的文檔總數;
注:es查詢結果上限1萬條,如果需要查詢數據超過1W,可以調整參數:max_result_window,或翻頁查詢,見下文。


DSL查詢語言

DSL(domain specific language)查詢語句的執行結果依賴於它們是用於查詢語境還是過濾語境。
query的內容會自動進行分詞拆分。

1、空查詢
沒有查詢條件的查詢,就是空查詢,會匹配所有文檔。
{"query": {}},等同於:{"query": {"match_all": {}}}

2、查詢與過濾
DSL查詢根據使用目的不同分為兩種類型:查詢(Query context);過濾(Filter context)
查詢(Query):在上下文查詢語境中,會詢問文檔與查詢語句的匹配程度,判斷文檔是否匹配並計算相關性評分(_score)。
過濾(Filter):在上下文過濾語境中,主要解决文檔是否匹配的問題,而不會在意匹配程度(相關性評分),過濾主要用於結構化數據。

一般來說,過濾語句比查詢語句的執行效率高,因為它不用計算文檔的相關性評分。頻繁使用的過濾語句的結果集會被 ES自動緩存,以提高性能。過濾的目的就是粗暴地快速縮小匹配的結果集。通常全文搜索或需要用到相關性評分的場景采用查詢(query),其他的全部用過濾(filter)。在進行搜索時,常會結合查詢和過濾來達到我們的查詢目的。

3、全文查詢

說明
match關鍵字匹配查詢,模糊查詢,默認是邏輯或,可通過operator參數更改
term關鍵字匹配查詢,精確查詢
terms關鍵字匹配查詢,多條件查詢 match_all 無條件查詢所有
range範圍查詢,gt大於;lt小於;gte大於或等於;lte小於或等於
bool複合查詢,組合葉子查詢或複合查詢語句,如must, should, must_not

must和should在上下文查詢中執行;must_not在上下文過濾中執行


python操作es數據庫

安裝elasticsearch包,參考 官方文檔

pip install elasticsearch

create 如果文檔不存在就創建,但如果文檔存在就返回錯誤
index 如果文檔不存在就創建,如果文檔存在就更新
update 更新一個文檔,如果文檔不存在就返回錯誤
delete 删除一個文檔,如果文檔id不存在就返回錯誤

其中index是比較常用的。還有bulk的操作,某一個操作失敗,不會影響其他文檔的操作,並會在返回結果中告訴你失敗的詳細原因。

如果插入數據信息有問題想修正,可以采用update方法

注意:更新數據時采用{“doc”:{“name”:“python1”,“addr”:“深圳1”}}字典模式,尤其是doc標識不能缺少。

删除數據比較簡單,指定文檔的索引、文檔類型和文檔ID即可。

遊標查詢(scroll查詢):可以用於對ES有效地執行大批量的文檔查詢,而又不用付出深度分頁那種代價。

多文檔操作:multi_get 和 bulk,適合批量操作

注意:創建索引庫和索引時,索引庫名稱必須全部小寫,不能以下劃線開頭,不能含逗號;如果沒有指定ID,es會自動生成隨機ID

create(): index是索引名稱, doc_type是文檔類型, id是唯一標識ID, body是文檔內容
index(): 與create()區別是不需要指定id,會自動生成一個id, create()方法其實是index()的封裝

term query會去倒排索引中尋找確切的term,它並不知道分詞器的存在。這種查詢適合keyword 、numeric、date。
term:查詢某個字段裏含有某個關鍵詞的文檔
terms:查詢某個字段裏含有多個關鍵詞的文檔
a、term 和 terms 是 包含(contains) 操作,而非 等值(equals) (判斷)
b、不知道分詞器的存在,所以不會去分詞,

bulk方法:
可以同時執行多個操作,但只請求一次,從而在批量操作時很大程度上减少程序系統開銷。此外,bulk不僅可以批量執行插入或删除,還可以在一次請求中,既插入又删除或更新。 但要注意的是,任何一種操作都有固定的文檔格式,只有完全符合該格式要求,才可執行成功。

es寫入數據時有個刷新時間間隔默認1s,所以當時寫入,要過一小會兒才能查詢到

更多細節參考:
https://blog.csdn.net/sinat_38682860/article/details/107693969
https://blog.csdn.net/weixin_42182448/article/details/113655731
#http://www.cnblogs.com/letong/p/4749234.html
#http://elasticsearch-py.readthedocs.io/en/master/api.html#elasticsearch
#http://blog.csdn.net/xiaoxinwenziyao/article/details/49471977
#https://github.com/Parsely/pykafka

創建索引時的設置

1、settings
主要用來配置索引的一些全局屬性,比如分片數,副本數,刷新頻次等。
number_of_shards:索引分片數量
索引分片數在索引創建好了之後就不能調整了,只能重建索引
number_of_replicas:控制索引的副本數量
index.refresh_interval:索引刷新頻率

索引刷新頻率:數據寫入後幾秒可以被搜索到,默認是 1s。每次索引的 refresh 會產生一個新的 lucene 段,這會導致頻繁的合並行為,如果業務需求對實時性要求沒那麼高,可以將此參數調大。

2、mapping
定義文檔及其包含的字段如何存儲和索引。【詳見下節】
每個文檔都是字段的集合,每個字段都有自己的數據類型。 mapping屬性主要用來設置索引中的字段名稱和字段類型以及text字段的分詞策略


映射和數據類型

映射(mapping)

映射是定義一個文檔及其所包含字段如何被存儲和索引的方法。

mapping主要有2種類型:
1、動態映射(Dynamic Mapping)
寫入文檔時,索引不存在,會自動創建索引, 無需手動創建,ES會根據內容推斷字段的類型,推斷會不准確,可能造成某些功能無法使用,例如 範圍查詢。

2、精確映射 Explicit mapping
由用戶自己定義索引的映射,這種方式會更加精准。

避免類型陷阱:

It is no longer possible to delete the mapping for a type. Instead you should delete the index and recreate it with the new mappings.

注意:
ES的mapping可以新增字段,但是對於已經存在的字段,只能添加屬性,不能修改字段的類型。
如果需要修改已經存在的字段的type類型,只能進行重建索引reindex。
ES的mapping並不是不能修改,只是不能對已經存在的字段類型進行修改。
Elasticsearch底層使用的是lucene庫,字段類型修改以後索引和搜索要涉及分詞方式等操作,不允許修改類型在我看來是符合lucene機制的。
ES無法更改現有索引的數據結構;只能删除數據,不能删除數據結構;數據結構類型一旦定義,無法修改!
在一個關系型數據庫中,錶之間是相互獨立的。一個錶中的列與另一個錶中同名的列沒有關系。然而在映射類型中卻不是這樣的。

在一個Elasticsearch的索引中,有相同名稱字段的不同映射類型在Lucene內部是由同一個字段支持的。這會導致一些問題,比如,當你希望在一個索引中的兩個映射類型,一個映射類型中的 deleted 字段映射為一個日期數據類型的字段,而在另一個映射類型中的 deleted 字段映射為一個布爾數據類型的字段,這就會失敗。最重要的是,在一個索引中存儲那些有很少或沒有相同字段的實體會導致稀疏數據,並且幹擾Lucene有效壓縮文檔的能力。基於這些原因,我們决定從Elasticsearch中删除映射類型的概念。

數據類型

es中的文檔等價於java中的對象,是强數據類型。

text 類型

用來索引長文本(如新聞正文、郵件內容等),在建立索引前會將這些文本進行分詞,轉化為詞的組合,建立索引。允許es來檢索這些詞語。不能用來排序和聚合。

keyword 類型

適合簡短、結構化字符串,如email地址、手機號等,可以用於過濾、排序、聚合檢索,也可以用於精確查詢。不需要進行分詞。keyword 類型字段只能用本身來進行檢索。

數字類型

數字類型分為 long、integer、short、byte、double、float、half_float、scaled_float。
數字類型的字段在滿足需求的前提下應當盡量選擇範圍較小的數據類型,字段長度越短,搜索效率越高,對於浮點數,可以優先考慮使用 scaled_float 類型,該類型可以通過縮放因子來精確浮點數,例如 12.34 可以轉換為 1234 來存儲。

日期類型

在 ES 中日期可以為以下形式:
1、格式化日期字符串,如 2020-03-17 00:002020/03/17
2、時間戳(和 1970-01-01 00:00:00 UTC 的差值),單比特毫秒或者秒

布爾類型

JSON 文檔中同樣存在布爾類型,不過 JSON 字符串類型也可以被 ES 轉換為布爾類型存儲,前提是字符串的取值為 true 或者 false,布爾類型常用於檢索中的過濾條件。

參考:
關於數據類型和搜索的問題
修改索引字段類型的一種解决辦法
解决自定義mapping的問題


大批量數據查詢

出於可靠性、數據傳輸大小、服務器穩定性等等多方面的原因,es不接受一次性對數據庫的所有內容進行遍曆。es默認支持的查詢數量是10,000。

要遍曆所有查詢結果,有三種方法:
1、分頁循環遍曆
2、scroll方法
scroll可以理解為一個遊標或書簽,當發起一個查詢請求的時候,服務器會整理完全部的結果,但是這些結果不能一次性全部導出,只能分頁導出,scroll就是這些頁碼的書簽。
3、helpers.scan
返回數據對象迭代器,很大節省內存空間,查詢速度要遠遠大於search。scroll進行數據分頁,也可以返回大數據,但其返回的數據是以list的形式,如果一次需要返回的數據量比較大的話,則會十分耗費內存,而且數據傳輸速度也會比較慢。

當Elasticsearch響應請求時,它必須確定docs的順序,全局排序響應結果。
如果請求的頁數較少,假設每頁10個docs,即pageSize=10,此時Elasticsearch不會有什麼問題。
但若取的頁數較大時(深分頁),如請求第20頁,Elasticsearch不得不取出所有分片上的第1頁到第20頁的所有docs,假設你有16個分片,則需要在coordinate node 匯總到 shards* (from+size)條記錄,即需要 16*(20+10)記錄後做一次全局排序,再最終取出 from後的size條結果作為最終的響應。 所以:當索引非常非常大(千萬或億),是無法按 from + size 做深分頁的,分頁越深則越容易OOM,即便不OOM,也是很消耗CPU和內存資源的。 遊標查詢允許我們 先做查詢初始化,然後再批量地拉取結果。
這有點兒像傳統數據庫中的 cursor 。 遊標查詢會取某個時間點的快照數據。 查詢初始化之後索引上的任何變化會被它忽略。
它通過保存舊的數據文件來實現這個特性,結果就像保留初始化時的索引 視圖 一樣。
深度分頁的代價根源是結果集全局排序,如果去掉全局排序的特性的話查詢結果的成本就會很低。 遊標查詢用字段 _doc 來排序。 這個指令讓 Elasticsearch 僅僅從還有結果的分片返回下一批結果。

參考:
https://blog.csdn.net/a583929112/article/details/106363909

關於數據類型的設置:
https://blog.csdn.net/sinat_35930259/article/details/80354732
https://www.cnblogs.com/shoufeng/p/11266136.html
https://baijiahao.baidu.com/s?id=1661467987954314526&wfr=spider&for=pc

版权声明:本文为[weixin_43377584]所创,转载请带上原文链接,感谢。 https://gsmany.com/2022/134/202205141441135978.html