簡介
Lucene 是什么?
Lucene 可以被認為是迄今為止最先進、性能最好的、功能最全的搜索引擎庫,Lucene 只是一個庫,想要發揮出強大作用,需要使用Java將其集成到應用中,Lucene非常復雜,需要深入了解檢索相關知識理解它是如何作業的,
Elasticsearch 是什么?
Elasticsearch 是一個基于 Apache Lucene 的開源搜索引擎,
Elasticsearch 是使用Java撰寫并使用Lucene來建立索引并實作搜索功能,它的目的是通過簡單連貫的RestFul API 讓全文搜索變得簡單來隱藏Lucene的復雜性,
Elasticsearch 不僅僅是Lucene和全文搜索引擎,它還提供:
- 分布式的實時檔案存盤,每個欄位都被索引并可被搜索
- 實時分析的分布式搜索引擎
- 可以拓展到上百臺服務器(集群),處理PB級結構化或非結構化資料
Elasticsearch 中涉及到的重要概念
-
接近實時(NRT)
Elasticsearch 是一個接近實時的搜索平臺, -
集群(cluster)
Elasticsearch 支持集群部署,一個集群就是由一個或多個節點組織在一起,它們共同持有整個資料,并一起提供索引和搜索功能, 一個集群由一個唯一的名字標識,默認“elasticsearch” -
節點(node)
一個節點是集群中的一個服務器,作為集群的一部分, 一一個節點也是由一個名字來標識,默認是一個隨機的漫威漫畫角色的名字,一個節點可以通過配置集群名稱的方式來加入一個指定的集群,默認情況下,每個節點都會被安排加入“elasticsearch”集群中,
-
索引(index)
一個索引就是一個擁有幾分相似特征的檔案的集合,類似于關系型資料庫(Mysql)中Database的概念,一個索引由一個名字來標識(
必須全小寫字母),并且當我們要對這個索引中的檔案進行索引、搜索、更新和洗掉的時候,都要使用到這個名字 -
型別(type)
在一個索引中,可以定義一種或多種型別,一個型別是索引的一個邏輯上的分類/磁區,通常會為具有一組共同欄位的檔案定義一個型別,類似于關系型資料庫(Mysql)中的Table 的概念, -
檔案(document)
一個檔案是一個可被索引的基礎資訊單元,檔案以 JSON 格式來標識,
在一個index/type里,只要想,可以存盤任意多的檔案,檔案必須被索引/賦予一個索引的type,檔案類似于關系型資料庫中的一條記錄 -
分片和復制(shard & replicas)
一個索引可以存盤超出單個節點硬體限制的大量資料,比如,一個具有10億檔案的索引占據了1TB的磁盤空間,單個節點沒這么大的空間;或者單個節點處理搜索請求,相應太慢,為了解決這個問題,Elasticsearch 提供了將索引劃分成多份的能力,這些份叫做分片(shard), 當創建一個索引的時候,可以指定想要分片的數量,每個分片本身也是一個功能完善并且獨立的索引,這個索引可以被放置到集群中的任何節點上,
分片之所以重要,主要有兩方面原因:
- 允許水平分割,拓展內容容量
- 允許在分片之上進行分布式的、并行的操作,進而提高性能/吞吐量
至于一個分片怎樣分布,它的檔案怎樣聚合回搜索請求,完全由Elasticsearch管理,對于用戶來說是透明的,
副本指的是分片的副本,是shard的復制
復制之所以重要,主要有兩個原因:
- 再shard/node失敗的時候,它提供高可用性,正因為如此,復制的shard絕不會跟原始shard在同一個節點上
- 拓展搜索量/吞吐量,因為搜索可以在所有的復制上并行運行
總結:每個索引可以被分成多個分片, 一個索引也可以被復制0次或多次, 一旦復制了,每個索引就有了主分片和復制分片, 分片和復制的數量可以在創建索引的時候指定,
在索引創建之后,可以在任何時候動態地改變復制數量,但不能改變分片的數量,小結
- node 是一臺服務器,表示集群中的節點
- document 表示索引記錄
- 一個index中不建議定義多個type
- 一個index可以有多個shard,每個shard可以有0個或多個副本
- original shard(原始分片)的復制成為副本shard,簡稱 shard
- 主分片和副本絕不會在同一個節點上
- 分片的好處主要有兩個:1.突破單臺服務器的硬體限制;2.可以并行操作,從而提高性能和吞吐量(跟kafka類似)
- 副本的好處主要在有兩個:1.提供高可用; 2.并行提升性能和吞吐量
- 一個索引包含一個或多個分片,索引記錄(檔案)資料存盤在這些shard中,且一個檔案只會存在于一個分片中
- 每個shard都是一個獨立的功能完善的“index”,意思是它可以獨立處理索引/搜索請求
下載
下載
# 創建目錄
$ mkdir -p /work/programs/elasticsearch
$ cd /work/programs/elasticsearch# 下載
$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.7.2.tar.gz
編輯配置
$ vi config/elasticsearch.yml
修改配置如下:
network.host:0.0.0.0 :實作內網可訪問,
啟動
注意 :需要使用非Root賬號啟動,
# 解壓
$ tar -zxvf elasticsearch-6.7.2.tar.gz
$ cd elasticsearch-6.7.2
# 啟動,通過 -d 引數,表示后臺運行,
$ bin/elasticsearch -d
可以通過 logs/elasticsearch.log 查看啟動日志,
注意: 如果使用云服務器,要開放埠,才能公網IP訪問
測驗:
訪問: http://112.74.186.224:9200/
{
"name" : "rrpUhc6",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "7yQXN3VDRSikmUOh-fhXJA",
"version" : {
"number" : "6.7.2",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "56c6e48",
"build_date" : "2019-04-29T09:05:50.290371Z",
"build_snapshot" : false,
"lucene_version" : "7.7.0",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
安裝ik分詞器插件
以安裝ik分詞器為例
在 https://github.com/medcl/elasticsearch-analysis-ik/releases 中,提供了各個 elasticsearch-analysis-ik 插件版本,要注意,一定和 Elasticsearch 版本一致,
#cd到elasticsearch目錄下 下載
$ wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.7.2/elasticsearch-analysis-ik-6.7.2.zip
# 需要解壓到 plugins/ik/ 目錄下
$ unzip elasticsearch-analysis-ik-6.5.0.zip -d plugins/ik/
# 查找 ES 行程,并關閉它
$ ps -ef | grep elastic
$ kill 2382 # 假設我們找到的 ES 行程號為 2382 ,
# 啟動 ES 行程
$ bin/elasticsearch -d
# 測驗ik分詞器
# ik_max_word 模式
$ curl -X POST \
http://localhost:9200/_analyze \
-H 'content-type: application/json' \
-d '{
"analyzer": "ik_max_word",
"text": "百事可樂"
}'
# ik_smart 模式
$ curl -X POST \
http://localhost:9200/_analyze \
-H 'content-type: application/json' \
-d '{
"analyzer": "ik_smart",
"text": "百事可樂"
}'
安裝 elasticsearch-head
elasticsearch-head 需要node環境支持
安裝node環境,這邊假設已經安裝完成
[lyk@iZwz99hfh1ddgd1z6q5u3mZ elasticsearch-6.7.2]$ node -v
v10.24.0
[lyk@iZwz99hfh1ddgd1z6q5u3mZ elasticsearch-6.7.2]$ npm -v
6.14.11
從github下載elasticsearch-head 并解壓
我這邊解壓到了 head-master檔案夾;
wget https://github.com/mobz/elasticsearch-head/archive/master.zip
unzip master.zip
npm 安裝阿里鏡像 提速
[root@iZwz99hfh1ddgd1z6q5u3mZ head-master]# npm install cnpm -g --registry=https://registry.npm.taobao.org
安裝head 所需的包
[root@iZwz99hfh1ddgd1z6q5u3mZ head-master]# cnpm install
修改 Gruntfile.js檔案
[root@iZwz99hfh1ddgd1z6q5u3mZ head-master]# vi Gruntfile.js

