设为首页 收藏本站
查看: 1023|回复: 0

[经验分享] elasticsearch 分词器配置注意事项

[复制链接]

尚未签到

发表于 2017-5-20 13:41:25 | 显示全部楼层 |阅读模式
//插件代码
package org.elasticsearch.index.analysis;
public class MMsegAnalysisBinderProcessor extends AnalysisModule.AnalysisBinderProcessor
{
public void processAnalyzers(AnalysisModule.AnalysisBinderProcessor.AnalyzersBindings analyzersBindings)
{
//以名字为mmesg为分析器的名字注入到es容器中
analyzersBindings.processAnalyzer("mmseg", MMsegAnalyzerProvider.class);
super.processAnalyzers(analyzersBindings);
}
public void processTokenizers(AnalysisModule.AnalysisBinderProcessor.TokenizersBindings tokenizersBindings)
{

//以名字为mmesg为分词器的名字注入到es容器中
tokenizersBindings.processTokenizer("mmseg", MMsegTokenizerFactory.class);
    super.processTokenizers(tokenizersBindings);
}
public void processTokenFilters(AnalysisModule.AnalysisBinderProcessor.TokenFiltersBindings tokenFiltersBindings)
{
tokenFiltersBindings.processTokenFilter("cut_letter_digit", CutLetterDigitTokenFilter.class);
super.processTokenFilters(tokenFiltersBindings);
}
}
//装配Tokenizers
public static class TokenizersBindings {
//TokenizersMap
private final Map<String, Class<? extends TokenizerFactory>> tokenizers = Maps.newHashMap();
public TokenizersBindings() {
}
public void processTokenizer(String name, Class<? extends TokenizerFactory> tokenizerFactory) {
tokenizers.put(name, tokenizerFactory);
}
}
public void processAnalyzers(AnalyzersBindings analyzersBindings) {
}
//构建Analyzers
public static class AnalyzersBindings {
//AnalyzersMap
   private final Map<String, Class<? extends AnalyzerProvider>> analyzers = Maps.newHashMap();
            public AnalyzersBindings() {
}
public void processAnalyzer(String name, Class<? extends AnalyzerProvider> analyzerProvider) {
analyzers.put(name, analyzerProvider);
}

        }  
 
   所以配置文件中index.analysis.analyzer.default.type : "mmseg"
   这样就可以指定默认分析器了。
 
 
   注意:
   如果配置文件中这样配置了
    

index:
analysis:
tokenizer:
mmseg_maxword:
type: mmseg
seg_type: max_word
mmseg_complex:
type: mmseg
seg_type: complex
analyzer:
mmseg_maxword:
type: custom
filter:
- lowercase
- cut_letter_digit
tokenizer: mmseg_maxword
mmseg:
type: custom
filter:
- lowercase
- cut_letter_digit
tokenizer: mmseg_maxword
mmseg_complex:
type: custom
filter:
- lowercase
- cut_letter_digit
tokenizer: mmseg_complex
#index.analysis.analyzer.default.type : "org.elasticsearch.index.analysis.MMsegAnalyzerProvider"
#index.analysis.analyzer.default.type : "ik"
index.analysis.analyzer.default.type : "mmseg"
    
    这里也配置了一个:

mmseg:
type: custom
filter:
- lowercase
- cut_letter_digit
tokenizer: mmseg_maxword

应该和插件中的名字重名了
访问:
http://localhost:9200/zzm/_analyze?analyzer=mmseg&text=中华人民共和国user123
这里调用的mmseg分析器是配置文件中配置的分析器
http://localhost:9200/zzm/_analyze?field=content&text=中华人民共和国user123
这里调用的是zzm索引content字段使用的分析器,这个分析器可以在mapping里面指定,如果不指定,用的就是默认的分析器index.analysis.analyzer.default.type : "mmseg"
这里的mmseg是插件注入的原生mmseg的分析器,而不是
mmseg:
type: custom
filter:
- lowercase
- cut_letter_digit
tokenizer: mmseg_maxword



总结:elasticsearch.yml 中定义分析器和分词插件包中注入的分析器都同时注入到了elasticSearch容器当中。
1.mapping中定义的分析器,会根据名称mmseg_complex,去容器中找相应的分析器。
如果在mapping中不指定分析器,那么就使用elasticsearch.yml 配置文件中默认的分析器

