文章目錄
全文搜索
1.介紹
elasticsearch 6 (和elasticsearch 5 的區別在於,root用戶權限、一個庫只能建立一個表)
elasticsearch 6一個索引只能建立一張表
1.1 文本搜索引擎:
- 優點:搜索快;
- 缺點:佔用空間。【典型的空間換時間的一種算法】
同類產品:Solr、ElasticSearch、Hermes(騰訊)(實時檢索分析)
solr 、elasticSearch 底層依賴Lucene; elasticsearch 默認就是以集羣方式工作的。solr需要依賴zk1.
1.2 elasticSearch(搜索引擎)的算法
倒排索引(在內容上建立索引,用內容匹配索引);
btree mysql數據庫的索引方式。
b+tree 多路平衡書的晉級(elasticsearch)
內存結構:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html B+Tree
2.elasticsearch 單機安裝
2.1 Centos7 +jdk 安裝
- 查看當前Linux系統是否已經安裝java : 輸入 rpm -qa | grep java
- 卸載兩個openJDK: 輸入rpm -e --nodeps 要卸載的軟件
- 上傳jdk到linux
- 解壓jdk到/usr/local下 tar –xvf jdk-7u71-linux-i586.tar.gz –C /usr/local
- 配置jdk環境變量,打開/etc/profile配置文件,將下面配置拷貝進去
#set java environment
JAVA_HOME=/usr/local/jdk1.8.0_152
CLASSPATH=.:$JAVA_HOME/lib.tools.jar
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH
- 重新加載/etc/profile配置文件 source /etc/profile
2.2 安裝elasticsearch
2.2.1 創建目錄、上傳、解壓
- mkdir -p /opt/es //把安裝包上傳到 /opt/es目錄下
- tar – zxvf elasticsearch-6.3.1.tar.gz
- 啓動腳本 :
./elasticsearch
直接啓動會報相關的錯誤
2.2.2 修改相關配置
- 權限問題: 需要改成其他非root用戶才能啓動:(1)創建用戶:
adduser es
(2)切換用戶:su es
- JVM內存問題
需要修改/opt/es/elasticsearch-6.3.1/config/jvm.options jvm.options jvm配置文件
需要用root用戶授權: chmod 777 -R elasticsearch-6.3.1
切換 到es
用戶上。去修改:
建議配置2g~4g,學習測試環境配置256m 就可以了
- elasticSearch.yml中配置es的host地址(配成本機地址,允許訪問) elasticSearch.yml 集羣配置文件
使用非root賬戶啓動elasticsearch : ./elasticsearch
會報 默認線程數、最大文件數、最大內存數都不夠
- 修改linux的limits配置文件,設置內存線程和最大文件數 。切換
root
用戶 修改vi /etc/security/limits.conf
- 修改linux的sysctl配置文件,配置系統使用內存
vi sysctl.conf
切換es
用戶啓動elasticsearch
./elasticsearch 前臺啓動
nohup ./elasticsearch & 收集日誌,並且有點像後臺啓動
elasticSearch.yml es的啓動host地址
jvm.options配置es的虛擬機內存
limits.conf配置linux的線程內存和文件
sysctl.conf配置系統允許的軟件運行內存
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall開機啓動
# 開啓80端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
命令含義
--zone #作用域
--add-port=80/tcp #添加端口,格式爲:端口/通訊協議
--permanent #永久生效,沒有此參數重啓後失效
CentOS 7.0默認使用的是firewall作爲防火牆,使用iptables必須重新設置一下
直接關閉防火牆
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall開機啓動
設置 iptables service
yum -y install iptables-services
如果要修改防火牆配置,如增加防火牆端口3306
vi /etc/sysconfig/iptables
增加規則
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
保存退出後
systemctl restart iptables.service #重啓防火牆使配置生效
systemctl enable iptables.service #設置防火牆開機啓動
3.kibana安裝
3.1 上傳安裝包並解壓
tar -zxvf kibana-6.3.1-linux-x86_64.tar.gz
3.2 修改配置文件
修改kibana.yml
3.3 啓動
nohup &
這個命令可以記錄啓動日誌。nohup.out
,使用tail -f nohup.out
命令實時監控日誌記錄
ps -ef |grep node
查看kibana 的pid
使用kill -9 30300
殺死進程
3.ElasticSearch
3.1 交互方式
==交互方式:==基於http協議,以JSON爲數據交互格式的RESTfull API 爲交互形式
elasticsearch 通過
192.168.1.6:9200/_search
表示查詢全部,這裏沒有查詢某個庫
GET /_search #查詢所有索引文檔
GET /my_index/_search #查詢指定索引文檔
GET /my_index1,my_index2/_search #多索引查詢
192.168.1.6/_cat/indices?/v
這個是因爲我先裝了kibana
,如果裝好了es,直接運行不是這個了。直接是標題欄一行的。
標題 | 描述 |
---|---|
health | green(集羣完整) yellow(單點正常、集羣不完整) red(單點不正常) |
status | 是否能使用 |
index | 索引名 |
uuid | 索引統一編號 |
pri | 主節點幾個 |
rep | 從節點幾個 |
docs.count | 文檔數 |
docs.deleted | 文檔被刪了多少 |
store.size | 整體佔空間大小 |
pri.store.size | 主節點佔 |
3.2 基本概念
Index 庫
Type 表
Document 行(一條數據)
Field 字段
標題 | 描述 |
---|---|
cluster | 整個elasticsearch 默認就是集羣狀態,整個集羣是一份完整、互備的數據。 |
node | 集羣中的一個節點,一般只一個進程就是一個node |
shard | 分片,即使是一個節點中的數據也會通過hash算法,分成多個片存放,默認是5片。 |
index | 相當於rdbms的database, 對於用戶來說是一個邏輯數據庫,雖然物理上會被分多個shard存放,也可能存放在多個node中。 |
type | 類似於rdbms的table,但是與其說像table,其實更像面向對象中的class , 同一Json的格式的數據集合。 |
Document(json) | 類似於rdbms的 row、面向對象裏的object |
field | 相當於字段、屬性 |
3.3 簡單es 的CRUD
3.3.1 創建索引
PUT atguigu 表示創建索引
DELETE atguigu 表示刪除索引
GET 查詢
POST 修改
3.3.2 創建索引並添加數據
格式:PUT /index/type/id
PUT /movie_index/movie/1 創建movie_index索引庫,在該庫下面創建movie表
PUT /movie_index/movie/1
{ "id":1,
"name":"operation red sea",
"doubanScore":8.5,
"actorList":[
{"id":1,"name":"zhang yi"},
{"id":2,"name":"hai qing"},
{"id":3,"name":"zhang han yu"}
]
}
PUT /movie_index/movie/2
{
"id":2,
"name":"operation meigong river",
"doubanScore":8.0,
"actorList":[
{"id":3,"name":"zhang han yu"}
]
}
PUT /movie_index/movie/3
{
"id":3,
"name":"incident red sea",
"doubanScore":5.0,
"actorList":[
{"id":4,"name":"zhang chen"}
]
}
如果之前沒建過index或者type,es 會自動創建
3.3.3 查詢所有
/*查詢所有*/
GET /movie_index/_search
{
"took": 6,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 3,
"max_score": 1,
"hits": [
{
"_index": "movie_index",
"_type": "movie",
"_id": "2",
"_score": 1,
"_source": {
"id": 2,
"name": "operation meigong river",
"doubanScore": 8,
"actorList": [
{
"id": 3,
"name": "zhang han yu"
}
]
}
},
{
"_index": "movie_index",
"_type": "movie",
"_id": "1",
"_score": 1,
"_source": {
"id": 1,
"name": "operation red sea",
"doubanScore": 8.5,
"actorList": [
{
"id": 1,
"name": "zhang yi"
},
{
"id": 2,
"name": "hai qing"
},
{
"id": 3,
"name": "zhang han yu"
}
]
}
},
{
"_index": "movie_index",
"_type": "movie",
"_id": "3",
"_score": 1,
"_source": {
"id": 3,
"name": "incident red sea",
"doubanScore": 5,
"actorList": [
{
"id": 4,
"name": "zhang chen"
}
]
}
}
]
}
}
3.3.4 查詢條件
匹配帶“red”
GET /movie_index/movie/_search
{
"query": {
"match": {
"name": "red"
}
}
}
3.4 中文分詞器IK
3.4.1 進入plugins目錄
配置阿里的鏡像
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
記得備份:CentOS-Base.repo文件.
更新鏡像源
清除緩存:yum clean all
生成緩存:yum makecache
重啓elasticsearch
analyzer:
- ik_smart(簡易分詞)
- ik_max_word(盡最大可能分詞)
GET _analyze
{
"analyzer":"ik_smart",
"text":"我是中國人"
}
3.5 相關性算分數
查詢的關鍵字在進行分詞處理後,與es的文檔(分詞處理並建立了索引)之間的相關度的高低
4.ES集羣
4.1 節點、分片、索引
- ==節點:==一個節點就是一個es的服務器,es集羣中,主節點負責集羣的管理和任務的分發,一般不負責文檔的增刪改查
- ==片:==分片是es的實際物理存儲單元(一個lucene的實例)
- ==索引:==是es的邏輯單元,一個索引一般建立在多個不同機器的分片上
- ==複製片:==每個機器的分片一般在其他機器上會有兩到三個複製片(目的是提高數據的容錯率)
- ==容錯:==一旦集羣中的某些機器發生故障,那麼剩餘的機器會在主機點的管理下,重新分配資源(分片)
- ==分片的路由:==寫操作(新建、刪除)只在主分片上進行,然後將結果同步給複製分片,Sync 主分片同步給複製成功後,才返回結果給客戶端,Async 主分片在操作成功後,在同步複製分片的同時返回成功結果給客戶端,讀操作(查詢)可以在主分片或者複製分片上進行
4.2集羣
4.2.1 修改配置文件
elasticserach.yml vim /elasticsearch.yml
cluster.name: aubin-cluster #必須相同
# 集羣名稱(不能重複)
# 節點名稱,僅僅是描述名稱,用於在日誌中區分(自定義)
node.name: els1(必須不同)
#指定了該節點可能成爲 master 節點,還可以是數據節點
node.master: true
node.data: true
# 數據的默認存放路徑(自定義)
path.data: /opt/data
# 日誌的默認存放路徑
path.logs: /opt/logs
# 當前節點的IP地址
network.host: 192.168.1.7
# 對外提供服務的端口
http.port: 9200
#9300爲集羣服務的端口
transport.tcp.port: 9300
# 集羣個節點IP地址,也可以使用域名,需要各節點能夠解析 【其他機器的IP地址】
discovery.zen.ping.unicast.hosts: ["192.168.1.6"]
# 爲了避免腦裂,集羣節點數最少爲 半數+1
discovery.zen.minimum_master_nodes: 2
現在模擬兩臺機器:192.168.1.6 192.168.1.7 模擬es集羣
注意:清空data和logs數據 , 192.168.1.6:9200/_cat/nodes?v,chmod 777 data / chmod 777 logs
啓動es:nohup ./elasticsearch &
需要注意不能使用root
賬戶啓動。
集羣管理工具:cerebro-0.8.3.zip 解壓就可以用了。前提是必須安裝jdk。它是用java編寫的。