ES中文分词器之短语匹配(自定义分词器)

2022-01-30 00:00:00 扫描 匹配 分词 句子 长白山

楼主在上篇文章中,提出了将词和字分开,用不同的分词器分别构建索引,来解决match_phrase在中文中的短语或者句子匹配问题。详细的内容请看上一篇文章: ES中文分词器之短语匹配(解决了match_phrase匹配不全的问题)

为什么要自己写分词器?

楼主想要一种分词器,分词器完全按照词典分词,只要是词典有的词语,分词器就一定要分出来。测试了两个分词器比如说IK,MMseg,都不能按照楼主的要求分词。

MMSeg有考虑到词频,即使使用mmseg_max_word,也不能完全按照词典分词。

IK理论上是按照词典分词的,但是经测试,还是发现了些问题。比如说“一群穆斯林聚在一起”,单独用这句话测试,“穆斯林”可以分出,而这句话放入一篇文章中,却无法分出“穆斯林”。

楼主是用ik和standard对比命中量发现不一致,导出不一致数据后,才发现的这个问题(ik和mmseg都修改了源码,过滤掉中文之间的特殊符号,因此不存在词语中间有特殊符号standard可以分出,ik分不出而导致的不一致情况)。

没办法了,自己写一个吧。

ES自定义分词器

由于ES是采用juice依赖注入的方式,所以要实现一个工厂类和Provider类。

public class TestAnalyzerProvider extends AbstractIndexAnalyzerProvider<InfosecAnalyzer> {

public TestAnalyzerProvider(IndexSettings indexSettings, Environment env, String name, Settings settings) {
    super(indexSettings, name, settings);
}

public static AnalyzerProvider<? extends Analyzer> getMaxWord(IndexSettings indexSettings, Environment environment, String s, Settings settings) {
    return  new TestAnalyzerProvider(indexSettings,environment,s,settings);
}

@Override public InfosecAnalyzer get() {
    return new InfosecAnalyzer();
 }
}

public class TestTokenizerFactory extends AbstractTokenizerFactory {

 public TestTokenizerFactory(IndexSettings indexSettings, Environment env, String name, Settings settings) {
     super(indexSettings, name, settings);
 }

public static TokenizerFactory getMaxWord(IndexSettings indexSettings, Environment environment, String name, Settings settings) {
    return new TestTokenizerFactory(indexSettings,environment,name,settings);
}

@Override
public Tokenizer create() {
    return new TestTokenizor();
 }
}

相关文章