index.analysis.analyzer.default.type : "mmseg"
NamedAnalyzer namedAnalyzer =new NamedAnalyzer("mmseg_complex", new MMSegAnalyzer());
rootObjectMapperBuilder..add(new StringFieldMapper.Builder("title").store(true) .index(true).tokenized(true) .indexAnalyzer(namedAnalyzer) .searchAnalyzer(namedAnalyzer)
2.http://localhost:9200/zzm/_analyze?analyzer=mmseg&text=中华人民共和国user123
这里的分析器mmseg,会根据名称从器容器里面找的分析器
2.1 如果找不到会提示:{"error":"ElasticsearchIllegalArgumentException[failed to find analyzer [mmseg2]]","status":400}
2.2 如果配置文件中定义名字为mmseg分析器,插件中也有一个名称为mmseg分析器,那么配置文件定义的分析器优先
3.http://localhost:9200/zzm/_analyze?field=content&text=中华人民共和国user123
这里是mapping中content字段定义的分析器来分词。
如果在mapping中不指定分析器,那么就使用elasticsearch.yml 配置文件中默认的分析器
index.analysis.analyzer.default.type : "mmseg"
4.index.analysis.analyzer.default.type : "mmseg"
es 会去插件中注入的容器中找mmseg分析器。如果没找到则会报错。
比如写成这样ndex.analysis.analyzer.default.type :  mmseg_maxword
报错:
Caused by: org.elasticsearch.ElasticsearchIllegalArgumentException: failed to find analyzer type [mmseg_maxword] or tokenizer for [default]
at org.elasticsearch.index.analysis.AnalysisModule.configure(AnalysisModule.java:372)
at org.elasticsearch.common.inject.AbstractModule.configure(AbstractModule.java:60)
at org.elasticsearch.common.inject.spi.Elements$RecordingBinder.install(Elements.java:204)
at org.elasticsearch.common.inject.spi.Elements.getElements(Elements.java:85)
at org.elasticsearch.common.inject.InjectorShell$Builder.build(InjectorShell.java:130)
at org.elasticsearch.common.inject.InjectorBuilder.build(InjectorBuilder.java:99)
at org.elasticsearch.common.inject.InjectorImpl.createChildInjector(InjectorImpl.java:131)
at org.elasticsearch.common.inject.ModulesBuilder.createChildInjector(ModulesBuilder.java:69)
at org.elasticsearch.indices.IndicesService.createIndex(IndicesService.java:336)
... 8 more
Caused by: org.elasticsearch.common.settings.NoClassSettingsException: Failed to load class setting [type] with value [mmseg_maxword]
at org.elasticsearch.common.settings.ImmutableSettings.loadClass(ImmutableSettings.java:476)
at org.elasticsearch.common.settings.ImmutableSettings.getAsClass(ImmutableSettings.java:464)
at org.elasticsearch.index.analysis.AnalysisModule.configure(AnalysisModule.java:356)
... 16 more
Caused by: java.lang.ClassNotFoundException: org.elasticsearch.index.analysis.mmsegmaxword.MmsegMaxwordAnalyzerProvider
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at org.elasticsearch.common.settings.ImmutableSettings.loadClass(ImmutableSettings.java:474)
看下源码:
at org.elasticsearch.index.analysis.AnalysisModule.configure(AnalysisModule.java:372)
Class<? extends AnalyzerProvider> type = null;
try {
//index.analysis.analyzer.default.type : "mmseg"
//根据配置默认的插件名称去找插件供应者,找不到则抛出异常
type = analyzerSettings.getAsClass("type", null, "org.elasticsearch.index.analysis.", "AnalyzerProvider");
} catch (NoClassSettingsException e) {
// nothing found, see if its in bindings as a binding name
if (analyzerSettings.get("type") != null) {
type = analyzersBindings.analyzers.get(Strings.toUnderscoreCase(analyzerSettings.get("type")));
if (type == null) {
type = analyzersBindings.analyzers.get(Strings.toCamelCase(analyzerSettings.get("type")));
}
}
if (type == null) {
// no specific type, check if it has a tokenizer associated with it
String tokenizerName = analyzerSettings.get("tokenizer");
if (tokenizerName != null) {
// we have a tokenizer, use the CustomAnalyzer
type = CustomAnalyzerProvider.class;
} else {
throw new ElasticsearchIllegalArgumentException("failed to find analyzer type [" + analyzerSettings.get("type") + "] or tokenizer for [" + analyzerName + "]", e);
}
}
}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-379382-1-1.html 上篇帖子: elasticsearch调优checklist-内存 下篇帖子: elasticsearch集群内部节点超时解决
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表