樂優(yōu)商城學(xué)習(xí)筆記九-Elasticsearch學(xué)習(xí)(一)


title:樂優(yōu)商城學(xué)習(xí)筆記十-Elasticsearch學(xué)習(xí)(一)
date: 2019-04-18 09:9:18
tags:
- 樂優(yōu)商城
- java
- springboot
- Elasticsearch
categories:
- 樂優(yōu)商城


0.學(xué)習(xí)目標(biāo)

  • 獨(dú)立安裝Elasticsearch
  • 會(huì)使用Rest的API操作索引
  • 會(huì)使用Rest的API查詢數(shù)據(jù)
  • 會(huì)使用Rest的API聚合數(shù)據(jù)
  • 掌握Spring Data Elasticsearch使用

1.Elasticsearch介紹和安裝

用戶訪問我們的首頁(yè),一般都會(huì)直接搜索來尋找自己想要購(gòu)買的商品。

而商品的數(shù)量非常多,而且分類繁雜。如果能正確的顯示出用戶想要的商品,并進(jìn)行合理的過濾,盡快促成交易,是搜索系統(tǒng)要研究的核心。

面對(duì)這樣復(fù)雜的搜索業(yè)務(wù)和數(shù)據(jù)量,使用傳統(tǒng)數(shù)據(jù)庫(kù)搜索就顯得力不從心,一般我們都會(huì)使用全文檢索技術(shù),比如之前大家學(xué)習(xí)過的Solr。

不過今天,我們要講的是另一個(gè)全文檢索技術(shù):Elasticsearch。

1.1.簡(jiǎn)介

1.1.1.Elastic

Elastic官網(wǎng):https://www.elastic.co/cn/

1526464088259

Elastic有一條完整的產(chǎn)品線:Elasticsearch、Kibana、Logstash等,前面說的三個(gè)就是大家常說的ELK技術(shù)棧。

1526464220142

1.1.2.Elasticsearch

Elasticsearch官網(wǎng):https://www.elastic.co/cn/products/elasticsearch

1526464283575

如上所述,Elasticsearch具備以下特點(diǎn):

  • 分布式,無(wú)需人工搭建集群(solr就需要人為配置,使用Zookeeper作為注冊(cè)中心)
  • Restful風(fēng)格,一切API都遵循Rest原則,容易上手
  • 近實(shí)時(shí)搜索,數(shù)據(jù)更新在Elasticsearch中幾乎是完全同步的。

1.1.3.版本

目前Elasticsearch最新的版本是6.2.4,我們就使用這個(gè)版本

需要虛擬機(jī)JDK1.8及以上

1.2.安裝和配置

為了模擬真實(shí)場(chǎng)景,我們將在linux Ubuntu 下安裝Elasticsearch。

1.2.1.新建一個(gè)用戶leyou

useradd leyou

設(shè)置密碼:

passwd leyou

出于安全考慮,elasticsearch默認(rèn)不允許以root賬號(hào)運(yùn)行。

切換用戶:

su - leyou

1.2.2.上傳安裝包,并解壓

我們將安裝包上傳到:/home/ubuntu/leyou目錄

1526465700159

解壓縮:

tar xvf elasticsearch-6.2.4.tar.gz
1526465823442

我們把目錄重命名:

mv elasticsearch-6.2.4/ elasticsearch
1526465823442

進(jìn)入,查看目錄結(jié)構(gòu):

1526465823442

1.2.3.修改配置

我們進(jìn)入config目錄:cd config

需要修改的配置文件有兩個(gè):

1526465823442

修改jvm配置

Elasticsearch基于Lucene的,而Lucene底層是java實(shí)現(xiàn),因此我們需要配置jvm參數(shù)

vim jvm.options

默認(rèn)配置如下:

-Xms1g
-Xmx1g

內(nèi)存占用太多了,我們調(diào)小一些:

-Xms512m
-Xmx512m

修改elasticsearch.yml

sudo vim elasticsearch.yml

修改數(shù)據(jù)和日志目錄:

path.data: /home/ubuntu/leyou/elasticsearch/data # 數(shù)據(jù)目錄位置
path.logs: /home/ubuntu/leyou/elasticsearch/logs # 日志目錄位置

修改綁定的ip:
修改綁定的ip:

network.host: 0.0.0.0 # 綁定到0.0.0.0,允許任何ip來訪問

