中文分詞插件的安裝:
elasticserch默認情況下是不支持中文分詞的,所以在我們日常的開發中需要安裝下中文詞庫的插件analysis-ik。
首先進入elasticsearch的根目錄下執行以下命令安裝插件,版本要和自己電腦安裝的elasticsearch版本對應上,如本人電腦安裝的是6.6.1版本:
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.6.1/elasticsearch-analysis-ik-6.6.1.zip檢查下中文分詞是否生效——
標準分詞
GET _analyze?pretty{ "analyzer": "standard", "text":"中華人民共和國國歌" }智能分詞
GET _analyze?pretty{ "analyzer": "ik_smart", "text":"中華人民共和國國歌" }最大化分詞
GET _analyze?pretty{ "analyzer": "ik_max_smart", "text":"中華人民共和國國歌" }最佳實踐:索引建立時使用最大化分詞,查詢時使用智能分詞
詞庫擴展
接下來就是詞庫的擴展,詞庫擴展主要對應中文字典中不存在的詞彙進行添加,如網絡用語中的「騷年」,公司的名稱等等都是詞庫擴展的主要對象。除此之外,我們詞庫擴展還有同義詞的擴展,如我們平常用的iphone,當輸入「蘋果」的時候,我們也是期待能查出手機的。所以這裡說的詞庫擴展主要分兩項,其一是生詞擴展,二是同義詞擴展
一、中文詞庫擴展:
1.新增詞庫
cd /elasticsearch-6.6.1/config/analysis-ik
新建文件new_word.dic
vim new_word.dic
2.配置詞庫,重啟elasticsearch
cd elasticsearch-6.6.1/config/analysis-ik
配置詞庫路徑,默認是配置文件的相對路徑,配置如下
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"><properties> <comment>IK Analyzer 擴展配置</comment> <entry key="ext_dict">new_word.dic</entry> <entry key="ext_stopwords"></entry> </properties>3.通過_update_by_query 更新索引,使詞庫生效(不建議暴力重新建索引)
#加了新詞庫更新
POST /shop/_update_by_query{ "query": { "bool": { "must": [ {"term": { "name":"騷" }}, {"term": { "name":"年" }} ] } }}二、中文同義詞擴展:
1.新增同義詞詞庫
cd /elasticsearch-7.9.1/config/analysis-ik
vim synonyms.txt
2.重新建立索引,設置自定義分詞analysis
PUT /shop{ "settings": { "number_of_shards": 1, "number_of_replicas": 0, "analysis": { "filter": { "synonym_filter":{ "type": "synonym", "synonyms_path":"analysis-ik/synonyms.txt" } }, "analyzer": { "ik_syno":{ "type":"custom", "tokenizer":"ik_smart", "filter":["synonym_filter"] }, "ik_syno_max":{ "type":"custom", "tokenizer":"ik_max_word", "filter":["synonym_filter"] } } } }, "mappings": { "properties": { "id":{"type":"integer"}, "name":{"type":"text","analyzer": "ik_syno_max","search_analyzer": "ik_syno"}, "tags":{"type":"text","analyzer": "whitespace","fielddata": true}, "location":{"type":"geo_point"}, "remark_score":{"type":"double"}, "price_per_man":{"type":"integer"}, "category_id":{"type":"integer"}, "category_name":{"type":"keyword"}, "seller_id":{"type":"integer"}, "seller_remark_score":{"type":"double"}, "seller_disabled_flag":{"type":"integer"} } }}