02.全文搜索ES

全文搜索

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編寫的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章