默認(rèn)只允許本機(jī)訪問,修改為0.0.0.0后則可以遠(yuǎn)程訪問

目前我們是做的單機(jī)安裝,如果要做集群,只需要在這個(gè)配置文件中添加其它節(jié)點(diǎn)信息即可。

elasticsearch.yml的其它可配置信息:

屬性名 說明
cluster.name 配置elasticsearch的集群名稱,默認(rèn)是elasticsearch。建議修改成一個(gè)有意義的名稱。
node.name 節(jié)點(diǎn)名,es會(huì)默認(rèn)隨機(jī)指定一個(gè)名字,建議指定一個(gè)有意義的名稱,方便管理
path.conf 設(shè)置配置文件的存儲(chǔ)路徑,tar或zip包安裝默認(rèn)在es根目錄下的config文件夾,rpm安裝默認(rèn)在/etc/ elasticsearch
path.data 設(shè)置索引數(shù)據(jù)的存儲(chǔ)路徑,默認(rèn)是es根目錄下的data文件夾,可以設(shè)置多個(gè)存儲(chǔ)路徑,用逗號(hào)隔開
path.logs 設(shè)置日志文件的存儲(chǔ)路徑,默認(rèn)是es根目錄下的logs文件夾
path.plugins 設(shè)置插件的存放路徑,默認(rèn)是es根目錄下的plugins文件夾
bootstrap.memory_lock 設(shè)置為true可以鎖住ES使用的內(nèi)存,避免內(nèi)存進(jìn)行swap
network.host 設(shè)置bind_host和publish_host,設(shè)置為0.0.0.0允許外網(wǎng)訪問
http.port 設(shè)置對(duì)外服務(wù)的http端口,默認(rèn)為9200。
transport.tcp.port 集群結(jié)點(diǎn)之間通信端口
discovery.zen.ping.timeout 設(shè)置ES自動(dòng)發(fā)現(xiàn)節(jié)點(diǎn)連接超時(shí)的時(shí)間,默認(rèn)為3秒,如果網(wǎng)絡(luò)延遲高可設(shè)置大些
discovery.zen.minimum_master_nodes 主結(jié)點(diǎn)數(shù)量的最少值 ,此值的公式為:(master_eligible_nodes / 2) + 1 ,比如:有3個(gè)符合要求的主結(jié)點(diǎn),那么這里要設(shè)置為2

1.2.4.創(chuàng)建data和logs目錄

剛才我們修改配置,把data和logs目錄修改指向了elasticsearch的安裝目錄。但是這兩個(gè)目錄并不存在,因此我們需要?jiǎng)?chuàng)建出來:

進(jìn)入Elasticsearch的根目錄,然后創(chuàng)建:

mkdir data
mkdir logs
1526467246550

1.3.運(yùn)行

進(jìn)入elasticsearch/bin目錄,可以看到下面的執(zhí)行文件:

1526467324965

然后輸入命令:

./elasticsearch

發(fā)現(xiàn)報(bào)錯(cuò)了,啟動(dòng)失?。?/p>

1.3.1.錯(cuò)誤1:內(nèi)核過低

1526467439804

修改elasticsearch.yml文件,在最下面添加以后配置:

bootstrap.system_call_filter: false

然后重啟

1.3.2.錯(cuò)誤2:

再次啟動(dòng),又出錯(cuò)了:

[1]: max file descriptors [4096] for elasticsearch process likely too low, increase to at least [65536]

我們用的是leyou用戶,而不是root,所以文件權(quán)限不足。

首先用root用戶登錄。

然后修改配置文件:

vim /etc/security/limits.conf

添加下面的內(nèi)容:

* soft nofile 65536

* hard nofile 131072

* soft nproc 4096

* hard nproc 4096

1.3.3.錯(cuò)誤3

剛才報(bào)錯(cuò)中,還有一行:

[1]: max number of threads [1024] for user [leyou] is too low, increase to at least [4096]

這是線程數(shù)不夠。

ubuntu繼續(xù)修改配置:

sudo vim /etc/security/limits.conf 

添加下面的內(nèi)容:

* soft nofile 65536
* hard nofile 131072
* soft nproc 4096
* hard nproc 4096

查看/etc/security/limits.d目錄是否有文件“90-nproc.conf”,沒有的話新建該文件,文件

內(nèi)容寫為:


*               soft    nproc          4096
*               hard    nproc          4096

1.3.4.錯(cuò)誤4

[3]: max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]

