elasticsearch 分词器配置注意事项

标签: elasticsearch 分词 注意 | 发表时间:2015-11-09 10:48 | 作者:m635674608
出处:http://www.iteye.com
//插件代码
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);
                    }
                }
            }


已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [elasticsearch 分词 注意] 推荐:

elasticsearch 分词器配置注意事项

- - 编程语言 - ITeye博客
//以名字为mmesg为分析器的名字注入到es容器中. //以名字为mmesg为分词器的名字注入到es容器中. super.processTokenFilters(tokenFiltersBindings); } } //装配Tokenizers public static class TokenizersBindings {.

ElasticSearch 倒排索引、分词

- - 行业应用 - ITeye博客
es使用称为倒排索引的结构达到快速全文搜索的目的. 一个倒排索引包含一系列不同的单词,这些单词出现在任何一个文档,. 对于每个单词,对应着所有它出现的文档. 比如说,我们有2个文档,每个文档有一个conteng字段. 我们首先对每个字段进行分词,我们称之为terms或者tokens,创建了一些列有序列表,.

ElasticSearch中文分词ik安装

- - ITeye博客
下载编译好的安装包,解压缩就可以直接使用. 自己编译的版本在安装插件时可能会出现一些问题. 上面这一步很简单,没有出现任何问题就通过了,然而在安装ik时走了很多弯路,为防止今后出现类似情况将此次安装过程中出现的问题记录下来. 从elasticsearch-rtf中下载的elasticsearch-analysis-ik-1.2.6.jar直接拷贝到.

Elasticsearch搜索中文分词优化 - 简书

- -
Elasticsearch 中文搜索时遇到几个问题:. 当搜索关键词如:“人民币”时,如果分词将“人民币”分成“人”,“民”,“币”三个单字,那么搜索该关键词会匹配到很多包含该单字的无关内容,但是如果将该词分词成一个整词“人民币”,搜索单字如“人”字又不会匹配到包含“人民币”关键词的内容,怎么解决这个问题,既保证覆盖度又保证准确度?.

[译]elasticsearch mapping

- - an74520的专栏
es的mapping设置很关键,mapping设置不到位可能导致索引重建. 请看下面各个类型介绍^_^. 每一个JSON字段可以被映射到一个特定的核心类型. JSON本身已经为我们提供了一些输入,支持 string,  integer/ long,  float/ double,  boolean, and  null..

Elasticsearch as Database - taowen - SegmentFault

- -
【北京上地】滴滴出行基础平台部招聘 Elasticsearch 与 Mysql binlog databus 开发工程师. 内推简历投递给: [email protected]. 推销Elasticsearch. 时间序列数据库的秘密(1)—— 介绍. 时间序列数据库的秘密(2)——索引.

ElasticSearch 2 的节点调优(ElasticSearch性能)

- - 行业应用 - ITeye博客
一个ElasticSearch集群需要多少个节点很难用一种明确的方式回答,但是,我们可以将问题细化成一下几个,以便帮助我们更好的了解,如何去设计ElasticSearch节点的数目:. 打算建立多少索引,支持多少应用. elasticsearch版本: elasticsearch-2.x. 需要回答的问题远不止以上这些,但是第五个问题往往是容易被我们忽视的,因为单个ElasticSearch集群有能力支持多索引,也就能支持多个不同应用的使用.

Elasticsearch:使用 Elasticsearch 进行语义搜索

- - 掘金 后端
在数字时代,搜索引擎在通过浏览互联网上的大量可用信息来检索数据方面发挥着重要作用. 此方法涉及用户在搜索栏中输入特定术语或短语,期望搜索引擎返回与这些确切关键字匹配的结果. 虽然关键字搜索对于简化信息检索非常有价值,但它也有其局限性. 主要缺点之一在于它对词汇匹配的依赖. 关键字搜索将查询中的每个单词视为独立的实体,通常会导致结果可能与用户的意图不完全一致.

elasticsearch的javaAPI之query

- - CSDN博客云计算推荐文章
elasticsearch的javaAPI之query API. the Search API允许执行一个搜索查询,返回一个与查询匹配的结果(hits). 它可以在跨一个或多个index上执行, 或者一个或多个types. 查询可以使用提供的 query Java API 或filter Java API.

Elasticsearch基础教程

- - 开源软件 - ITeye博客
转自:http://blog.csdn.net/cnweike/article/details/33736429.     Elasticsearch有几个核心概念. 从一开始理解这些概念会对整个学习过程有莫大的帮助.     接近实时(NRT).         Elasticsearch是一个接近实时的搜索平台.