elasticsearch——海量文档高性能索引系统
elasticsearch
elasticsearch是一個高性能高擴展性的索引系統,底層基于apache lucene。
可結合kibana工具進行可視化。
概念:
- index 索引: 類似SQL中的一張表,索引名必須是全小寫單詞。
- type(索引類型):設計初衷是用type對相同邏輯結構(字段名)數據的歸并,一個index中只能有一種 type,在6.0版本之后被標記為過時(deprecated),在后續大版本(7.x, 8.x+)中會將被完全棄用。
- document 文檔:若干個鍵值對的數據,類似SQL的一行記錄。
檢索
ES的CRUD可通過kibana工具包中的Dev Tools進行。
使用http請求實現索引查詢,search操作請求基本格式為GET /<index-name>/_search
一個簡單查詢,無條件查文檔的請求如下:
GET /myindex/_search {"query": {"match_all": {}} }一個簡單查詢(如無條件查文檔)返回的形式如下:
{"took" : 0,"timed_out" : false,"_shards" : {"total" : 5,"successful" : 5,"skipped" : 0,"failed" : 0},"hits" : {"total" : 1,"max_score" : 1.0,"hits" : [{"_index" : "myindex","_type" : "_doc","_id" : "-31ddGgBVZ-2SafgL7-y","_score" : 1.0,"_source" : {"name" : "Jack Ma3"}}]} }其中字段意義如下:
- took 查詢耗時
- time_out 查詢是否超時
- _shards 查詢在分片上執行的結果狀態
- hits 查詢結果
- hits.total 匹配的總文檔數
- hits.max_score 結果文檔的最高分值
- hits.hits 匹配上的文檔結果集合
- hits.hits._index 該文檔所在索引
- hits.hits._type 該文檔所在類型
- hits.hits._id 文檔id
- hits.hits._score 該文檔與查詢條件的匹配分值
- hits.hits._source 文檔字段鍵值數據
查詢請求一般格式首先是GET的HTTP方法,請求地址形式為“//_search”,http請求攜帶的數據為一個json,包括"query"部分,該部分是查詢條件。限定文檔條數通過指定"size"實現。在分頁場景中設置查詢起始位置通過指定"from"實現。可通過設置"sort"指定排序條件。如:
GET /myindex/_search {"query": {"match_all":{}},"from": 100,"size": 10,"sort":"age" }查詢條件部分,"query",其內容為一個json對象,鍵是布爾值謂詞或篩選謂詞(filter),值是對應內容,一般是json對象。布爾值謂詞包括布爾邏輯操作謂詞、文檔匹配謂詞,前者對應布爾邏輯的與或非等,后者用于判斷一個文檔是否滿足某種要求。
謂詞是查詢條件json對象的鍵,其值一般是json對象(或者對象數組),值內容json對象的鍵是謂詞,從json對象頂層深入往里看,查詢條件類似前綴表達式,首先看到的是謂詞(operator),然后才看到謂詞對應的操作數(operand)。
例:
有以下查詢謂詞:
- match_all 無條件匹配所有文檔。
- match_none 不匹配任何文檔
- match 值內容是json對象,鍵是文檔字段,值是目標匹配值或者帶選項的值(json對象,目標值在"value"字段)。該種查詢將會對字段值進行分析。
- ids 根據若干id查詢文檔。
- prefix 非分析性查詢。查詢字段的項是否具有給定前綴。
- match_phrase
- match_phrase_prefix
- term 非分析性查詢。精確匹配一個項
- terms 類似term,匹配給定數組中任意一個值
- terms_set
- wilcard 非分析性查詢。支持通配符*和?的查詢。查詢將遍歷每個項,故應避免通配符打頭的查詢。
- regexp 正則匹配。是在字段的項(terms)上的匹配,而非原文本。
- fuzzy 根據給定值對字段的項進行模糊查詢,以編輯距離度量模糊性。
- bool 表明是一個布爾條件,其下是若干謂詞組成的復雜條件
- must 必須匹配,一般對多個條件使用(數組),類似“與 AND”
- must_not 不匹配,相當于"非 NOT",可以對多個條件(數組)使用
- should 語義為“應該”匹配,“邏輯或 OR”與之接近(可指定子條件的至少匹配個數),一般對若干條件使用(或),表示匹配多個條件中的若干個條件,一般指至少匹配1個,通過與should平行層級的鍵minimum_should_match指定should中需要至少匹配的條件數量。在某些情況默認至少匹配1個。
謂詞值是json對象時,其多個鍵名(子謂詞)之間的關系基本是“與 and”關系。與"should"(平行層級)共存時,需小心"should"能匹配的條件數以及條件至少匹配數"TODO"的設置。
term:term用于精確匹配倒排索引中的一個項(term)。也可用在范圍類型數據(range data types)上。
GET _search {"query":{"term": {"field1": "value1"}} }GET _search {"query": {"bool": {"should": [{"term": {"field1": {"value": "value1","boost": 2.0 #相比boost:1.0的條件重要兩倍}}},{"term": {"field2": "value2"}}]}} }如,字段“content”的類型配置為text,現有一文檔,其該字段的值為“hello es”,在入庫該文檔時,由于字段類型是text,分詞器會將其分為"hello"和"es"兩個項(term)存入倒排索引。在用term查詢時,如果查詢字段"content"上的值"hello"是能檢索到該文檔的(或查詢值為"es"也可檢索到),但利用term查詢字段"content"上值為"hello es"的文檔,則不能命中上述文檔,因為在倒排索引中沒有"hello es"的項。
terms_set: terms_set
GET _search {"query":{"terms_set": {"terms": ["value1","value2",...],"minimum_should_match_field":"<another_field>" #引用文檔其他整型字段的值來指定terms中需要匹配的term的個數"minimum_should_match_script": "或者通過腳本提供需匹配個數"}} }match: match會用分析器進行分詞。
GET /_search{"query": {"match": {"my_field":"my_value"}} }前綴匹配:prefix、match_phrase_prefix
GET _search {"query":{"prefix": {"FIELD": "PREFIX"}} }模糊查詢:fuzzy 在字段的項(term)上匹配
GET _search {"query":{"fuzzy":{"field1": {"value": "my_value","fuzziness": 4 #編輯距離參數以配置模糊程度}}} }根據id查詢多個文檔:利用_mget,索引名和類型是可選項。 GET /_mget GET /<index>/_mget,GET /<index>/_doc/_mget
GET /mget {"ids":["id1", "id2"] }批獲取 multi-get:
根據多個條件一次性獲取
批量操作 Bulk API:
REST API服務端點是_bulk,請求攜帶數據是以行分隔的json(NDJSON),即一行一json,基本形式如下:
攜帶行分隔json數據的請求,其http頭“content-type”的值需設置為"application/x-ndjson"。
Bulk API允許的操作有“index”、“create”、“delete”、“”、“update”。
POST /_bulk {"index": {"_index": "myindex","_type":"", "_id": ""}} # index operation {"field1":"val1"} # data carried by index operation {"create": {"_index":""} {"field1":"val1"} {"update": {"_index":"","_type":"","_id":""}} {"doc": {field1":"val1"}} #注意:update需指定是doc還是script方式,而不是直接提供文檔結構數據 {"delete":{"_index":"", "_id":""}} #delete不攜帶數據體批查詢: _msearch
計數:_count
GET /.../_count # /_count /<index>/_count {"query": ... }復制索引 reindex:將一個索引中的若干文檔復制到另一個中,rest服務端點_reindex。
POST _reindex {"source":{"index": "myindex" #必須。指定源索引,單個或多個(數組)"_source": ... #可選。指定復制的字段,默認全部字段。"type": "" #可選。單個或多個(多個時對應多個索引情況)"sort": ... #排序標準,當指定size時有意義。"query": ... #可選。篩選條件"size": ... #scroll batch size},"dest": {"index": "" #必須。指定目標索引"op_type": "create" #可選參數,復制操作類型"version_type": "" #可選參數,指定版本類型}"size": <number> #可選。指定復制文檔數量,默認全部。"script": ... #可選。腳本 }立即更新 ?refresh: index,update,delete等操作的影響默認在一段時候后才會被其他(查詢)操作觀察到,而操作是立即返回的。即類似于多線程,一個線程對數據的更新在一定延遲后才對其他線程可見。這一行為可通過?refresh參數控制,為false時(默認情況),操作影響在一定延遲后可見;為true或空時,立即對其他(查詢)操作可見,當然,這需要考慮因此可能引發的性能問題;為wait_for時,等待索引的自動刷新操作時更新數據,索引刷新動作根據index.refresh_interval(默認1秒)周期性更新。
分頁:
指定from(默認從0開始), size(默認10條?), sort(默認升序):
排序:
- 單字段排序,以默認升降序:sort: "字段名"
- 單字段排序,指定升降序
- 多字段排序,以默認升降序:`sort: ["字段1", "字段2"]
- 多字段排序,每個字段指定升降序。
sort的各種形式:
{"sort" : [{ "date" : {"order" : "asc"}},"user",{ "name" : "desc" },{ "age" : "desc" },"_score"] }指定最小分值 min_score :
GET /_search {"min_score": 0.8,"query": ... }支持多索引檢索(multi index),請求地址中索引部分由多個索引以逗號拼接而成,_all表示所有索引。多索引查詢中索引名支持通配符*,如所有以"myindex"打頭的索引:myindex*,以及通配符+排除-,如以"myindex"打頭但除了myindex1:myindex*,-myindex1。
多索引相關參數:
- ignore_unavailable true或false,忽略不存在或已關閉(closed)的索引
- allow_no_indices false或true,表示在通配符未能匹配任何索引時是否需要報異常。
- expand_wildcards 為其中之一none,open,closed,all, open,closed(等同all)。分別指禁用通配符擴展、僅擴展到open的索引、僅擴展到closed的、擴展到兩種的。
時間日期相關參數……。
通用參數:
- pretty 改觀返回數據的可視化
- ……
可指定需要返回的字段:
GET /myindex/_search {"query":{"match_all":{}},"_source":["field1","field2"] } GET ... {..."_source": {"include": ["profile"],"exclude": ["profile.location"]} }單個字段:_source: "字段名";多個字段: _source:["字段1","字段2"];不返回: _source:false;
_source_include, _source_exclude。
不想返回hits數組(如在聚合查詢時):設置size為0:
GET ... {"query": ...,"size": 0,"aggs": ... }{"doc_fields":["field1"] }返回'not_analyzed'的字段,'text'之類的字段不允許在doc_fields中。
查詢謂詞可以用在"query"和"filter"兩種上下文,"query"要解決的問題是“是否匹配+匹配得怎么樣(即相似性、分值)”,"filter"解決的是“是否匹配”,filter更多用于結構性、可直接匹配性的字段(數值、枚舉值字段)。
游標式讀取:
ES支持以“游標”方式讀取大批量文檔,文檔查詢時設置以“游標”方式返回數據,ES每批次返回一定數量的文檔,以及一個字符串指針,以供下次繼續查詢使用。
游標式讀取報錯:游標上下文失效?TODO
TODO _index和_type,有例子為:_index: test_20190102, _type: test_t (_t應該是配置的后綴,_index和_type有相同的前綴,_index名帶了日期)
增刪改
創建/替換文檔: POST /<index-name>/_doc/ 或指定文檔id: PUT /<index-name>/_doc/<id>,PUT時意指創建或者替換,必須指定文檔id。POST時意指創建或更新,可不指定文檔id。索引不存在時會自動創建索引。其中的_doc指type,index有且僅有一個type,默認為_doc。PUT /<index>/_doc/<id>/_create,僅作插入(創建),如果文檔已存在,則報失敗。
# create a document POST /myindex/_doc {"name":"Jack Ma" }# create or replace a document PUT /myindex/_doc/<id> {"name":"Jack Ma" }更新文檔: POST /<index-name>/_doc/<id>/_update
更新id為“1”的文檔的"name"字段,并添加一個“age”和"films"字段。更新可通過文檔內容或腳本完成,分別提供頂級鍵“doc”或“script”指定。更新請求的地址中如果沒有最后的"_update",則是創建或替換(創建/替換沒有頂級鍵"doc"或"script",而是直接提供文檔內容)。
也可以通過腳本更新文檔。
將"age"字段值加6:
刪除文檔:通過id刪除 DELETE /<index-name>/_doc/<id>
DELETE /myindex/_doc/`通過查詢刪除:DELETE /<index>/_delete_by_query
DELETE /myindex/_delete_by_query {"query": {...} }通過查詢條件更新:POST /<index>/_update_by_query
聚合 aggregation
GET ... {..."aggs": ... #聚合 }均值 avg:avg
{"aggs": {"my_return_field": { #聚合結果字段名"avg": {"field": "my_field" "missing": value-for-missing-such-field #可選。在字段缺失時的補充值}}} } {"aggs": {"my_avg": {"avg": {"script": "doc.my_field.value" }}} }加權均值: weighted_avg,計算公式∑(value * weight) / ∑(weight)
{"aggs": {"my_return_field": {"weighted_avg": {"weight": {"field": "權值字段","missing": ... #可選。默認忽略該文檔},"value": {"field": "值字段","missing": ... #可選。默認權值為1}}}} }數組數據+單值權重:對于一個文檔的字段值為數組權重值為單值的情況,視為各自元素是相互獨立的,即各自元素乘以權重,權重和(分母)是參與計算的權重的和,即元素多少個則該次計算就有多少倍權重參與計算。
#數據為: {"g": [5,2,8],"w": 3 } #聚合查詢為: {"aggs": {"weighted_avg": {value: {"field": "g"},"weight": {"field": "w"}}} } #結果為: (5*3+2*3+8*3)/(3+3+3)最大值 max
最小值:min
和:sum
百分位: percentiles 要求數據字段類型為數值型。
{"aggs":{"my_return_field":{"percentiles": {"field": "數據字段","percents": [,,,] #可選。百分位點,默認[ 1, 5, 25, 50, 75, 95, 99 ]}}} } #返回 {"aggregations": {"my_return_field": {"values": [{"key": 1.0, #百分位點"value": xxx #數據點},{ "key": 99.0, "value": xxx }]}} } }cardinality:cardinality ……
常用統計量:stats 返回 和(sum)、個數(count)、最小值(min)、最大值(max)、均值(avg)。
{"aggs": {"my_return_field": {"stats": {"field": "統計字段", #或通過腳本"missing": xxx #可選。}}} } #返回 {"aggregations": {"my_return_field": {"count": 4,"min": 20.0,"max": 80.0,"avg": 55.0,"sum": 220.0}} }常見統計量:extended_stats 返回 和(sum)、平方和(sum_of_squares)、個數(count)、最小值(min)、最大值(max)、均值(avg)、方差(variance)、標準差(std_deviation)等統計量。
{"aggs": {"extended_stats": {"field": "統計字段" #字段或者腳本'script'}} }值計數: terms 返回值以及對應計數
{"aggs":{"my_facet":{"terms"{"field": "統計字段" #在字段(field)上或使用腳本(將"field"換為"script": ...)"size": <結果條數(默認以計數降序排列)>}}} }返回樣例
{..."aggregations": {"my_facet": {...buckets:[{"key": "詞1","doc_count": <n1> #對應計數,默認按計數降序排列},{"key": "詞2","doc_count": <n2>}]}} }經緯坐標邊界查詢:返回匹配文檔的經緯坐標所覆蓋的邊界,以邊界左上和右下兩點坐標為代表數據返回,要求數據字段類型為geo_point。
{"aggs":{"my_return_field":{"geo_bounds":{"field": "geo-data-field"}}} }經緯坐標中心點查詢: geo_centroid
自定義map-reduce腳本聚合:scripted_metric
{"aggs":{"my_return_field":{"scripted_metric": {"init_script": ...,"map_script": ...,"combine_script":...,"reduce_script":...}}} }……
索引CURD
列舉索引:GET /_cat/indices?v或GET /_cat/indices列舉所有索引及相關信息,一索引一行,各列表示相關信息,第三列是索引名,?v參數表示需要顯示表頭。
創建索引:PUT /<索引名>,索引名必須全小,可以提供索引的字段配置。
PUT /myindex {"mappings": {"_doc": {"properties": {"field1": {"type": "keyword"},"field2": {"type": "text" },"field3": {"type": "integer" },"field4": {"type": "date" }}}} }字符串形態的類型有兩種,text和keyword,text類型的字符串將會被分析器分詞,分詞后一個詞叫做一個'term',然后存入倒排索引。keyword類型字符串不會被分詞。
刪除索引:DELETE /<索引名>,刪除索引將導致其中所有文檔被刪除。
顯示集群狀態:
GET /
腳本
TODO
查詢里腳本的可用上下文變量
安裝 配置 運行
安裝elasticsearch
進入es下載頁面,選擇下載最新穩定版包,以6.5.4為例,下載地址 https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.5.4.tar.gz 。
解壓程序包并啟動單節點集群:
ES默認在9200端口提供REST API服務。ES也提供transport api服務,該服務區別于REST API的地方主要是其數據交互是以java對象序列化/反序列化進行,該形式的API正計劃被棄用。
如果報錯max virtual memory areas vm.max_map_count [xxxx] is too low,可在/etc/sysctl.conf中添加vm.max_map_count=655360,然后sysctl -p來調整相應系統參數,之后可成功啟動es。
配置 elasticsearch
環境變量ES_PATH_CONF指定ES配置文件存放目錄。
配置目錄可有如下配置文件:
- elasticsearch.yml
- jvm.options JVM參數,一行一個參數。支持僅對特定jvm版本啟用配置的語法。環境變量ES_JAVA_OPTS配置jvm參數。
- log4j2.properties 日志相關
默認配置文件目錄$ES_HOME/conf/。
#elasticsearch.yml action.auto_create_index: myindex*,other_inx*,+allowed_inx*,-disallowed_inx* #對滿足模式的索引名按需自動創建索引,支持通配符,支持以逗號拼接出的多個模式,“+”開頭的表示允許,“-”開頭的表示禁止cluster.name: #集群名,默認“elasticsearch”,同集群名的節點形成集群node.name: #節點名path:data: #索引數據存取目錄,可以配成多個目錄的數組logs: #日志輸出目錄 network.host: #服務網口,特殊值_local_, _site_, _global_ #特殊的值:${prompt.text}和${prompt.secret}表示將在控制臺提示并讀取輸入作為對應配置值 #node.name: ${prompt.text}discovery.zen.ping.unicast.hosts: #若干<host>:<port>,<port>未指定時,將會掃描對應主機的9300~9305端口 discovery.zen.minimum_master_nodes: <數量> ##multi-search, multi-get, bulk相關 rest.action.multi.allow_explicit_index: true(默認)|false # false時,將會拒絕request-body中修改URL參數中指定的index的行為環境變量ES_TMPDIR配置ES臨時文件目錄,linux版默認/tmp。
安裝kibana
進入kibana下載頁面,選擇下載最新穩定版,以6.5.4為例,下載地址 https://artifacts.elastic.co/downloads/kibana/kibana-6.5.4-linux-x86_64.tar.gz 。解壓程序包并啟動,程序將在默認的5601端口提供Web服務。
tar -xzvf kibana-6.5.4-linux-x86_64.tar.gz cd kibana-6.5.4-linux-x86_64 bin/kibana配置 kibana
conf/kibana.yml
server.host: #kibana服務綁定的host, 0.0.0.0綁定到所有網絡接口 server.port:轉載于:https://www.cnblogs.com/xmaples/p/10308992.html
總結
以上是生活随笔為你收集整理的elasticsearch——海量文档高性能索引系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二、先在SD卡上启动U-boot,再烧写
- 下一篇: Elasticsearch环境搭建和介绍