做國內(nèi)貿(mào)易的網(wǎng)站網(wǎng)站推廣技術(shù)
??作者:小宋1021
🤵?♂?個人主頁:小宋1021主頁
??堅持分析平時學(xué)習(xí)到的項目以及學(xué)習(xí)到的軟件開發(fā)知識,和大家一起努力呀!!!
🎈🎈加油! 加油! 加油! 加油
🎈歡迎評論 💬點贊👍🏻 收藏 📂加關(guān)注+!
目錄
初識elasticsearch
認(rèn)識和安裝
安裝elasticsearch
安裝Kibana
倒排索引
正向索引
倒排索引
正向和倒排
基礎(chǔ)概念
文檔和字段
索引和映射
mysql與elasticsearch
IK分詞器
安裝IK分詞器
使用IK分詞器
拓展詞典
總結(jié)
在我們的項目之中搜索肯定是訪問頻率最高的頁面之一。目前搜索功能是基于數(shù)據(jù)庫的模糊搜索來實現(xiàn)的,存在很多問題。
首先,查詢效率較低。
由于數(shù)據(jù)庫模糊查詢不走索引,在數(shù)據(jù)量較大的時候,查詢性能很差。表中僅僅有不到9萬條數(shù)據(jù),基于數(shù)據(jù)庫查詢時,搜索接口的表現(xiàn)如圖:
改為基于搜索引擎后,查詢表現(xiàn)如下:
需要注意的是,數(shù)據(jù)庫模糊查詢隨著表數(shù)據(jù)量的增多,查詢性能的下降會非常明顯,而搜索引擎的性能則不會隨著數(shù)據(jù)增多而下降太多。目前僅10萬不到的數(shù)據(jù)量差距就如此明顯,如果數(shù)據(jù)量達(dá)到百萬、千萬、甚至上億級別,這個性能差距會非常夸張。
其次,功能單一
數(shù)據(jù)庫的模糊搜索功能單一,匹配條件非常苛刻,必須恰好包含用戶搜索的關(guān)鍵字。而在搜索引擎中,用戶輸入出現(xiàn)個別錯字,或者用拼音搜索、同義詞搜索都能正確匹配到數(shù)據(jù)。
綜上,在面臨海量數(shù)據(jù)的搜索,或者有一些復(fù)雜搜索需求的時候,推薦使用專門的搜索引擎來實現(xiàn)搜索功能。
目前全球的搜索引擎技術(shù)排名如下:
排名第一的就是我們今天要學(xué)習(xí)的elasticsearch.
elasticsearch是一款非常強(qiáng)大的開源搜索引擎,支持的功能非常多,例如:
通過今天的學(xué)習(xí)大家要達(dá)成下列學(xué)習(xí)目標(biāo):
-
理解倒排索引原理
-
會使用IK分詞器
-
理解索引庫Mapping映射的屬性含義
-
能創(chuàng)建索引庫及映射
-
能實現(xiàn)文檔的CRUD
初識elasticsearch
Elasticsearch的官方網(wǎng)站如下:
Elasticsearch:官方分布式搜索和分析引擎 | Elastic
本章我們一起來初步了解一下Elasticsearch的基本原理和一些基礎(chǔ)概念。
認(rèn)識和安裝
Elasticsearch是由elastic公司開發(fā)的一套搜索引擎技術(shù),它是elastic技術(shù)棧中的一部分。完整的技術(shù)棧包括:
-
Elasticsearch:用于數(shù)據(jù)存儲、計算和搜索
-
Logstash/Beats:用于數(shù)據(jù)收集
-
Kibana:用于數(shù)據(jù)可視化
整套技術(shù)棧被稱為ELK,經(jīng)常用來做日志收集、系統(tǒng)監(jiān)控和狀態(tài)分析等等:
整套技術(shù)棧的核心就是用來存儲、搜索、計算的Elasticsearch,因此我們接下來學(xué)習(xí)的核心也是Elasticsearch。
我們要安裝的內(nèi)容包含2部分:
-
elasticsearch:存儲、搜索和運算
-
kibana:圖形化展示
首先Elasticsearch不用多說,是提供核心的數(shù)據(jù)存儲、搜索、分析功能的。
然后是Kibana,Elasticsearch對外提供的是Restful風(fēng)格的API,任何操作都可以通過發(fā)送http請求來完成。不過http請求的方式、路徑、還有請求參數(shù)的格式都有嚴(yán)格的規(guī)范。這些規(guī)范我們肯定記不住,因此我們要借助于Kibana這個服務(wù)。
Kibana是elastic公司提供的用于操作Elasticsearch的可視化控制臺。它的功能非常強(qiáng)大,包括:
-
對Elasticsearch數(shù)據(jù)的搜索、展示
-
對Elasticsearch數(shù)據(jù)的統(tǒng)計、聚合,并形成圖形化報表、圖形
-
對Elasticsearch的集群狀態(tài)監(jiān)控
-
它還提供了一個開發(fā)控制臺(DevTools),在其中對Elasticsearch的Restful的API接口提供了語法提示
安裝elasticsearch
通過下面的Docker命令即可安裝單機(jī)版本的elasticsearch:
docker run -d \
? --name es \
? -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
? -e "discovery.type=single-node" \
? -v es-data:/usr/share/elasticsearch/data \
? -v es-plugins:/usr/share/elasticsearch/plugins \
? --privileged \
? --network hm-net \
? -p 9200:9200 \
? -p 9300:9300 \
? elasticsearch:7.12.1
注意,這里我們采用的是elasticsearch的7.12.1版本,由于8以上版本的JavaAPI變化很大,在企業(yè)中應(yīng)用并不廣泛,企業(yè)中應(yīng)用較多的還是8以下的版本。
如果拉取鏡像困難,可以直接導(dǎo)入提供的鏡像tar包:
安裝完成后,訪問9200端口,即可看到響應(yīng)的Elasticsearch服務(wù)的基本信息:
安裝Kibana
通過下面的Docker命令,即可部署Kibana:
docker run -d \
--name kibana \
-e ELASTICSEARCH_HOSTS=http://es:9200 \
--network=hm-net \
-p 5601:5601 ?\
kibana:7.12.1
如果拉取鏡像困難,可以直接導(dǎo)入資料提供的鏡像tar包:
安裝完成后,直接訪問5601端口,即可看到控制臺頁面:
選擇Explore on my own
之后,進(jìn)入主頁面:
然后選中Dev tools
,進(jìn)入開發(fā)工具頁面:
倒排索引
elasticsearch之所以有如此高性能的搜索表現(xiàn),正是得益于底層的倒排索引技術(shù)。那么什么是倒排索引呢?
倒排索引的概念是基于MySQL這樣的正向索引而言的。
正向索引
我們先來回顧一下正向索引。
例如有一張名為tb_goods
的表:
id | title | price |
---|---|---|
1 | 小米手機(jī) | 3499 |
2 | 華為手機(jī) | 4999 |
3 | 華為小米充電器 | 49 |
4 | 小米手環(huán) | 49 |
... | ... | ... |
其中的id
字段已經(jīng)創(chuàng)建了索引,由于索引底層采用了B+樹結(jié)構(gòu),因此我們根據(jù)id搜索的速度會非常快。但是其他字段例如title
,只在葉子節(jié)點上存在。
因此要根據(jù)title
搜索的時候只能遍歷樹中的每一個葉子節(jié)點,判斷title數(shù)據(jù)是否符合要求。
比如用戶的SQL語句為:
select * from tb_goods where title like '%手機(jī)%';
那搜索的大概流程如圖:
說明:
-
1)檢查到搜索條件為
like '%手機(jī)%'
,需要找到title
中包含手機(jī)
的數(shù)據(jù) -
2)逐條遍歷每行數(shù)據(jù)(每個葉子節(jié)點),比如第1次拿到
id
為1的數(shù)據(jù) -
3)判斷數(shù)據(jù)中的
title
字段值是否符合條件 -
4)如果符合則放入結(jié)果集,不符合則丟棄
-
5)回到步驟1
綜上,根據(jù)id精確匹配時,可以走索引,查詢效率較高。而當(dāng)搜索條件為模糊匹配時,由于索引無法生效,導(dǎo)致從索引查詢退化為全表掃描,效率很差。
因此,正向索引適合于根據(jù)索引字段的精確搜索,不適合基于部分詞條的模糊匹配。
而倒排索引恰好解決的就是根據(jù)部分詞條模糊匹配的問題。
倒排索引
倒排索引中有兩個非常重要的概念:
-
文檔(
Document
):用來搜索的數(shù)據(jù),其中的每一條數(shù)據(jù)就是一個文檔。例如一個網(wǎng)頁、一個商品信息 -
詞條(
Term
):對文檔數(shù)據(jù)或用戶搜索數(shù)據(jù),利用某種算法分詞,得到的具備含義的詞語就是詞條。例如:我是中國人,就可以分為:我、是、中國人、中國、國人這樣的幾個詞條
創(chuàng)建倒排索引是對正向索引的一種特殊處理和應(yīng)用,流程如下:
-
將每一個文檔的數(shù)據(jù)利用分詞算法根據(jù)語義拆分,得到一個個詞條
-
創(chuàng)建表,每行數(shù)據(jù)包括詞條、詞條所在文檔id、位置等信息
-
因為詞條唯一性,可以給詞條創(chuàng)建正向索引
此時形成的這張以詞條為索引的表,就是倒排索引表,兩者對比如下:
正向索引
id(索引) | title | price |
---|---|---|
1 | 小米手機(jī) | 3499 |
2 | 華為手機(jī) | 4999 |
3 | 華為小米充電器 | 49 |
4 | 小米手環(huán) | 49 |
... | ... | ... |
倒排索引
詞條(索引) | 文檔id |
---|---|
小米 | 1,3,4 |
手機(jī) | 1,2 |
華為 | 2,3 |
充電器 | 3 |
手環(huán) | 4 |
倒排索引的搜索流程如下(以搜索"華為手機(jī)"為例),如圖:
流程描述:
1)用戶輸入條件"華為手機(jī)"
進(jìn)行搜索。
2)對用戶輸入條件分詞,得到詞條:華為
、手機(jī)
。
3)拿著詞條在倒排索引中查找(由于詞條有索引,查詢效率很高),即可得到包含詞條的文檔id:1、2、3
。
4)拿著文檔id
到正向索引中查找具體文檔即可(由于id
也有索引,查詢效率也很高)。
雖然要先查詢倒排索引,再查詢倒排索引,但是無論是詞條、還是文檔id都建立了索引,查詢速度非???#xff01;無需全表掃描。
正向和倒排
那么為什么一個叫做正向索引,一個叫做倒排索引呢?
-
正向索引是最傳統(tǒng)的,根據(jù)id索引的方式。但根據(jù)詞條查詢時,必須先逐條獲取每個文檔,然后判斷文檔中是否包含所需要的詞條,是根據(jù)文檔找詞條的過程。
-
而倒排索引則相反,是先找到用戶要搜索的詞條,根據(jù)詞條得到保護(hù)詞條的文檔的id,然后根據(jù)id獲取文檔。是根據(jù)詞條找文檔的過程。
是不是恰好反過來了?
那么兩者方式的優(yōu)缺點是什么呢?
正向索引:
-
優(yōu)點:
-
可以給多個字段創(chuàng)建索引
-
根據(jù)索引字段搜索、排序速度非???/p>
-
-
缺點:
-
根據(jù)非索引字段,或者索引字段中的部分詞條查找時,只能全表掃描。
-
倒排索引:
-
優(yōu)點:
-
根據(jù)詞條搜索、模糊搜索時,速度非???/p>
-
-
缺點:
-
只能給詞條創(chuàng)建索引,而不是字段
-
無法根據(jù)字段做排序
-
基礎(chǔ)概念
elasticsearch中有很多獨有的概念,與mysql中略有差別,但也有相似之處。
文檔和字段
elasticsearch是面向文檔(Document)存儲的,可以是數(shù)據(jù)庫中的一條商品數(shù)據(jù),一個訂單信息。文檔數(shù)據(jù)會被序列化為json
格式后存儲在elasticsearch
中:
{
? ? "id": 1,
? ? "title": "小米手機(jī)",
? ? "price": 3499
}
{
? ? "id": 2,
? ? "title": "華為手機(jī)",
? ? "price": 4999
}
{
? ? "id": 3,
? ? "title": "華為小米充電器",
? ? "price": 49
}
{
? ? "id": 4,
? ? "title": "小米手環(huán)",
? ? "price": 299
}
?
因此,原本數(shù)據(jù)庫中的一行數(shù)據(jù)就是ES中的一個JSON文檔;而數(shù)據(jù)庫中每行數(shù)據(jù)都包含很多列,這些列就轉(zhuǎn)換為JSON文檔中的字段(Field)。
索引和映射
隨著業(yè)務(wù)發(fā)展,需要在es中存儲的文檔也會越來越多,比如有商品的文檔、用戶的文檔、訂單文檔等等:
所有文檔都散亂存放顯然非?;靵y,也不方便管理。
因此,我們要將類型相同的文檔集中在一起管理,稱為索引(Index)。例如:
商品索引
{
? ? "id": 1,
? ? "title": "小米手機(jī)",
? ? "price": 3499
}{
? ? "id": 2,
? ? "title": "華為手機(jī)",
? ? "price": 4999
}{
? ? "id": 3,
? ? "title": "三星手機(jī)",
? ? "price": 3999
}
用戶索引
{
? ? "id": 101,
? ? "name": "張三",
? ? "age": 21
}{
? ? "id": 102,
? ? "name": "李四",
? ? "age": 24
}{
? ? "id": 103,
? ? "name": "麻子",
? ? "age": 18
}
訂單索引
{
? ? "id": 10,
? ? "userId": 101,
? ? "goodsId": 1,
? ? "totalFee": 294
}{
? ? "id": 11,
? ? "userId": 102,
? ? "goodsId": 2,
? ? "totalFee": 328
}
?
-
所有用戶文檔,就可以組織在一起,稱為用戶的索引;
-
所有商品的文檔,可以組織在一起,稱為商品的索引;
-
所有訂單的文檔,可以組織在一起,稱為訂單的索引;
因此,我們可以把索引當(dāng)做是數(shù)據(jù)庫中的表。
數(shù)據(jù)庫的表會有約束信息,用來定義表的結(jié)構(gòu)、字段的名稱、類型等信息。因此,索引庫中就有映射(mapping),是索引中文檔的字段約束信息,類似表的結(jié)構(gòu)約束。
mysql與elasticsearch
我們統(tǒng)一的把mysql與elasticsearch的概念做一下對比:
MySQL | Elasticsearch | 說明 |
---|---|---|
Table | Index | 索引(index),就是文檔的集合,類似數(shù)據(jù)庫的表(table) |
Row | Document | 文檔(Document),就是一條條的數(shù)據(jù),類似數(shù)據(jù)庫中的行(Row),文檔都是JSON格式 |
Column | Field | 字段(Field),就是JSON文檔中的字段,類似數(shù)據(jù)庫中的列(Column) |
Schema | Mapping | Mapping(映射)是索引中文檔的約束,例如字段類型約束。類似數(shù)據(jù)庫的表結(jié)構(gòu)(Schema) |
SQL | DSL | DSL是elasticsearch提供的JSON風(fēng)格的請求語句,用來操作elasticsearch,實現(xiàn)CRUD |
如圖:
那是不是說,我們學(xué)習(xí)了elasticsearch就不再需要mysql了呢?
并不是如此,兩者各自有自己的擅長之處:
-
Mysql:擅長事務(wù)類型操作,可以確保數(shù)據(jù)的安全和一致性
-
Elasticsearch:擅長海量數(shù)據(jù)的搜索、分析、計算
因此在企業(yè)中,往往是兩者結(jié)合使用:
-
對安全性要求較高的寫操作,使用mysql實現(xiàn)
-
對查詢性能要求較高的搜索需求,使用elasticsearch實現(xiàn)
-
兩者再基于某種方式,實現(xiàn)數(shù)據(jù)的同步,保證一致性
IK分詞器
Elasticsearch的關(guān)鍵就是倒排索引,而倒排索引依賴于對文檔內(nèi)容的分詞,而分詞則需要高效、精準(zhǔn)的分詞算法,IK分詞器就是這樣一個中文分詞算法。
安裝IK分詞器
方案一:在線安裝
運行一個命令即可:
docker exec -it es ./bin/elasticsearch-plugin ?install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.1/elasticsearch-analysis-ik-7.12.1.zip
然后重啟es容器:
docker restart es
方案二:離線安裝
如果網(wǎng)速較差,也可以選擇離線安裝。
首先,查看之前安裝的Elasticsearch容器的plugins數(shù)據(jù)卷目錄:
docker volume inspect es-plugins
結(jié)果如下:
[
? ? {
? ? ? ? "CreatedAt": "2024-11-06T10:06:34+08:00",
? ? ? ? "Driver": "local",
? ? ? ? "Labels": null,
? ? ? ? "Mountpoint": "/var/lib/docker/volumes/es-plugins/_data",
? ? ? ? "Name": "es-plugins",
? ? ? ? "Options": null,
? ? ? ? "Scope": "local"
? ? }
]
可以看到elasticsearch的插件掛載到了/var/lib/docker/volumes/es-plugins/_data
這個目錄。我們需要把IK分詞器上傳至這個目錄。
找到課前資料提供的ik分詞器插件,課前資料提供了7.12.1
版本的ik分詞器壓縮文件,你需要對其解壓:
然后上傳至虛擬機(jī)的/var/lib/docker/volumes/es-plugins/_data
這個目錄:
最后,重啟es容器:
docker restart es
使用IK分詞器
IK分詞器包含兩種模式:
-
ik_smart
:智能語義切分 -
ik_max_word
:最細(xì)粒度切分
我們在Kibana的DevTools上來測試分詞器,首先測試Elasticsearch官方提供的標(biāo)準(zhǔn)分詞器:
POST /_analyze
{
? "analyzer": "standard",
? "text": "程序員學(xué)習(xí)java太棒了"
}
結(jié)果如下:
{
? "tokens" : [
? ? {
? ? ? "token" : "程",
? ? ? "start_offset" : 2,
? ? ? "end_offset" : 3,
? ? ? "type" : "<IDEOGRAPHIC>",
? ? ? "position" : 2
? ? },
? ? {
? ? ? "token" : "序",
? ? ? "start_offset" : 3,
? ? ? "end_offset" : 4,
? ? ? "type" : "<IDEOGRAPHIC>",
? ? ? "position" : 3
? ? },
? ? {
? ? ? "token" : "員",
? ? ? "start_offset" : 4,
? ? ? "end_offset" : 5,
? ? ? "type" : "<IDEOGRAPHIC>",
? ? ? "position" : 4
? ? },
? ? {
? ? ? "token" : "學(xué)",
? ? ? "start_offset" : 5,
? ? ? "end_offset" : 6,
? ? ? "type" : "<IDEOGRAPHIC>",
? ? ? "position" : 5
? ? },
? ? {
? ? ? "token" : "習(xí)",
? ? ? "start_offset" : 6,
? ? ? "end_offset" : 7,
? ? ? "type" : "<IDEOGRAPHIC>",
? ? ? "position" : 6
? ? },
? ? {
? ? ? "token" : "java",
? ? ? "start_offset" : 7,
? ? ? "end_offset" : 11,
? ? ? "type" : "<ALPHANUM>",
? ? ? "position" : 7
? ? },
? ? {
? ? ? "token" : "太",
? ? ? "start_offset" : 11,
? ? ? "end_offset" : 12,
? ? ? "type" : "<IDEOGRAPHIC>",
? ? ? "position" : 8
? ? },
? ? {
? ? ? "token" : "棒",
? ? ? "start_offset" : 12,
? ? ? "end_offset" : 13,
? ? ? "type" : "<IDEOGRAPHIC>",
? ? ? "position" : 9
? ? },
? ? {
? ? ? "token" : "了",
? ? ? "start_offset" : 13,
? ? ? "end_offset" : 14,
? ? ? "type" : "<IDEOGRAPHIC>",
? ? ? "position" : 10
? ? }
? ]
}
?
可以看到,標(biāo)準(zhǔn)分詞器智能1字1詞條,無法正確對中文做分詞。
我們再測試IK分詞器:
POST /_analyze
{
? "analyzer": "ik_smart",
? "text": "程序員學(xué)習(xí)java太棒了"
}
執(zhí)行結(jié)果如下:
{
? "tokens" : [
? ? {
? ? ? "token" : "程序員",
? ? ? "start_offset" : 2,
? ? ? "end_offset" : 5,
? ? ? "type" : "CN_WORD",
? ? ? "position" : 1
? ? },
? ? {
? ? ? "token" : "學(xué)習(xí)",
? ? ? "start_offset" : 5,
? ? ? "end_offset" : 7,
? ? ? "type" : "CN_WORD",
? ? ? "position" : 2
? ? },
? ? {
? ? ? "token" : "java",
? ? ? "start_offset" : 7,
? ? ? "end_offset" : 11,
? ? ? "type" : "ENGLISH",
? ? ? "position" : 3
? ? },
? ? {
? ? ? "token" : "太棒了",
? ? ? "start_offset" : 11,
? ? ? "end_offset" : 14,
? ? ? "type" : "CN_WORD",
? ? ? "position" : 4
? ? }
? ]
}
?
拓展詞典
隨著互聯(lián)網(wǎng)的發(fā)展,“造詞運動”也越發(fā)的頻繁。出現(xiàn)了很多新的詞語,在原有的詞匯列表中并不存在。比如:“泰褲辣”,“傳智播客” 等。
IK分詞器無法對這些詞匯分詞,測試一下:
POST /_analyze
{
? "analyzer": "ik_max_word",
? "text": "傳智播客開設(shè)大學(xué),真的泰褲辣!"
}
結(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
? ? },
? ? {
? ? ? "token" : "開設(shè)",
? ? ? "start_offset" : 4,
? ? ? "end_offset" : 6,
? ? ? "type" : "CN_WORD",
? ? ? "position" : 4
? ? },
? ? {
? ? ? "token" : "大學(xué)",
? ? ? "start_offset" : 6,
? ? ? "end_offset" : 8,
? ? ? "type" : "CN_WORD",
? ? ? "position" : 5
? ? },
? ? {
? ? ? "token" : "真的",
? ? ? "start_offset" : 9,
? ? ? "end_offset" : 11,
? ? ? "type" : "CN_WORD",
? ? ? "position" : 6
? ? },
? ? {
? ? ? "token" : "泰",
? ? ? "start_offset" : 11,
? ? ? "end_offset" : 12,
? ? ? "type" : "CN_CHAR",
? ? ? "position" : 7
? ? },
? ? {
? ? ? "token" : "褲",
? ? ? "start_offset" : 12,
? ? ? "end_offset" : 13,
? ? ? "type" : "CN_CHAR",
? ? ? "position" : 8
? ? },
? ? {
? ? ? "token" : "辣",
? ? ? "start_offset" : 13,
? ? ? "end_offset" : 14,
? ? ? "type" : "CN_CHAR",
? ? ? "position" : 9
? ? }
? ]
}
?
可以看到,傳智播客
和泰褲辣
都無法正確分詞。
所以要想正確分詞,IK分詞器的詞庫也需要不斷的更新,IK分詞器提供了擴(kuò)展詞匯的功能。
1)打開IK分詞器config目錄:
注意,如果采用在線安裝的通過,默認(rèn)是沒有config目錄的,需要把課前資料提供的ik下的config上傳至對應(yīng)目錄。
2)在IKAnalyzer.cfg.xml配置文件內(nèi)容添加:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
? ? ? ? <comment>IK Analyzer 擴(kuò)展配置</comment>
? ? ? ? <!--用戶可以在這里配置自己的擴(kuò)展字典 *** 添加擴(kuò)展詞典-->
? ? ? ? <entry key="ext_dict">ext.dic</entry>
</properties>
3)在IK分詞器的config目錄新建一個 ext.dic
,可以參考config目錄下復(fù)制一個配置文件進(jìn)行修改
傳智播客
泰褲辣
4)重啟elasticsearch
docker restart es
# 查看 日志
docker logs -f elasticsearch
再次測試,可以發(fā)現(xiàn)傳智播客
和泰褲辣
都正確分詞了:
{
? "tokens" : [
? ? {
? ? ? "token" : "傳智播客",
? ? ? "start_offset" : 0,
? ? ? "end_offset" : 4,
? ? ? "type" : "CN_WORD",
? ? ? "position" : 0
? ? },
? ? {
? ? ? "token" : "開設(shè)",
? ? ? "start_offset" : 4,
? ? ? "end_offset" : 6,
? ? ? "type" : "CN_WORD",
? ? ? "position" : 1
? ? },
? ? {
? ? ? "token" : "大學(xué)",
? ? ? "start_offset" : 6,
? ? ? "end_offset" : 8,
? ? ? "type" : "CN_WORD",
? ? ? "position" : 2
? ? },
? ? {
? ? ? "token" : "真的",
? ? ? "start_offset" : 9,
? ? ? "end_offset" : 11,
? ? ? "type" : "CN_WORD",
? ? ? "position" : 3
? ? },
? ? {
? ? ? "token" : "泰褲辣",
? ? ? "start_offset" : 11,
? ? ? "end_offset" : 14,
? ? ? "type" : "CN_WORD",
? ? ? "position" : 4
? ? }
? ]
}
總結(jié)
分詞器的作用是什么?
-
創(chuàng)建倒排索引時,對文檔分詞
-
用戶搜索時,對輸入的內(nèi)容分詞
IK分詞器有幾種模式?
-
ik_smart
:智能切分,粗粒度 -
ik_max_word
:最細(xì)切分,細(xì)粒度
IK分詞器如何拓展詞條?如何停用詞條?
-
利用config目錄的
IkAnalyzer.cfg.xml
文件添加拓展詞典和停用詞典 -
在詞典中添加拓展詞條或者停用詞條