ElasticSearch系列04 核心概念

2021-07-31 05:12:44 字數 4471 閱讀 9216

一、es配置檔案詳解

elasticsearch.yml

es的基本配置檔案

詳見elasticsearch中文.yml

logging.yml

日誌配置檔案,es也是使用log4j來記錄日誌的,所以logging.yml裡的設定按普通log4j配置來設定就行了。

二、es中的核心概念

cluster***

代表乙個集群,集群中有多個節點,其中有乙個為主節點,這個主節點是可以通過選舉產生的,主從節點是對於集群內部來說的。es的乙個概念就是去中心化,字面上理解就是無中心節點,這是對於集群外部來說的,因為從外部來看es集群,在邏輯上是個整體,你與任何乙個節點的通訊和與整個es集群通訊是等價的。

主節點的職責是負責管理集群狀態,包括管理分片的狀態和副本的狀態,以及節點的發現和刪除。

只需要在同乙個網段之內啟動多個es節點,就可以自動組成乙個集群。

預設情況下es會自動發現同一網段內的節點,自動組成集群。

集群狀態檢視

shards*

代表索引分片,es可以把乙個完整的索引分成多個分片,這樣的好處是可以把乙個大的索引拆分成多個,分布到不同的節點上。構成分布式搜尋。分片的數量只能在索引建立前指定,並且索引建立後不能更改。

可以在建立索引庫的時候指定

curl -xput 'localhost:9200/test1/' -d'}'

預設是乙個索引庫有5個分片

index.number_of_shards: 5

replicas*

代表索引副本,es可以給索引設定副本,副本的作用一是提高系統的容錯性,當某個節點某個分片損壞或丟失時可以從副本中恢復。二是提高es的查詢效率,es會自動對搜尋請求進行負載均衡。

可以在建立索引庫的時候指定

curl -xput 'localhost:9200/test2/' -d'}'

預設是乙個分片有1個副本

index.number_of_replicas: 1

recovery *

代表資料恢復或叫資料重新分布,es在有節點加入或退出時會根據機器的負載對索引分片進行重新分配,掛掉的節點重新啟動時也會進行資料恢復。

gateway*

代表es索引的持久化儲存方式,es預設是先把索引存放到記憶體中,當記憶體滿了時再持久化到硬碟。當這個es集群關閉再重新啟動時就會從gateway中讀取索引資料。es支援多種型別的gateway,有本地檔案系統(預設),分布式檔案系統,hadoop的hdfs和amazon的s3雲儲存服務。

discovery.zen*

代表es的自動發現節點機制,es是乙個基於p2p的系統,它先通過廣播尋找存在的節點,再通過多播協議來進行節點之間的通訊,同時也支援點對點的互動。

如果是不同網段的節點如何組成es集群

禁用自動發現機制

discovery.zen.ping.multicast.enabled: false

設定新節點被啟動時能夠發現的主節點列表

discovery.zen.ping.unicast.hosts: ["10.11.52.131", "10.11.52.134:9300"]

三、searchtype詳解

es的搜尋型別有4種

query and fetch(速度最快)(返回n倍資料量)

query then fetch(預設的搜尋方式)

dfs query and fetch(可以更精確控制搜尋打分和排名。)

dfs query then fetch

dfs解釋:見備註

總結一下,從效能考慮query_and_fetch是最快的,dfs_query_then_fetch是最慢的。從搜尋的準確度來說,dfs要比非dfs的準確度更高。

四、es查詢詳解

查詢:query

.setquery(querybuilders.matchquery("name", "test"))

分頁:from/size

.setfrom(0).setsize(1)

排序:sort

.addsort("age", sortorder.desc)

過濾:filter

.setpostfilter(filterbuilders.rangefilter("age").from(1).to(19))

高亮:highlight

統計:facet(已廢棄)使用aggregations 替代

根據字段進行分組統計

根據字段分組,統計其他欄位的值

size設定為0,會獲取所有資料,否則,只會返回10條。

es中的分頁

與sql使用limit來控制單「頁」數量類似,elasticsearch使用的是from以及size兩個引數:

size:每次返回多少個結果,預設值為10

