官網: https://www.elastic.co/cn/
中文社區: https://elasticsearch.cn/ (可下載任意版本)
目前官網最新是7.5.0,我這里使用的次新版 7.4.2版本, Linux
默認它不允許使用 root用戶,我們這里使用的是yangw這個用戶.
安裝elasticsearch之前,請確保已安裝了JDK8
tar -zxvf elasticsearch-7.4.2-linux-x86_64.tar.gz #解壓縮
mv elasticsearch-7.4.2 elasticsearch
cd elasticsearch/
mkdir data
cd config/
vim jvm.options 我的虛擬機內存只設置了1G,故改一下虛擬機大小參數,見圖
vim elasticsearch.yml (path指定的路徑若不存在則自行創建); 網絡改成0.0.0.0表示任意IP都能連
cd ../bin
./elasticsearch
它的啟動會比較慢,需要耐心等待...
啟動報如下5個錯.
[1]: initial heap size [268435456] not equal to maximum heap size [536870912]; this can cause resize pauses and prevents mlockall from locking the entire heap
解決辦法: 重新修改elasticsearch的 jvm.options, 將內存都改成512m即可解決;
[2]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
解決辦法:
ulimit -Hn 查看硬限制 結果是4096
切換到root用戶
vim /etc/security/limits.conf
在文件最后追加內容: (其中yangw表示對yangw這個用戶做的修改. 也可以用 * 表示所有用戶)
yangw soft nofile 65536
yangw hard nofile 65536
一般要使用 exit命令退出當前終端,再重新登錄啟動即可生效;
[3]: max number of threads [3764] for user [yangw] is too low, increase to at least [4096]
解決辦法:
切換到root用戶
vim /etc/security/limits.conf
在文件最后追加內容
yangw soft nproc 4096
yangw hard nproc 4096
一般要使用 exit命令退出當前終端,再重新登錄啟動即可生效;
[4]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
解決辦法:
切換到root用戶,編輯文件 vim /etc/sysctl.conf 在末尾追加內容:
vm.max_map_count=262144
並執行命令 sysctl -p
[5]: the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured
解決辦法:
后台運行
若要在關閉終端的時候,讓Elasticsearch繼續保持運行。最簡單的方法就是使用 nohup。 先按Ctrl + C,停止當前運行的Elasticsearch,改用下面的命令運行Elasticsearch
nohup ./bin/elasticsearch&
成功啟動后的日志截圖:
9300端口: ES節點之間通訊使用
9200端口: ES節點 和 外部 通訊使用
9300是TCP協議端口號,ES集群之間通訊端口號
9200端口號,暴露ES RESTful接口端口號
瀏覽器訪問:
IK分詞器 可以到github上下載:(選擇與elasticsearch一樣的版本 7.4.2 )
https://github.com/medcl/elasticsearch-analysis-ik/tree/master
https://github.com/medcl/elasticsearch-analysis-ik/releases (選擇任意版本)
Analyzer: ik_smart
, ik_max_word
, Tokenizer: ik_smart
, ik_max_word
安裝步驟:
將elasticsearch-analysis-ik-7.4.2.zip上傳到elasticsearch安裝目錄的plugins目錄
unzip elasticsearch-analysis-ik-7.4.2.zip -d analysis-ik
rm -rf elasticsearch-analysis-ik-7.4.2.zip
重新啟動 elasticsearch
官方提供大量的Rest風格API: https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
官方提供各語言的客戶端API:https://www.elastic.co/guide/en/elasticsearch/client/index.html
Java Low Level REST Client 是低級別的封裝,提供一些基礎功能,但更靈活;
Java High Level REST Client是高級別的封裝,功能更豐富和完善,而且API會變得簡單;
客戶端這塊,我們主要是學習 Spring Data Elasticsearch 客戶端API
而且還提供了操作Elasticsearch索引數據的控制台,並且提供了一定的API提示。
一句話,它就是可視化窗口工具.
它是基於Nodejs的,故要現在Linux服務器上安裝Nodejs環境
nodejs安裝步驟:
上傳 node-v10.16.3-linux-x64.tar.gz 包到服務器,
tar -zxvf node-v10.16.3-linux-x64.tar.gz
mv node-v10.16.3-linux-x64 node_10.16.3
cd ~
vim .bashrc
添加環境變量內容:
source .bashrc
查看版本node -v 出現版本號就表示OK.
kibana安裝步驟
tar -zxvf kibana-7.4.2-linux-x86_64.tar.gz
cd kibana-7.4.2-linux-x86_64
cd config
vim kibana.yml
修改如下內容:
cd ../bin
./kibana
啟動時間稍微長一點,請耐心等待.
若啟動報如下類型的錯誤
Status changed from yellow to red - [data] Elasticsearch cluster did not respond with license information.
請修改elasticsearch的配置文件,vim elasticsearch.yml
再次啟動,就正常了,正常日志如下:
瀏覽器訪問:
kibana的控制台,可以對http請求進行簡化.
-
請求方式:PUT
-
請求路徑:/索引庫名
-
請求參數:json格式:
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 2
}
}-
settings:索引庫的設置
-
number_of_shards:分片數量
-
number_of_replicas:副本數量
-
-
查看索引 GET /索引庫名
刪除索引 DELETE /索引庫名
當然,我們也可以用HEAD請求,查看索引是否存在
屬性字段的一些設置
-
type:類型,可以是text、long、short、date、integer、object等
-
index:是否索引,默認為true
-
store:是否存儲,默認為false
-
analyzer:分詞器,這里的
ik_max_word
即使用ik分詞器
數據類型: https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html

