使用Elasticsearch6.1.1时使用Sudachi的步骤(非官方)
Sudachi和Elasticsearch
今年也只剩下1天结束,我久违地坐在Qiita的屏幕前,只为了赶在最后一刻完成尚未处理的事情。
Sudachi从一开始就是一个完美且高度完善的模块,而我也一直在我的专业中积极调试并将其用作自然语言处理的核心引擎。
就在这个时候,我需要在Elasticsearch 6系列中使用Sudachi(之前一直是直接使用API调用),所以我想与大家分享一些重点。
※ 安装到5.6系列可以参考这篇文章。
针对Elasticsearch的新形态素分析器「Sudachi」。
Elasticsearch插件的版本依赖性。
我相信阅读这篇文章的各位一定都是Elasticsearch的专家,但为了确保一切,我写下一些先备知识。
Elasticsearch(以下简称es)可以通过插件实现各种功能扩展。该插件实现和提供了各种国家语言的词干处理和形态分析功能,但实际上该插件的二进制文件是与es版本相依赖的。(虽然看起来并不是那么严格,但插件所依赖的库必须与安装目标es的版本号的第三级构建版本完全匹配。)
分析 – Sudachi的相容版本。
Sudachi的Elasticsearch插件analysis-sudachi目前支持5.6系列。若要在es的最新版本6.1.1中使用analysis-sudachi,需要调整源代码以适应es和其依赖的lucene的API更改(这相当频繁..orz)。本文将示例更改的部分,并努力使analysis-sudachi成功构建并嵌入到es中并正常运行。但请注意,这些步骤非官方,请自行承担责任。
分析- 克隆Sudachi
从https://github.com/WorksApplications/elasticsearch-sudachi.git克隆develop分支。
编辑pom.xml文件
修改analysis-sudachi项目下的pom.xml文件。将es和lucene的版本升级。
-行表示原始内容,+行表示新的内容。
15行あたり
- <elasticsearch.version>5.6.1</elasticsearch.version>
+ <elasticsearch.version>6.1.1</elasticsearch.version>
211行あたり
<artifactId>lucene-analyzers-kuromoji</artifactId>
- <version>6.6.0</version>
+ <version>7.1.0</version>
241行あたり
<artifactId>lucene-test-framework</artifactId>
- <version>6.6.0</version>
+ <version>7.1.0</version>
我认为在这里更新项目会因为API的差异而出现编译错误的地方。
编辑Java源代码
接下来需要根据es和lucene的API变更进行源代码的编辑。
41行あたり
- SudachiAnalyzer.getDefaultStopSet());
+ SudachiAnalyzer.getDefaultStopSet(), false);
185行あたり
- .loadFromStream(RESOURCE_NAME_SUDACHI_ANALYSIS_JSON, input)
+ .loadFromStream(RESOURCE_NAME_SUDACHI_ANALYSIS_JSON, input, false)
32行あたり
-import org.apache.lucene.index.Fields;
+import org.apache.lucene.index.FieldInfos;
117-123行あたり
LeafReader leafReader = leafReaderContext.reader();
- Fields fields = leafReader.fields();
+ FieldInfos fields = leafReader.getFieldInfos();
assertThat(fields.size(), is(1));
- String fieldName = fields.iterator().next();
+ String fieldName = fields.iterator().next().name;
assertThat(fieldName, is(FIELD_NAME));
- Terms terms = fields.terms(fieldName);
+ Terms terms = leafReader.terms(fieldName);
156-159行あたり
assertThat(terms.size(), is(7L));
query = queryParser.parse("京都");
- assertThat(searcher.search(query, 5).totalHits, is(0));
+ assertThat(searcher.search(query, 5).totalHits, is(0L));
query = queryParser.parse("岩波");
- assertThat(searcher.search(query, 5).totalHits, is(0));
+ assertThat(searcher.search(query, 5).totalHits, is(0L));
故障修复?
這個檔案的修改並不是為了符合API,而是為了恢復被註解掉的一行,該行似乎在算法上是必要的。如果沒有這一行,在超過512個字符的欄位中會引發異常。
240行あたり
- //nextBaseOffset += eos;
+ nextBaseOffset += eos;
建立和安装
执行mvn package命令并成功构建后,将在target/releases/目录下创建一个以zip文件形式的插件。请指定它。
elasticsearch-plugin install analysis-sudachi-1.0.0-SNAPSHOT.zip
请执行。
提供词典
如果使用Elasticsearch插件引用资源文件时Java虚拟机会抛出异常。虽然有很多设置方法,但我决定在es的config目录下创建一个子目录来放置sudachi词典。
Ubuntu操作系统路径为:/usr/share/elasticsearch/config/sudachi/system_core.dic。
Mac OS路径为:/usr/local/opt/elasticsearch/libexec/config/sudachi/system_core.dic。
索引设置
我正在使用analysis-sudachi进行如下设置。
"analysis": {
"tokenizer": {
"sudachi_tokenizer": {
"type": "sudachi_tokenizer",
"mode": "search",
"discard_punctuation": true,
"resources_path": "/usr/share/elasticsearch/config/sudachi"
}
},
"analyzer": {
"sudachi": {
"filter": [
"lowercase",
"cjk_width",
"english_stop",
"sudachi_part_of_speech",
"sudachi_ja_stop",
"sudachi_baseform",
"sudachi_readingform"
],
"tokenizer": "sudachi_tokenizer",
"type": "custom"
}
}
}
以上就是全部了。那么,祝大家新年快乐。