from:從哪條結果開始,預設值為0

假設每頁顯示5條結果,那麼1至3頁的請求就是:

get /_search?size=5

get /_search?size=5&from=5

get /_search?size=5&from=10

注意:不要一次請求過多或者頁碼過大的結果,這麼會對伺服器造成很大的壓力。因為它們會在返回前排序。乙個請求會經過多個分片。每個分片都會生成自己的排序結果。然後再進行集中整理,以確保最終結果的正確性。

es中的timeout

timed_out告訴了我們查詢是否超時

es會在10ms之內返回查詢內容

注意:timeout並不會終止查詢,它只是會在你指定的時間內返回當時已經查詢到的資料,然後關閉連線。在後台,其他的查詢可能會依舊繼續,儘管查詢結果已經被返回了。

五、es的多索引和多型別查詢

url |說明

/_search |搜尋所有的索引庫和型別中的文件

/megacorp/_search |搜尋索引megacorp中的所有型別的文件

/megacorp,beijing/_search |搜尋索引megacorp和beijing中的所有型別的文件

/c*,b*/_search |搜尋所有以c或b開頭的索引中的所有型別的文件

/megacorp/emp/_search |搜尋索引megacorp中型別為emp的所有文件

/megacorp,beijing/emp,city/_search |搜尋索引megacorp以及beijing中型別為emp和city的所有文件

/_all/emp,city/_search |搜尋所有索引中型別為emp以及city內的所有文件

六、es中文分詞整合

elasticsearch官方提供的分詞外掛程式,對中文分詞效果不是很好

整合ik分詞工具

3:把編譯後的target/releases下的elasticsearch-analysis-ik-1.2.9.zip檔案拷貝到es_home/plugins/analysis-ik目錄下面,然後解壓

5:修改es_home/config/elasticsearch.yml檔案,新增index.analysis.analyzer.default.type: ik(把ik設定為預設分詞器,這一步是可選的)

6:重啟es服務

7:測試分詞效果: curl 'http://localhost:9200/megacorp/_analyze?analyzer=ik&pretty=true' -d ''

settings修改索引庫預設配置

例如:分片數量,副本數量

檢視:curl -xget http://localhost:9200/megacorp/_settings?pretty

curl -xput 'localhost:9200/megacorp/' -d'}'

例如:字段型別,使用哪種分詞工具

八、es中的分片查詢方式

預設是randomize across shards

隨機選取,表示隨機的從分片中取資料

_local:指查詢操作會優先在本地節點有的分片中查詢,沒有的話再在其它節點查詢。

_primary:指查詢只在主分片中查詢

_primary_first:指查詢會先在主分片中查詢,如果主分片找不到(掛了),就會在副本中查詢。

_only_node:指在指定id的節點裡面進行查詢,如果該節點只有要dx查詢索引的部分分片,就只在這部分分片中查詢,所以查詢結果可能不完整。如_only_node:123在節點id為123的節點中查詢。

_prefer_node:nodeid 優先在指定的節點上執行查詢

_shards:0 ,1,2,3,4:查詢指定分片的資料

自定義:_only_nodes:根據多個節點進行查詢

elasticsearch啟動報錯系列

wget 解壓tar zxvf elasticsearch 6.2.4.tar.gz 在啟動過程 中會遇到這兩個問題 1 max file descriptors 4096 for elasticsearch process is too low,increase to at least 65536...

Elasticsearch系列九 Bool 查詢

案例書籍推薦 bool查詢對應lucenne中的booleanquery,它由乙個或者多個子句組成,match 分詞匹配,下面的例子會對查詢盡心分詞,分為 寶馬 多少 馬力 那麼所有包含這三個詞中的乙個或者多個文件就會被搜尋出來.match phrase 針對上面的例子,乙個文件 我的保時捷也不錯 ...

Elasticsearch系列之八 操作API

date 2019 04 07 思考了一下還是系統地將操作api總結一下,基本是參看官方文件,使用kibana執行命令 特別方便 我為了使用漢化kibana 不想執行python檔案 將es版本換成6.7.1,相應的ik外掛程式 kibana都換成了6.7.1版本 沒有用最新的7.0版本 建議首先安...