`
m635674608
  • 浏览: 5052885 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

elasticsearch 分词器配置注意事项

 
阅读更多
//插件代码
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);
                    }
                }
            }
分享到:
评论

相关推荐

    ik分词器7.17.10

    ik分词器是为Elasticsearch(ES)设计的一款高效、可扩展的中文分词工具,它能有效地将中文文本拆分成一个个独立的词语,便于后续的索引和查询操作。ik分词器7.17.10是该工具的一个版本,适用于Elasticsearch 7.x...

    elasticsearch数据库下载、配置、使用案例PPT模板

    ### Elasticsearch数据库的下载、配置与使用案例 #### 一、Elasticsearch数据库的下载与安装 **1.1 下载与解压** - **下载Elasticsearch:** - **官方网站下载:** 访问Elasticsearch官方网站...

    elasticsearch-analysis-ik-6.2.4(编译版)

    在本压缩包 "elasticsearch-analysis-ik-6.2.4(编译版)" 中,包含了适用于 Elasticsearch 6.2.4 版本的 IK 分词器编译后的版本。这个版本经过 MAVEN 重新打包,确保了与 Elasticsearch 的兼容性,用户可以直接将其...

    最新版windows elasticsearch-7.10.0-windows-x86_64.zip

    13. **安全注意事项**: - 不要在生产环境中使用默认的配置,应设置强密码并限制网络访问。 - 定期更新Elasticsearch以获取最新的安全补丁。 理解并掌握这些知识点将帮助你有效地在Windows环境下部署和管理...

    elasticsearch框架的安装

    - **配置项注意事项**: - 每行内容顶格写,不允许有前导空格。 - “:”后面必须有一个空格。 - 集群名称必须一致。 - 节点名称自定义。 - 网络配置需指定当前服务器IP地址,端口默认为9200。 - 关闭`...

    ElasticSearch+IKAnalyzer整合版 解压即用

    IKAnalyzer是专门为中文处理设计的分词器,它能够有效地提高中文在Elasticsearch中的检索效果。 **一、Elasticsearch基础** Elasticsearch的核心功能包括索引、搜索、聚合和实时分析。它通过将数据分布在多个节点...

    ElasticSearch安装说明

    本文介绍了 ElasticSearch 的两个版本(6.7.0 和 7.6.0)的安装步骤及注意事项,包括 JDK 的安装与配置、ES 的下载与安装流程,以及解决启动过程中可能出现的警告信息的方法。遵循上述步骤,可以帮助用户顺利完成 ...

    elasticSearch6安装教程.docx

    Elasticsearch 是一个开源的全文搜索引擎,它基于 Lucene 库,但提供了更高级别的API和分布式、容错性的功能。在Elasticsearch 6版本中,...遵循上述步骤和注意事项,可以有效地在Linux上部署和管理Elasticsearch实例。

    elasticsearch-6.3.2附带ik和pinyin插件

    在配置文件`elasticsearch.yml`中,可能需要添加或调整相关设置,比如IK插件的分词器配置,Pinyin插件的启用等。 4. 使用示例 - 对于IK插件,可以在创建索引时指定分词器类型,如: ``` PUT /my_index { ...

    ElasticSearch2.0安装 & 1.7.2升级日志

    - 修改配置文件 elasticsearch.yml 添加 ik 分词器配置。 - 重启 Elasticsearch 服务。 #### 三、ES数据同步feeder安装(可选) 这部分文档未给出具体实现细节,但一般来说,如果需要实现 Elasticsearch 数据...

    elasticsearch-head-master.zip

    3. **配置Elasticsearch**:确保Elasticsearch已正确安装,并且配置文件(如`elasticsearch.yml`)中允许远程访问。 4. **连接Elasticsearch**:Elasticsearch-Head默认会连接本地的9200端口,如果ES集群在其他主机...

    Relevant search with applications for Solr and Elasticsearch

    - **实战技巧**:提供了一系列实战技巧,比如如何通过调整分词配置来优化搜索结果的相关性。 5. **多字段搜索的基础** - **概念介绍**:第五章“Basicmultifieldsearch”介绍了多字段搜索的概念,即在一个查询中...

    elasticsearch自学笔记

    - **插件来源:** 从官方GitHub仓库下载与Elasticsearch版本匹配的IK分词器插件。 - **安装路径:** 将下载的IK插件压缩文件放置于`/topdlp/bin/elasticsearch-6.6.0/plugins/ik`目录下,并解压。 #### 五、常见...

    elasticsearch-7.8.0版本windows版本安装包

    四、注意事项 1. 内存分配:确保为Elasticsearch分配足够的堆内存,通常建议不超过机器物理内存的50%。 2. 防火墙设置:如果需要远程访问,记得开放9200(HTTP)和9300(Transport)端口。 3. 单节点运行:Windows...

    Jakes - 基于ES的音乐搜索引擎

    Jakes 是一个专门针对音乐搜索而设计的搜索引擎,其核心构建技术依托于 Elasticsearch(简称 ES)。该系统旨在解决大规模音乐数据的高效检索问题,并提供高质量的搜索体验。本文将详细介绍 Jakes 的发展历程、关键...

    关于IKAnalyzer3.2.8扩展词典配置的个人心得和意见

    此外,遵循上述步骤和注意事项,不仅能够解决常见的配置问题,还能进一步优化分词效果,更好地满足各种应用场景的需求。希望本文分享的内容能为大家提供一定的参考价值。如果有任何疑问或需要进一步交流,请随时联系...

    常用中间件安装部署手册

    - **IK分词器**:Elasticsearch的中文分词插件,提高中文搜索的准确性。 - **Logstash**:日志收集、处理和转发工具,负责从各种来源收集日志并发送至Elasticsearch。 每个中间件的安装过程都有特定的步骤和注意...

    PHP实例开发源码-八克小说搜索引擎 php版.zip

    在使用【使用须知.txt】和【132699121984823089】这两个文件时,前者可能包含了关于源码的使用说明和注意事项,后者可能是项目的配置文件、日志文件或其他重要资源。具体用途需要根据文件内容来确定。学习和分析这个...

    tika读取文件专用包

    - **集成其他库**:Tika可与其他Java库如Solr、Elasticsearch等集成,实现内容索引或搜索。 5. **示例代码**: ```java import org.apache.tika.Tika; import org.apache.tika.metadata.Metadata; import org....

    java_lucene_in_action教程完整版.rar

    8. **分布式搜索**:如果需要处理大量数据,你将学习如何使用Solr或Elasticsearch这样的分布式搜索平台,它们基于Lucene构建,提供了更强大的集群管理功能。 9. **实战项目**:通过实际案例,将所学知识应用到实际...

Global site tag (gtag.js) - Google Analytics