一、直接在虛擬機(jī)中搭建 elasticsearch 環(huán)境
1.運(yùn)行需要 JAVA 環(huán)境
2.elasticsearch 下載地址
https://www.elastic.co/cn/downloads/past-releases#elasticsearch
問題1: 下載后解壓可能起不來:注意兩點(diǎn),1.不要用root用戶啟動,2.不要放在root家目錄下面
創(chuàng)建elsearch用戶組及elsearch用戶:
groupadd elsearch
useradd elsearch -g elsearch
passwd elsearch
更改elasticsearch文件夾及內(nèi)部文件的所屬用戶及組為elsearch:elsearch
cd /opt
chown -R elsearch:elsearch elasticsearch-6.8.8
切換到elsearch用戶再啟動
su elsearch
cd /opt/elasticsearch-6.8.8/bin
./elasticsearch
問題2: 每個進(jìn)程最大同時打開文件數(shù)太小
max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
修改 /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
* soft nproc 4096
* hard nproc 4096
執(zhí)行命令 sysctl -p 生效
問題3: elasticsearch用戶擁有的內(nèi)存權(quán)限太小,至少需要262144
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
執(zhí)行命令:
sysctl -w vm.max_map_count=262144
或修改 /etc/sysctl.conf
vm.max_map_count=262144
問題4: 外部瀏覽器無法訪問
修改配置文件 elaticsearch.yml 里面的
network 0.0.0.0
上面問題都解決了再次啟動,并驗(yàn)證是否啟動成功
查看es健康狀態(tài):
curl http://localhost:9200/_cat/health?v
在瀏覽器上輸入
ip:9200 查看是否有json串出來
3.kibana
https://www.elastic.co/cn/downloads/past-releases/kibana-6-8-8
修改kibana.yml配置,讓其找到es的地址
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://localhost:9200"]
啟動
cd bin
nohup ./kibana &
4.分詞
有兩種下載安裝方式
- 使用插件命令下載
cd /opt/elasticsearch-6.8.8/bin
./elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.8.8/elasticsearch-analysis-ik-6.8.8.zip
- 手動下載拷貝
https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v6.8.8
下載elasticsearch-analysis-ik-6.8.8.zip包,在win下解壓zip包
cd /opt/elasticsearch-6.8.8/plugins
mkdir ik
把win解壓的zip里面內(nèi)容 拷貝到 ik目錄下
重啟 elasticsearch
二、在docker中搭建 elasticsearch 環(huán)境
先在虛擬機(jī)中安裝docker,參見docker教程:
出現(xiàn) docker0: iptables: No chain/target/match by that name 錯誤
解決:重啟docker
service docker restart
docker 下載鏡像倉庫地址:https://hub.docker.com/
1.安裝 elasticsearch
docker pull docker.elastic.co/elasticsearch/elasticsearch:6.8.8
2.啟動es容器
寫個啟動esRun.sh的啟動腳本內(nèi)容如下:
docker run -itd --name elasticsearch -v /docker/esdata:/usr/share/elasticsearch/data -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:6.8.8
說明幾點(diǎn)
不要加 -rm 參數(shù) 這樣重啟后該容器會刪除,在里面裝的分詞插件就沒有了
加 -v /docker/esdata:/usr/share/elasticsearch/data 把容器里的數(shù)據(jù)映射到本地這樣可以寫到磁盤永久保存,另外esdata權(quán)限改成777
在瀏覽器中輸入: 虛擬機(jī)ip:9200 驗(yàn)證,有json串返回說明啟動成功
3.進(jìn)入到es容器中安裝ik分詞器插件
docker exec -it elasticsearch /bin/bash
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.8.8/elasticsearch-analysis-ik-6.8.8.zip
4.修改配置,解決跨域訪問問題
首先進(jìn)入到容器中,然后進(jìn)入到指定目錄修改elasticsearch.yml文件。
docker exec -it elasticsearch /bin/bash
cd /usr/share/elasticsearch/config/
vi elasticsearch.yml
在elasticsearch.yml的文件末尾加上:
http.cors.enabled: true
http.cors.allow-origin: "*"
修改配置后重啟容器即可。
docker restart elasticsearch
5.安裝 kibana
docker pull kibana:6.8.8
6.連接es并啟動
寫個kibanaRun.sh腳本內(nèi)容如下:
docker run -itd --rm --name kibana --link=elasticsearch:test -p 5601:5601 kibana:6.8.8 && docker start kibana
在瀏覽器中輸入: 虛擬機(jī)ip:5601 驗(yàn)證,出現(xiàn)kibana界面
問題1:
docker : 報(bào)錯 WARNING: IPv4 forwarding is disabled. Networking will not work.
解決方法:
vi /usr/lib/sysctl.d/00-system.conf
添加如下代碼:
net.ipv4.ip_forward=1
重啟network服務(wù)
systemctl restart network
三、elasticsearch
- 新建一個索引(類似mysql新建一個數(shù)據(jù)庫實(shí)例),在kibana Dev Tools 里面操作
PUT 索引名
查看現(xiàn)有的索引
http://192.168.121.223:9200/_cat/indices?v
- 創(chuàng)建表并插入一條數(shù)據(jù)
PUT my_indnx/moive/2
{
"moive_name": "red event",
"price":120,
"time":"2018-11-10",
"actors":[
{"name": "zhaosi", "age":33, "sex":1},
{"name": "achen", "age":43,"sex":1},
{"name": "wangwu","age":23,"sex":2}
]
}
- 簡單的查詢
查所有
GET my_indnx/moive/_search
匹配查詢
GET my_indnx/moive/_search
{
"query": {
"match": {
"moive_name": "red event"
}
}
}
- 刪除一條數(shù)據(jù)
DELETE my_indnx/moive/2
- 修改一條數(shù)據(jù),與插入一條數(shù)據(jù)一樣直接改里面的值即可,不用改的字段和數(shù)據(jù)也要帶上否則那些字段會被刪掉
PUT my_indnx/moive/2
{
"moive_name": "red event",
"price":333,
"time":"2018-11-10",
"actors":[
{"name": "zhaosi", "age":33, "sex":1},
{"name": "achen", "age":43,"sex":1},
{"name": "wangwu","age":23,"sex":2}
]
}
在Elaticsearch 6.x版本中已經(jīng)只允許一個索引下只有一個type,聲明多個type已經(jīng)標(biāo)記為過期
復(fù)合查詢
GET my_indnx_2/moive_2/_search
{
"query": {
"bool": {
"must": [
{"match": {
"moive_name": "行動"
}}
],
"filter":{
"term": {
"moive_gsid": "3"
}
}
}
}
}
在新建index下的type表結(jié)構(gòu)時,指定將來可能使用分詞器的字段
ik分詞器主要有兩個
ik_smart:簡單分詞器,將以最小的組合拆分中文
ik_max_word:最大化分詞器,將以最大化結(jié)果分詞
GET _analyze
{
"text": "我是中國人",
"analyzer": "ik_max_word"
}
四、springboot 與 elasticsearch 整合
一般來說有兩種方式:
- Jest(默認(rèn)不生效,需要下載依賴包)
添加依賴
<dependency>
<groupId>io.searchbox</groupId>
<artifactId>jest</artifactId>
<version>6.3.1</version>
</dependency>
- spring data (創(chuàng)建項(xiàng)目勾選了 NoSQL中的elasticsearch會自動添加依賴)
ElasticsearchRepository 和 ElasticsearchTemplate 兩種
添加依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
jest 這種方式的查詢需要拼json的查詢語句,不是很方便
ElasticsearchRepository 可以做Elasticsearch的相關(guān)增刪改查,用法和普通的CRUDRepository是一樣的,
這樣就能統(tǒng)一ElasticSearch和普通的JPA操作,獲得和操作mysql一樣的代碼體驗(yàn)。但是同時可以看到
ElasticsearchRepository的功能是比較少的,簡單查詢夠用。
ElasticsearchTemplate 則提供了更多的方法來完成更多的功能,也包括分頁之類的,他其實(shí)就是一個封裝
好的ElasticSearch Util功能類,通過直接連接client來完成數(shù)據(jù)的操作。
使用 ElasticsearchRepository 查詢的時候報(bào)
ElasticsearchException:failed to map source [xxx to class Book] with root cause 錯誤
原因:
這是因?yàn)樵趯?shí)體類Book中為了方便實(shí)例化添加了一個有參構(gòu)造函數(shù),導(dǎo)致JVM不能添加默認(rèn)的無參構(gòu)造函數(shù)了,但是jackson的反序列化需要使用無參構(gòu)造函數(shù),所以報(bào)錯!
解決:
在實(shí)體類Book中添加一個無參構(gòu)造函數(shù)就可以了!
或者不寫構(gòu)造函數(shù)直接添加兩個注解 @NoArgsConstructor @AllArgsConstructor