1. 程式人生 > 實用技巧 >Elasticsearch介紹及應用

Elasticsearch介紹及應用

1.Elasticsearch介紹和安裝

使用者訪問我們的首頁,一般都會直接搜尋來尋找自己想要購買的商品。

而商品的數量非常多,而且分類繁雜。如果能正確的顯示出使用者想要的商品,並進行合理的過濾,儘快促成交易,是搜尋系統要研究的核心。

面對這樣複雜的搜尋業務和資料量,使用傳統資料庫搜尋就顯得力不從心,一般我們都會使用全文檢索技術:Elasticsearch。

1.1.簡介

1.1.1.Elastic

Elastic官網:https://www.elastic.co/cn/

Elastic有一條完整的產品線及解決方案:Elasticsearch、Kibana、Logstash等,前面說的三個就是大家常說的ELK技術棧。

1.1.2.Elasticsearch

Elasticsearch官網:https://www.elastic.co/cn/products/elasticsearch

如上所述,Elasticsearch具備以下特點:

  • 分散式,無需人工搭建叢集(solr就需要人為配置,使用Zookeeper作為註冊中心)

  • Restful風格,一切API都遵循Rest原則,容易上手

  • 近實時搜尋,資料更新在Elasticsearch中幾乎是完全同步的。

1.1.3.版本

Elasticsearch版本7.7.0

需要虛擬機器JDK自身根目錄自帶一個JDK

1.2.安裝和配置

為了模擬真實場景,我們將在linux下安裝Elasticsearch。

1.2.1.新建一個使用者es

出於安全考慮,elasticsearch預設不允許以root賬號執行。

建立使用者:

useradd es

設定密碼:

passwd es123

切換使用者:

su - es

1.2.2.上傳安裝包,並解壓

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

解壓縮:

tar -zxvf elasticsearch-7.7.0.tar.gz

我們把目錄重新命名:

mv elasticsearch-7.7.0/ elasticsearch

進入,檢視目錄結構

1.2.3.修改配置

我們進入config目錄:cd config

需要修改的配置檔案有兩個:

  1. jvm.options

Elasticsearch基於Lucene的,而Lucene底層是java實現,因此我們需要配置jvm引數。

編輯jvm.options:

vim jvm.options

預設配置如下:

-Xms1g
-Xmx1g

記憶體佔用太多了,我們調小一些:

-Xms512m
-Xmx512m
  1. elasticsearch.yml

vim elasticsearch.yml
  • 修改資料和日誌目錄:

path.data: /home/leyou/elasticsearch/data # 資料目錄位置
path.logs: /home/leyou/elasticsearch/logs # 日誌目錄位置

我們把data和logs目錄修改指向了elasticsearch的安裝目錄。但是這兩個目錄並不存在,因此我們需要創建出來。

進入elasticsearch的根目錄,然後建立:

mkdir data
mkdir logs

  • 修改繫結的ip:

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

預設只允許本機訪問,修改為0.0.0.0後則可以遠端訪問

目前我們是做的單機安裝,如果要做叢集,只需要在這個配置檔案中新增其它節點資訊即可。

elasticsearch.yml的其它可配置資訊:

屬性名說明
cluster.name 配置elasticsearch的叢集名稱,預設是elasticsearch。建議修改成一個有意義的名稱。
node.name 節點名,es會預設隨機指定一個名字,建議指定一個有意義的名稱,方便管理
path.conf 設定配置檔案的儲存路徑,tar或zip包安裝預設在es根目錄下的config資料夾,rpm安裝預設在/etc/ elasticsearch
path.data 設定索引資料的儲存路徑,預設是es根目錄下的data資料夾,可以設定多個儲存路徑,用逗號隔開
path.logs 設定日誌檔案的儲存路徑,預設是es根目錄下的logs資料夾
path.plugins 設定外掛的存放路徑,預設是es根目錄下的plugins資料夾
bootstrap.memory_lock 設定為true可以鎖住ES使用的記憶體,避免記憶體進行swap
network.host 設定bind_host和publish_host,設定為0.0.0.0允許外網訪問
http.port 設定對外服務的http埠,預設為9200。
transport.tcp.port 叢集結點之間通訊埠
discovery.zen.ping.timeout 設定ES自動發現節點連線超時的時間,預設為3秒,如果網路延遲高可設定大些
discovery.zen.minimum_master_nodes 主結點數量的最少值 ,此值的公式為:(master_eligible_nodes / 2) + 1 ,比如:有3個符合要求的主結點,那麼這裡要設定為2