繼續(xù)修改配置文件:

sudo vim /etc/sysctl.conf 

添加下面內(nèi)容:

vm.max_map_count=655360

然后執(zhí)行命令:

sudo sysctl -p

1.3.5.重啟終端窗口

所有錯(cuò)誤修改完畢,一定要重啟你的 Xshell終端,否則配置無(wú)效。

1.3.6.啟動(dòng)

再次啟動(dòng),終于成功了!

1526472722397

可以看到綁定了兩個(gè)端口:

  • 9300:集群節(jié)點(diǎn)間通訊接口
  • 9200:客戶端訪問接口
1526478245641

1.4.2.安裝

因?yàn)镵ibana依賴于node,我們的虛擬機(jī)沒有安裝node,而window中安裝過。所以我們選擇在window下使用kibana。

最新版本與elasticsearch保持一致,也是6.2.4

1526481608877

解壓即可:

1526482581793

1.4.3.配置運(yùn)行

配置

進(jìn)入安裝目錄下的config目錄,修改kibana.yml文件:

修改elasticsearch服務(wù)器的地址:

elasticsearch.url: "http://192.168.56.101:9200"

運(yùn)行

進(jìn)入安裝目錄下的bin目錄:

1526482642658

雙擊運(yùn)行:

1526482862080

發(fā)現(xiàn)kibana的監(jiān)聽端口是5601

我們?cè)L問:http://127.0.0.1:5601

1526482926798

1.4.4.控制臺(tái)

選擇左側(cè)的DevTools菜單,即可進(jìn)入控制臺(tái)頁(yè)面:

[圖片上傳失敗...(image-119e05-1555557371161)]

在頁(yè)面右側(cè),我們就可以輸入請(qǐng)求,訪問Elasticsearch了。

1526483200872

1.5.安裝ik分詞器

Lucene的IK分詞器早在2012年已經(jīng)沒有維護(hù)了,現(xiàn)在我們要使用的是在其基礎(chǔ)上維護(hù)升級(jí)的版本,并且開發(fā)為Elasticsearch的集成插件了,與Elasticsearch一起維護(hù)升級(jí),版本也保持一致,最新版本:6.2.4

1.5.1.安裝

上傳課前資料中的zip包,解壓到Elasticsearch目錄的plugins目錄中:

1526482432181

使用unzip命令解壓:

unzip elasticsearch-analysis-ik-6.2.4.zip

得到一個(gè)名為elasticsearch的目錄:

1526482469109

我們將其改名為ik-analyzer

 mv elasticsearch ik-analyzer

然后重啟elasticsearch:

1526523386610

1.5.2.測(cè)試

大家先不管語(yǔ)法,我們先測(cè)試一波。

在kibana控制臺(tái)輸入下面的請(qǐng)求:

POST _analyze
{
  "analyzer": "ik_smart",
  "text":     "我是小武"
}

運(yùn)行得到結(jié)果:

{
  "tokens": [
    {
      "token": "我",
      "start_offset": 0,
      "end_offset": 1,
      "type": "CN_CHAR",
      "position": 0
    },
    {
      "token": "是",
      "start_offset": 1,
      "end_offset": 2,
      "type": "CN_CHAR",
      "position": 1
    },
    {
      "token": "小",
      "start_offset": 2,
      "end_offset": 3,
      "type": "CN_CHAR",
      "position": 2
    },
    {
      "token": "武",
      "start_offset": 3,
      "end_offset": 4,
      "type": "CN_CHAR",
      "position": 3
    }
  ]
}

1.7.API

Elasticsearch提供了Rest風(fēng)格的API,即http請(qǐng)求接口,而且也提供了各種語(yǔ)言的客戶端API

1.7.1.Rest風(fēng)格API

文檔地址:https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started.html

1526518410240

1.7.2.客戶端API

Elasticsearch支持的客戶端非常多:https://www.elastic.co/guide/en/elasticsearch/client/index.html

1526518624942

點(diǎn)擊Java Rest Client后,你會(huì)發(fā)現(xiàn)又有兩個(gè):

1526518662013

Low Level Rest Client是低級(jí)別封裝,提供一些基礎(chǔ)功能,但更靈活

High Level Rest Client,是在Low Level Rest Client基礎(chǔ)上進(jìn)行的高級(jí)別封裝,功能更豐富和完善,而且API會(huì)變的簡(jiǎn)單

1526518875072
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容