# Solr 配置中文分詞器 IK Analyzer
## 我的環境
* OS : Ubuntu
* Solr : Docker 9.4.0 create by 2023-12-16
`sudo docker run -d --name solr-dev -p 8983:8983 -v solr:/var/solr solr:latest`
## 下載來源
[mvnrepository - ik-analyzer](https://mvnrepository.com/artifact/com.github.magese/ik-analyzer)
### 檔案說明
本文說明以ik-analyzer-8.5.0版本為主,下載僅需要下載ik-analyzer-8.5.0.jar即可
* ik-analyzer-8.5.0.jar
分詞外掛檔案
* lucene-analysis-smartcn-9.8.0.jar
分詞外掛會參照的檔案,此檔案可以從Solr裏頭找到
(/opt/solr/contrib/analysis-extras/lib/)
## 設置步驟
> 定義變數說明
> [solr-dev] -- Docker Container 名稱
> [solr-data] -- Docker Volume 名稱
> [profetai] -- Solr Core 名稱
1. 將ik-analyzer-8.5.0.jar複製到Solr的工作區/opt/solr-9.4.0/server/solr-webapp/webapp/WEB-INF/lib
`sudo docker cp ik-analyzer-8.5.0.jar [solr-dev]:/opt/solr-9.4.0/server/solr-webapp/webapp/WEB-INF/lib`
2. 將Solr裡面的lucene-analysis-smartcn-9.8.0.jar檔案複製出來
`sudo docker cp [solr-dev]:/opt/solr/contrib/analysis-extras/lib/lucene-analysis-smartcn-9.8.0.jar lucene-analysis-smartcn-9.8.0.jar`
3. 將lucene-analysis-smartcn-9.8.0.jar檔案複製到Solr的工作區/opt/solr-9.4.0/server/solr-webapp/webapp/WEB-INF/lib
`sudo docker cp lucene-analysis-smartcn-9.8.0.jar [solr-dev]:/opt/solr-9.4.0/server/solr-webapp/webapp/WEB-INF/lib`
> 此建置在測試時無法使用sudo docker exec -it [solr-dev] 'cp .. ..',會出現權限不足,因此將檔案從容器拉出後重新複製回容器
4. 將外掛追加到各自的Core
在Core中的managed-schema.xml 追加一個新的資料型態
編輯範例 nano /var/lib/docker/volumes/[solr-data]/_data/data/[profetai]/conf/managed-schema.xml
```
<schema name="default-config" version="1.6">
...
<fieldType...></fieldType>
<!-- ik分词器 -->
<!-- ChineseAnalyzer 自带的中文分词器 -->
<fieldType name="text_ik" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
</analyzer>
</fieldType>
...
</schema>
```
**2024/4/1 發現上面的資料型態方式再分詞的分割上似乎沒有太精準於是調整成下方的方**
> 參考來源:https://blog.csdn.net/yyhzzzzzz/article/details/125809002
```
<schema name="default-config" version="1.6">
...
<fieldType...></fieldType>
<fieldType name="text_ik" class="solr.TextField">
<analyzer type="index" useSmart="false" class="org.wltea.analyzer.lucene.IKAnalyzer" />
<analyzer type="query" useSmart="true" class="org.wltea.analyzer.lucene.IKAnalyzer" />
</fieldType>
...
</schema>
```
5. 使用ik來進行分詞
由於ik外掛為新的資料型態,所以將自己當前的欄位資料型態調整成text_ik即可
下列範例為我的自己的CORE欄位型定義,其中我需要將欄位屬性type變更為text_ik即可
```
<schema name="default-config" version="1.6">
...
<field name="CATEGORY" type="text_general"/>
<field name="CREATOR" type="text_general"/>
<field name="DESCRIPTION" type="text_general"/>
<field name="DSOURCE" type="text_general"/>
<field name="DTYPE" type="text_general"/>
<field name="FKID" type="text_general"/>
<field name="JSONSTRING" type="text_general"/>
<field name="LANGUAGE" type="text_general"/>
<field name="NAME" type="text_general"/>
<field name="PHASE" type="text_general"/>
<field name="PKID" type="text_general"/>
<field name="REFERENCE" type="text_general"/>
<field name="SPONSOR" type="text_general"/>
<field name="STATUS" type="text_general"/>
<field name="TAGS" type="text_general"/>
<field name="TEXTCONTENTS" type="text_ik"/> <<<---
...
</schema>
```
本文參照於
> https://www.cnblogs.com/smiles365/articles/15271630.html