1.3.執行

進入elasticsearch/bin目錄,可以看到下面的執行檔案:

然後輸入命令:

./elasticsearch

發現報錯了,啟動失敗:

1.3.1.錯誤1:核心過低

我們使用的是centos6,其linux核心版本為2.6。而Elasticsearch的外掛要求至少3.5以上版本。不過沒關係,我們禁用這個外掛即可。

修改elasticsearch.yml檔案,在最下面新增如下配置:

bootstrap.system_call_filter: false

然後重啟

1.3.2.錯誤2:檔案許可權不足

再次啟動,又出錯了:

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

我們用的是leyou使用者,而不是root,所以檔案許可權不足。

首先用root使用者登入。

然後修改配置檔案:

vim /etc/security/limits.conf

新增下面的內容:

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

1.3.3.錯誤3:執行緒數不夠

剛才報錯中,還有一行:

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

這是執行緒數不夠。

繼續修改配置:

vim /etc/security/limits.d/90-nproc.conf 

修改下面的內容:

* soft nproc 1024

改為:

* soft nproc 4096

1.3.4.錯誤4:程序虛擬記憶體

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

vm.max_map_count:限制一個程序可以擁有的VMA(虛擬記憶體區域)的數量,繼續修改配置檔案, :

vim /etc/sysctl.conf 

新增下面內容:

vm.max_map_count=655360

然後執行命令:

sysctl -p

1.3.5.重啟終端視窗

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

1.3.6.啟動

再次啟動,終於成功了!

可以看到綁定了兩個埠:

  • 9300:叢集節點間通訊介面

  • 9200:客戶端訪問介面

我們在瀏覽器中訪問:http://192.168.56.101:9200

1.4.安裝kibana

1.4.1.什麼是Kibana?

Kibana是一個基於Node.js的Elasticsearch索引庫資料統計工具,可以利用Elasticsearch的聚合功能,生成各種圖表,如柱形圖,線狀圖,餅圖等。

而且還提供了操作Elasticsearch索引資料的控制檯,並且提供了一定的API提示,非常有利於我們學習Elasticsearch的語法。

1.4.2.安裝

因為Kibana依賴於node,我們的虛擬機器沒有安裝node,而window中安裝過。所以我們選擇在window下使用kibana。

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

解壓到特定目錄即可

1.4.3.配置執行

配置

進入安裝目錄下的config目錄,修改kibana.yml檔案:

修改elasticsearch伺服器的地址:

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

執行

進入安裝目錄下的bin目錄:

雙擊執行:

發現kibana的監聽埠是5601

我們訪問:http://127.0.0.1:5601

1.4.4.控制檯

選擇左側的DevTools選單,即可進入控制檯頁面:

在頁面右側,我們就可以輸入請求,訪問Elasticsearch了。

1.5.安裝ik分詞器

Lucene的IK分詞器早在2012年已經沒有維護了,現在我們要使用的是在其基礎上維護升級的版本,並且開發為ElasticSearch的整合外掛了,與Elasticsearch一起維護升級,版本也保持一致,最新版本:7.7.0

1.5.1.安裝

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

使用unzip命令解壓:

unzip elasticsearch-analysis-ik-7.7.0.zip -d ik-analyzer

然後重啟elasticsearch:

1.5.2.測試

大家先不管語法,我們先測試一波。

在kibana控制檯輸入下面的請求:

POST _analyze
{
  "analyzer": "ik_max_word",
  "text":   "我是中國人"
}

執行得到結果:

{
  "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": 5,
    "type": "CN_WORD",
    "position": 2
   },
   {
    "token": "中國",
    "start_offset": 2,
    "end_offset": 4,
    "type": "CN_WORD",
    "position": 3
   },
   {
    "token": "國人",
    "start_offset": 3,
    "end_offset": 5,
    "type": "CN_WORD",
    "position": 4
   }
  ]
}

windows系統下安裝軟體

版本號必須一致