-
String類型,又分兩種:
-
text:可分詞,不可參與聚合
-
keyword:不可分詞,數據會作為完整字段進行匹配,可以參與聚合
-
-
Numerical:數值類型,分兩類
-
基本數據類型:long、interger、short、byte、double、float、half_float
-
浮點數的高精度類型:scaled_float
-
需要指定一個精度因子,比如10或100。elasticsearch會把真實值乘以這個因子后存儲,取出時再還原。
-
-
-
Date:日期類型
elasticsearch可以對日期格式化為字符串存儲,但是建議我們存儲為毫秒值,存儲為long,節省空間。
index影響字段的索引情況。
-
true:字段會被索引,則可以用來進行搜索。默認值就是true
-
false:字段不會被索引,不能用來搜索
index的默認值就是true,也就是說你不進行任何配置,所有字段都會被索引。
但是有些字段是我們不希望被索引的,比如商品的圖片信息,就需要手動設置index為false。
2.5.3.3.store
是否將數據進行額外存儲。
在學習lucene和solr時,我們知道如果一個字段的store設置為false,那么在文檔列表中就不會有這個字段的值,用戶的搜索結果中不會顯示出來。
但是在Elasticsearch中,即便store設置為false,也可以搜索到結果。
原因是Elasticsearch在創建文檔索引時,會將文檔中的原始數據備份,保存到一個叫做_source
的屬性中。而且我們可以通過過濾_source
來選擇哪些要顯示,哪些不顯示。
而如果設置store為true,就會在_source
以外額外存儲一份數據,多余,因此一般我們都會將store設置為false,事實上,store的默認值就是false。
創建映射 PUT /索引庫名/_mapping (這個是elastic7.x的語法)
查看映射 GET /索引庫名/_mapping
查看映射(某個具體的字段) GET /索引庫名/_mapping/field/字段名
Elasticsearch 7.x
- 不建議在請求中指定類型。新索引API使用
PUT {index}/_doc/{id}
於顯式ID 和POST {index}/_doc
自動生成的ID。請注意,在7.0中,它_doc
是路徑的永久部分,代表端點名稱而不是文檔類型。
事實上Elasticsearch非常智能,你不需要給索引庫設置任何mapping映射,它也可以根據你輸入的數據來判斷類型,動態添加數據映射。
更新數據 POST /索引庫名/_update/{id}
刪除數據 DELETE /索引庫名/_doc/{id}
https://www.elastic.co/guide/en/elasticsearch/reference/7.4/query-dsl-match-query.html
https://www.elastic.co/guide/en/elasticsearch/reference/7.4/full-text-queries.html
查詢數據語法:
GET /索引庫名/_search
{
"query":{
"查詢類型":{
"查詢條件":"查詢條件值"
}
}
}
這里的query代表一個查詢對象,里面可以有不同的查詢屬性
-
查詢類型:
-
例如:
match_all
,match
,term
,range
等等
-
-
查詢條件:查詢條件會根據類型的不同,寫法也有差異。
-
took:查詢花費時間,單位是毫秒
-
time_out:是否超時
-
_shards:分片信息
-
hits:搜索結果總覽對象
-
total:搜索到的總條數
-
max_score:所有結果中文檔得分的最高分
-
hits:搜索結果的文檔對象數組,每個元素是一條搜索到的文檔信息
-
_index:索引庫
-
_type:文檔類型
-
_id:文檔id
-
_score:文檔得分
-
_source:文檔的源數據
-
-
匹配查詢(match)
默認是or的關系,如果要再精確匹配的話,可以使用 "operator":"and"
詞條匹配(term)
https://www.elastic.co/guide/en/elasticsearch/reference/7.4/query-dsl-term-query.html
term
查詢被用於精確值 匹配,這些精確值可能是數字、時間、布爾或者那些未分詞的字符串
https://www.elastic.co/guide/en/elasticsearch/reference/7.4/query-dsl-terms-query.html
默認情況下,elasticsearch在搜索的結果中,會把文檔中保存在 _source
的所有字段都返回。
1. 如果我們只想獲取其中的部分字段,我們可以添加_source
的過濾;
2. 也可以在_source中使用includes excutes來設置包含和排除那些字段;
布爾組合(bool)
bool
把各種其它查詢通過must
(與)、must_not
(非)、should
(或)的方式進行組合
range
查詢找出那些落在指定區間內的數字或者時間
gt 大於 gte 大於等於 lt小於 lte 小於等於
模糊查詢(fuzzy)
fuzzy
查詢是 term
查詢的模糊等價。它允許用戶搜索詞條與實際詞條的拼寫出現偏差,但是偏差的編輯距離不得超過2:
條件查詢中進行過濾
filter
方式;
一般都是在bool查詢中使用filter
無查詢條件,直接過濾
如果一次查詢只有過濾,沒有查詢條件,不希望進行評分,我們可以使用constant_score
取代只有 filter 語句的 bool 查詢。在性能上是完全相同的,但對於提高查詢簡潔性和清晰度有很大幫助。
排序
單字段排序
sort
可以讓我們按照不同的字段進行排序,並且通過order
指定排序的方式
聚合aggregations
-
什么品牌的手機最受歡迎?
-
這些手機的平均價格、最高價格、最低價格?
-
這些手機每月的銷售情況如何?
實現這些統計功能的比數據庫的sql要方便的多,而且查詢速度非常快,可以實現實時搜索效果。
Elasticsearch中的聚合,包含多種類型,最常用的兩種,一個叫桶
,一個叫度量
:
桶的作用,是按照某種方式對數據進行分組,每一組數據在ES中稱為一個
Elasticsearch中提供的划分桶的方式有很多:
-
Date Histogram Aggregation:根據日期階梯分組,例如給定階梯為周,會自動每周分為一組
-
Histogram Aggregation:根據數值階梯分組,與日期類似
-
Terms Aggregation:根據詞條內容分組,詞條內容完全匹配的為一組
-
Range Aggregation:數值和日期的范圍分組,指定開始和結束,然后按段分組
-
……
bucket aggregations 只負責對數據進行分組,並不進行計算,因此往往bucket中往往會嵌套另一種聚合:metrics aggregations即度量
度量(metrics)
分組完成以后,我們一般會對組中的數據進行聚合運算,例如求平均值、最大、最小、求和等,這些在ES中稱為度量
比較常用的一些度量聚合方式:
-
Avg Aggregation:求平均值
-
Max Aggregation:求最大值
-
Min Aggregation:求最小值
-
Percentiles Aggregation:求百分比
-
Stats Aggregation:同時返回avg、max、min、sum、count等
-
Sum Aggregation:求和
-
Top hits Aggregation:求前幾
-
Value Count Aggregation:求總數
-
……
注意:在ES中,需要進行聚合、排序、過濾的字段其處理方式比較特殊,因此不能被分詞。這里我們將color和make這兩個文字類型的字段設置為keyword類型,這個類型不會被分詞,將來就可以參與聚合
例子: 常見索引庫,定義字段,批量插入數據
批量插入用 _bulk
-
size: 查詢條數,這里設置為0,因為我們不關心搜索到的數據,只關心聚合結果,提高效率
-
aggs:聲明這是一個聚合查詢,是aggregations的縮寫
-
popular_colors:給這次聚合起一個名字,任意。
-
terms:划分桶的方式,這里是根據詞條划分
-
field:划分桶的字段
-
-
-
前面的例子告訴我們每個桶里面的文檔數量,這很有用。 但通常,我們的應用需要提供更復雜的文檔度量。 例如,每種顏色汽車的平均價格是多少?
因此,我們需要告訴Elasticsearch使用哪個字段
,使用何種度量方式
進行運算,這些信息要嵌套在桶
內,度量
的運算會基於桶
內的文檔進行
現在,我們為剛剛的聚合結果添加 求價格平均值的度量:
-
aggs:我們在上一個aggs(popular_colors)中添加新的aggs。可見
度量
也是一個聚合 -
avg_price:聚合的名稱
-
avg:度量的類型,這里是求平均值
-
field:度量運算的字段
桶內嵌套桶
比如:我們想統計每種顏色的汽車中,分別屬於哪個制造商,按照make
字段再進行分桶
階梯分桶Histogram
histogram是把數值類型的字段,按照一定的階梯大小進行分組。你需要指定一個階梯值(interval)來划分階梯大小
摘自別的地方:
bootstrap.memory_lock: true導致Elasticsearch啟動失敗問題
elasticsearch官網建議生產環境需要設置bootstrap.memory_lock: true
解決辦法如下:
需要修改
/etc/security/limits.conf
baoshan soft memlock unlimited
baoshan hard memlock unlimited
修改:
/etc/sysctl.conf
vm.swappiness=0
之后重啟機器