啟動head插件
[root@iZwz99hfh1ddgd1z6q5u3mZ head-master]# npm run start
> [email protected] start /work/programs/elasticsearch/head-master
> grunt server
Running "connect:server" (connect) task
Waiting forever...
Started connect web server on http://localhost:9100
訪問 http://XXXX:9100/

修改 elasticsearch-head 默認連接地址
[root@iZwz99hfh1ddgd1z6q5u3mZ head-master]# cd _site/
[root@iZwz99hfh1ddgd1z6q5u3mZ _site]# vi app.js

連接會有跨域問題,需要解決跨域
在 elasicsearch.yml檔案末尾加跨域配置
#允許跨域
http.cors.enabled: true
http.cors.allow-origin: "*"
啟動 head 服務
[lyk@iZwz99hfh1ddgd1z6q5u3mZ head-master]$ cd node_modules/grunt/bin/
[lyk@iZwz99hfh1ddgd1z6q5u3mZ bin]$ ./grunt server &
[1] 1331
[lyk@iZwz99hfh1ddgd1z6q5u3mZ bin]$ Running "connect:server" (connect) task
Waiting forever...
Started connect web server on http://localhost:9100

集群健康值描述
- 綠色:最健康的狀態,代表所有的分片包括備份都可用
- 黃色:基本的分片可用,但是備份不可用(也可能是沒有備份)
- 紅色:部分的分片可用
- 灰色: 未連接到elasticsearch服務
本文由博客一文多發平臺 OpenWrite 發布!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/304147.html
標籤:Java