此外若提示JDK版本過低

Warning: MaxDirectMemorySize may have been miscalculated due to JDK-8074459.
Please use a newer version of Java or set MaxDirectMemorySize explicitly.

修改配置

啟動報這個錯, 是因為windows系統中配置著jdk, 這裡預設使用的是環境變數中的JAVA_HOME, 由於elasticsearch版本太高, jdk版本太低, 所以導致了這個問題, 在elasticsearch7.x之後的版本, 已經集成了自帶的jdk, 在根目錄下的jdk資料夾中
這裡需要修改elasticsearch-env.bat啟動檔案的配置內容, 設定系統使用elasticsearch自帶的jdk版本
在elasticsearch-env.bat檔案中找到關於JAVA_HOME的配置, 註釋掉if…else判斷的東西, 替換為如下三行程式碼

set JAVA="%ES_HOME%\jdk\bin\java.exe"
set JAVA_HOME="%ES_HOME%\jdk"
set JAVA_TYPE=bundled jdk
IK分詞器下載地址

https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.7.0/elasticsearch-analysis-ik-7.7.0.zip

Elasticsearch中ik_max_word和ik_smart的區別

ik_max_word和 ik_smart介紹
學習過Solr或Elasticsearch的同學都知道IK分詞器,它是一個針對中文的分詞器。
IK分詞器地址:https://github.com/medcl/elasticsearch-analysis-ik
IK分詞器有兩種分詞模式:ik_max_word和ik_smart模式。

1、ik_max_word

會將文字做最細粒度的拆分,比如會將“中華人民共和國人民大會堂”拆分為“中華人民共和國、中華人民、中華、華人、人民共和國、人民、共和國、大會堂、大會、會堂等詞語。

2、ik_smart
會做最粗粒度的拆分,比如會將“中華人民共和國人民大會堂”拆分為中華人民共和國、人民大會堂。

測試兩種分詞模式的效果:

傳送:post localhost:9200/_analyze


測試ik_max_word
{“text”:“中華人民共和國人民大會堂”,“analyzer”:“ik_max_word” }
測試ik_smart
{“text”:“中華人民共和國人民大會堂”,“analyzer”:“ik_smart” }

最佳實踐
兩種分詞器使用的最佳實踐是:索引時用ik_max_word,在搜尋時用ik_smart。
即:索引時最大化的將文章內容分詞,搜尋時更精確的搜尋到想要的結果。

舉個例子:
我是個使用者,輸入“華為手機”,我此時的想法是想搜尋出“華為手機”的商品,而不是華為其它的商品,也就是商品資訊中必須只有華為手機這個詞。
此時使用ik_smart和ik_max_word都會將華為手機拆分為華為和手機兩個詞,那些只包括“華為”這個詞的資訊也被搜尋出來了,我的目標是搜尋只包含華為手機這個詞的資訊,這沒有滿足我的目標。

怎麼解決呢?
我們可以將華為手機新增到自定義詞庫,新增後兩個分詞器的效果為:

ik_max_word 的分詞效果:

{
“tokens”: [
{
“token”: “華為手機”,
“start_offset”: 0,
“end_offset”: 4,
“type”: “CN_WORD”,
“position”: 0
}
,
{
“token”: “華為”,
“start_offset”: 0,
“end_offset”: 2,
“type”: “CN_WORD”,
“position”: 1
}
,
{
“token”: “手機”,
“start_offset”: 2,
“end_offset”: 4,
“type”: “CN_WORD”,
“position”: 2
}
]
}

ik_smart的分詞效果:

{
“tokens”: [
{
“token”: “華為手機”,
“start_offset”: 0,
“end_offset”: 4,
“type”: “CN_WORD”,
“position”: 0
}
]
}

看到兩個分詞器的區別了吧,因為華為手機是一個詞,所以ik_smart不再細粒度分了。
此時,我們可以在索引時使用 ik_max_word,在搜尋時用ik_smart。

當輸入 華為手機 關鍵字,只搜尋到 包含華為手機的資訊,符合使用者要求。
如果我想將包含華為 這個詞的資訊也搜尋出來怎麼辦呢?
那就輸入 “華為 華為手機”(注意華為後邊有個空格),那就會將包含華為、華為手機的資訊都搜尋出來。

