ES的默認(rèn)中文分詞效果太差了,稍微長(zhǎng)一點(diǎn)的詞句就完全匹配不到,于是選擇使用安裝IK中文分詞器來實(shí)現(xiàn)索引的分詞。
參考:
https://blog.csdn.net/w1014074794/article/details/119762827
https://www.bbsmax.com/A/6pdDqDaXzw/

一、安裝
官網(wǎng)教程:
https://github.com/medcl/elasticsearch-analysis-ik,注意版本對(duì)應(yīng)的問題

1.下載
從此處下載預(yù)構(gòu)建包:https ://github.com/medcl/elasticsearch-analysis-ik/releases
根據(jù)版本匹配,我使用的是ES7.10.2,因此要下載對(duì)應(yīng)ik7.10.2(如果版本不匹配的話,ik分詞器會(huì)無法使用)

2.解壓
在ES安裝文件夾下的plugins文件夾下創(chuàng)建ik目錄,將zip文件解壓到ik目錄下,刪除zip

3.重新啟動(dòng)ES后測(cè)試
(1)原生分詞器效果
GET /_analyze
{
"analyzer": "standard",
"text": "中華人民共和國"
}

(2)ik分詞器效果
①ik_max_word
會(huì)把文本做最細(xì)粒度的解析,會(huì)窮盡各種可能的組合,適合詞條查詢;
GET /_analyze
{
"analyzer": "ik_max_word",
"text": "中華人民共和國"
}

②ik_smart
會(huì)做最粗粒度的拆分,適合短語查詢。
GET /_analyze
{
"analyzer": "ik_smart",
"text": "中華人民共和國"
}

二、項(xiàng)目使用
刪除之前的索引,創(chuàng)建新的指定分詞器的索引(對(duì)相應(yīng)字段設(shè)定分詞器),并將數(shù)據(jù)重新導(dǎo)入后測(cè)試檢索效果
索引字段詳解:https://www.cnblogs.com/hld123/p/16538466.html
fields可以讓同一文本有多種不同的索引方式,比如所示一個(gè)String類型的字段city,可以使用text類型做全文檢索,使用keyword類型做聚合和排序。??
PUT index_name
{
"mappings": { # 設(shè)置 mappings
"properties": { # 屬性,固定寫法
"city": { # 字段名
"type": "text", # city 字段的類型為 text
"fields": { # 多字段域,固定寫法
"raw": { # 子字段名稱
"type": "keyword" # 子字段類型
"ignore_above": 256 #在ElasticSearch中keyword,text類型字段ignore_above屬性(動(dòng)態(tài)映射默認(rèn)是256) ,表示最大的字段值長(zhǎng)度,超出這個(gè)長(zhǎng)度的字段將不會(huì)被索引,查詢不到,但是會(huì)存儲(chǔ)。
}
}
}
}
}
}
通過analyzer屬性指定寫入分詞器采用細(xì)粒度模式
ik_max_word
;通過search_analyzer屬性指定查詢時(shí)采用智能模式ik_smart

1.創(chuàng)建json對(duì)象作為索引mapping
由于數(shù)據(jù)類型較多,使用json文件,將其裝換為json對(duì)象
(1)pom.xml
<!--json文件轉(zhuǎn)json對(duì)象-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.54</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
(2)JsonUtil
package org.project.es.common.util;
import java.io.InputStream;
import org.apache.commons.io.IOUtils;
import com.alibaba.fastjson.JSONObject;
/**
* 將json文件裝換為json對(duì)象
* @author Administrator
*/
public class JsonUtil {
public static JSONObject fileToJson(String fileName) {
JSONObject json = null;
try (
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName);
) {
json = JSONObject.parseObject(IOUtils.toString(is, "utf-8"));
} catch (Exception e) {
System.out.println(fileName + "文件讀取異常" + e);
}
return json;
}
public static void main(String[] args) {
String fileName = "doc/policy.json";
JSONObject json = JsonUtil.fileToJson(fileName);
System.out.println(json);
}
}

2.創(chuàng)建索引
public static void createIndex(RestHighLevelClient client,String index) throws IOException {
// 1.創(chuàng)建索引 - 請(qǐng)求對(duì)象
CreateIndexRequest request = new CreateIndexRequest(index);
// 2.設(shè)置setting,也就是索引的基本配置信息,將setting添加到請(qǐng)求對(duì)象中
Settings setting = Settings.builder()
//設(shè)置分片數(shù),主分片數(shù)量一旦設(shè)置后就不能修改了
.put("index.number_of_shards", 1)
//索引的刷新時(shí)間間隔,索引更新多久才對(duì)搜索可見(即數(shù)據(jù)寫入es到可以搜索到的時(shí)間間隔,設(shè)置越小越靠近實(shí)時(shí),但是索引的速度會(huì)明顯下降,),
// 默認(rèn)為1秒,如果我們對(duì)實(shí)時(shí)搜索沒有太大的要求,反而更注重索引的速度,那么我們就應(yīng)該設(shè)置的稍微大一些,這里設(shè)置30s
.put("index.refresh_interval", "30s")
//每個(gè)節(jié)點(diǎn)上允許最多分片數(shù)
.put("index.routing.allocation.total_shards_per_node", 3)
//將數(shù)據(jù)同步到磁盤的頻率,為了保證性能,插入ES的數(shù)據(jù)并不會(huì)立刻落盤,而是首先存放在內(nèi)存當(dāng)中,
// 等到條件成熟后觸發(fā)flush操作,內(nèi)存中的數(shù)據(jù)才會(huì)被寫入到磁盤當(dāng)中
.put("index.translog.sync_interval", "30s")
//每個(gè)主分片擁有的副本數(shù),副本數(shù)量可以修改
.put("index.number_of_replicas", 1)
//一次最多獲取多少條記錄
.put("index.max_result_window", "10000000")
.build();
request.settings(setting);
// 3.使用工具類將json文件轉(zhuǎn)換為json對(duì)象,添加到請(qǐng)求對(duì)象中
JSONObject mapping = JsonUtil.fileToJson("doc/policy.json");
request.mapping(mapping);
// 4.發(fā)送請(qǐng)求,獲取響應(yīng)
CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT);
boolean acknowledged = response.isAcknowledged();
// 5.輸出響應(yīng)狀態(tài)
System.out.println("操作狀態(tài) = " + acknowledged);
}
查看索引

3.導(dǎo)入數(shù)據(jù)
索引創(chuàng)建好之后將mysql數(shù)據(jù)導(dǎo)入es,便于檢索
4.測(cè)試檢索文章來源:http://www.zghlxwxcb.cn/news/detail-478511.html
之前使用默認(rèn)分詞器的效果很差,檢索結(jié)果不盡如人意,在安裝使用了IK分詞器后再次檢索測(cè)試,發(fā)現(xiàn)效果不錯(cuò),檢索速度也很快文章來源地址http://www.zghlxwxcb.cn/news/detail-478511.html

到了這里,關(guān)于ES搜索框架--設(shè)置IK分詞器的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!