轉載於:https://www.it610.com/article/1296371350658686976.htm

1.Elasticsearch介紹和安裝

使用者訪問我們的首頁,一般都會直接搜尋來尋找自己想要購買的商品。

而商品的數量非常多,而且分類繁雜。如果能正確的顯示出使用者想要的商品,並進行合理的過濾,儘快促成交易,是搜尋系統要研究的核心。

面對這樣複雜的搜尋業務和資料量,使用傳統資料庫搜尋就顯得力不從心,一般我們都會使用全文檢索技術:Elasticsearch。

1.1.簡介

1.1.1.Elastic

Elastic官網:https://www.elastic.co/cn/

Elastic有一條完整的產品線及解決方案:Elasticsearch、Kibana、Logstash等,前面說的三個就是大家常說的ELK技術棧。

1.1.2.Elasticsearch

Elasticsearch官網:https://www.elastic.co/cn/products/elasticsearch

如上所述,Elasticsearch具備以下特點:

  • 分散式,無需人工搭建叢集(solr就需要人為配置,使用Zookeeper作為註冊中心)

  • Restful風格,一切API都遵循Rest原則,容易上手

  • 近實時搜尋,資料更新在Elasticsearch中幾乎是完全同步的。

1.1.3.版本

Elasticsearch版本7.7.0

需要虛擬機器JDK自身根目錄自帶一個JDK

1.2.安裝和配置

為了模擬真實場景,我們將在linux下安裝Elasticsearch。

1.2.1.新建一個使用者es

出於安全考慮,elasticsearch預設不允許以root賬號執行。

建立使用者:

useradd es

設定密碼:

passwd es123

切換使用者:

su - es

1.2.2.上傳安裝包,並解壓

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

解壓縮:

tar -zxvf elasticsearch-7.7.0.tar.gz

我們把目錄重新命名:

mv elasticsearch-7.7.0/ elasticsearch

進入,檢視目錄結構

1.2.3.修改配置

我們進入config目錄:cd config

需要修改的配置檔案有兩個:

  1. jvm.options

Elasticsearch基於Lucene的,而Lucene底層是java實現,因此我們需要配置jvm引數。

編輯jvm.options:

vim jvm.options

預設配置如下:

-Xms1g
-Xmx1g

記憶體佔用太多了,我們調小一些:

-Xms512m
-Xmx512m
  1. elasticsearch.yml

vim elasticsearch.yml
  • 修改資料和日誌目錄:

path.data: /home/leyou/elasticsearch/data # 資料目錄位置
path.logs: /home/leyou/elasticsearch/logs # 日誌目錄位置

我們把data和logs目錄修改指向了elasticsearch的安裝目錄。但是這兩個目錄並不存在,因此我們需要創建出來。

進入elasticsearch的根目錄,然後建立:

mkdir data
mkdir logs

  • 修改繫結的ip:

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

預設只允許本機訪問,修改為0.0.0.0後則可以遠端訪問

目前我們是做的單機安裝,如果要做叢集,只需要在這個配置檔案中新增其它節點資訊即可。

elasticsearch.yml的其它可配置資訊:

屬性名說明
cluster.name 配置elasticsearch的叢集名稱,預設是elasticsearch。建議修改成一個有意義的名稱。
node.name 節點名,es會預設隨機指定一個名字,建議指定一個有意義的名稱,方便管理
path.conf 設定配置檔案的儲存路徑,tar或zip包安裝預設在es根目錄下的config資料夾,rpm安裝預設在/etc/ elasticsearch
path.data 設定索引資料的儲存路徑,預設是es根目錄下的data資料夾,可以設定多個儲存路徑,用逗號隔開
path.logs 設定日誌檔案的儲存路徑,預設是es根目錄下的logs資料夾
path.plugins 設定外掛的存放路徑,預設是es根目錄下的plugins資料夾
bootstrap.memory_lock 設定為true可以鎖住ES使用的記憶體,避免記憶體進行swap
network.host 設定bind_host和publish_host,設定為0.0.0.0允許外網訪問
http.port 設定對外服務的http埠,預設為9200。
transport.tcp.port 叢集結點之間通訊埠
discovery.zen.ping.timeout 設定ES自動發現節點連線超時的時間,預設為3秒,如果網路延遲高可設定大些
discovery.zen.minimum_master_nodes 主結點數量的最少值 ,此值的公式為:(master_eligible_nodes / 2) + 1 ,比如:有3個符合要求的主結點,那麼這裡要設定為2

1.3.執行

進入elasticsearch/bin目錄,可以看到下面的執行檔案:

然後輸入命令:

./elasticsearch

發現報錯了,啟動失敗:

1.3.1.錯誤1:核心過低

我們使用的是centos6,其linux核心版本為2.6。而Elasticsearch的外掛要求至少3.5以上版本。不過沒關係,我們禁用這個外掛即可。

修改elasticsearch.yml檔案,在最下面新增如下配置:

bootstrap.system_call_filter: false

然後重啟

1.3.2.錯誤2:檔案許可權不足

再次啟動,又出錯了:

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

我們用的是leyou使用者,而不是root,所以檔案許可權不足。

首先用root使用者登入。

然後修改配置檔案:

vim /etc/security/limits.conf

新增下面的內容:

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

1.3.3.錯誤3:執行緒數不夠

剛才報錯中,還有一行:

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

這是執行緒數不夠。

繼續修改配置:

vim /etc/security/limits.d/90-nproc.conf 

修改下面的內容:

* soft nproc 1024

改為:

* soft nproc 4096

1.3.4.錯誤4:程序虛擬記憶體

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

vm.max_map_count:限制一個程序可以擁有的VMA(虛擬記憶體區域)的數量,繼續修改配置檔案, :

vim /etc/sysctl.conf 

新增下面內容:

vm.max_map_count=655360

然後執行命令:

sysctl -p

1.3.5.重啟終端視窗

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

1.3.6.啟動

再次啟動,終於成功了!

可以看到綁定了兩個埠:

  • 9300:叢集節點間通訊介面

  • 9200:客戶端訪問介面

我們在瀏覽器中訪問:http://192.168.56.101:9200

1.4.安裝kibana

1.4.1.什麼是Kibana?

Kibana是一個基於Node.js的Elasticsearch索引庫資料統計工具,可以利用Elasticsearch的聚合功能,生成各種圖表,如柱形圖,線狀圖,餅圖等。

而且還提供了操作Elasticsearch索引資料的控制檯,並且提供了一定的API提示,非常有利於我們學習Elasticsearch的語法。

1.4.2.安裝

因為Kibana依賴於node,我們的虛擬機器沒有安裝node,而window中安裝過。所以我們選擇在window下使用kibana。

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

解壓到特定目錄即可

1.4.3.配置執行

配置

進入安裝目錄下的config目錄,修改kibana.yml檔案:

修改elasticsearch伺服器的地址:

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

執行

進入安裝目錄下的bin目錄:

雙擊執行:

發現kibana的監聽埠是5601

我們訪問:http://127.0.0.1:5601

1.4.4.控制檯

選擇左側的DevTools選單,即可進入控制檯頁面:

在頁面右側,我們就可以輸入請求,訪問Elasticsearch了。

1.5.安裝ik分詞器

Lucene的IK分詞器早在2012年已經沒有維護了,現在我們要使用的是在其基礎上維護升級的版本,並且開發為ElasticSearch的整合外掛了,與Elasticsearch一起維護升級,版本也保持一致,最新版本:7.7.0

1.5.1.安裝

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

使用unzip命令解壓:

unzip elasticsearch-analysis-ik-7.7.0.zip -d ik-analyzer

然後重啟elasticsearch:

1.5.2.測試

大家先不管語法,我們先測試一波。

在kibana控制檯輸入下面的請求:

POST _analyze
{
  "analyzer": "ik_max_word",
  "text":   "我是中國人"
}

執行得到結果:

{
  "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": 5,
    "type": "CN_WORD",
    "position": 2
   },
   {
    "token": "中國",
    "start_offset": 2,
    "end_offset": 4,
    "type": "CN_WORD",
    "position": 3
   },
   {
    "token": "國人",
    "start_offset": 3,
    "end_offset": 5,
    "type": "CN_WORD",
    "position": 4
   }
  ]
}

windows系統下安裝軟體

版本號必須一致

此外若提示JDK版本過低

Warning: MaxDirectMemorySize may have been miscalculated due to JDK-8074459.
Please use a newer version of Java or set MaxDirectMemorySize explicitly.

修改配置

啟動報這個錯, 是因為windows系統中配置著jdk, 這裡預設使用的是環境變數中的JAVA_HOME, 由於elasticsearch版本太高, jdk版本太低, 所以導致了這個問題, 在elasticsearch7.x之後的版本, 已經集成了自帶的jdk, 在根目錄下的jdk資料夾中
這裡需要修改elasticsearch-env.bat啟動檔案的配置內容, 設定系統使用elasticsearch自帶的jdk版本
在elasticsearch-env.bat檔案中找到關於JAVA_HOME的配置, 註釋掉if…else判斷的東西, 替換為如下三行程式碼

set JAVA="%ES_HOME%\jdk\bin\java.exe"
set JAVA_HOME="%ES_HOME%\jdk"
set JAVA_TYPE=bundled jdk
IK分詞器下載地址

https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.7.0/elasticsearch-analysis-ik-7.7.0.zip

Elasticsearch中ik_max_word和ik_smart的區別

ik_max_word和 ik_smart介紹
學習過Solr或Elasticsearch的同學都知道IK分詞器,它是一個針對中文的分詞器。
IK分詞器地址:https://github.com/medcl/elasticsearch-analysis-ik
IK分詞器有兩種分詞模式:ik_max_word和ik_smart模式。

1、ik_max_word

會將文字做最細粒度的拆分,比如會將“中華人民共和國人民大會堂”拆分為“中華人民共和國、中華人民、中華、華人、人民共和國、人民、共和國、大會堂、大會、會堂等詞語。

2、ik_smart
會做最粗粒度的拆分,比如會將“中華人民共和國人民大會堂”拆分為中華人民共和國、人民大會堂。

測試兩種分詞模式的效果:

傳送:post localhost:9200/_analyze


測試ik_max_word
{“text”:“中華人民共和國人民大會堂”,“analyzer”:“ik_max_word” }
測試ik_smart
{“text”:“中華人民共和國人民大會堂”,“analyzer”:“ik_smart” }

最佳實踐
兩種分詞器使用的最佳實踐是:索引時用ik_max_word,在搜尋時用ik_smart。
即:索引時最大化的將文章內容分詞,搜尋時更精確的搜尋到想要的結果。

舉個例子:
我是個使用者,輸入“華為手機”,我此時的想法是想搜尋出“華為手機”的商品,而不是華為其它的商品,也就是商品資訊中必須只有華為手機這個詞。
此時使用ik_smart和ik_max_word都會將華為手機拆分為華為和手機兩個詞,那些只包括“華為”這個詞的資訊也被搜尋出來了,我的目標是搜尋只包含華為手機這個詞的資訊,這沒有滿足我的目標。

怎麼解決呢?
我們可以將華為手機新增到自定義詞庫,新增後兩個分詞器的效果為:

ik_max_word 的分詞效果:

{
“tokens”: [
{
“token”: “華為手機”,
“start_offset”: 0,
“end_offset”: 4,
“type”: “CN_WORD”,
“position”: 0
}
,
{
“token”: “華為”,
“start_offset”: 0,
“end_offset”: 2,
“type”: “CN_WORD”,
“position”: 1
}
,
{
“token”: “手機”,
“start_offset”: 2,
“end_offset”: 4,
“type”: “CN_WORD”,
“position”: 2
}
]
}

ik_smart的分詞效果:

{
“tokens”: [
{
“token”: “華為手機”,
“start_offset”: 0,
“end_offset”: 4,
“type”: “CN_WORD”,
“position”: 0
}
]
}

看到兩個分詞器的區別了吧,因為華為手機是一個詞,所以ik_smart不再細粒度分了。
此時,我們可以在索引時使用 ik_max_word,在搜尋時用ik_smart。

當輸入 華為手機 關鍵字,只搜尋到 包含華為手機的資訊,符合使用者要求。
如果我想將包含華為 這個詞的資訊也搜尋出來怎麼辦呢?
那就輸入 “華為 華為手機”(注意華為後邊有個空格),那就會將包含華為、華為手機的資訊都搜尋出來。