美文网首页程序员技术干货
Elasticsearch中的分析器和IK分词器插件

Elasticsearch中的分析器和IK分词器插件

作者: GhostStories | 来源:发表于2017-09-18 15:54 被阅读1202次

    欢迎访问我的博客查看原文:http://wangnan.tech

    一些概念

    Token(词元)

    全文搜索引擎会用某种算法对要建索引的文档进行分析, 从文档中提取出若干Tokenizer(分词器)

    Tokenizer(分词器)

    这些算法叫做Tokenizer(分词器)

    Token Filter(词元处理器)

    这些Token会被进一步处理, 比如转成小写等, 这些处理算法被称为TokenFilter(词元处理器)

    Term(词)

    被处理后的结果被称为Term(词)

    Character Filter(字符过滤器)

    文本被Tokenizer处理前可能要做一些预处理, 比如去掉里面的HTML标记, 这些处理的算法被称为Character Filter(字符过滤器)

    Analyzer(分析器)

    这整个的分析算法被称为Analyzer(分析器)

    Analyzer(分析器)由Tokenizer(分词器)和Filter(过滤器)组成

    图片

    image

    ES中的分词器

    ES内置分析器

    • standard analyzer
    • simple analyzer
    • stop analyzer
    • keyword analyzer
    • pattern analyzer
    • language analyzers
    • snowball analyzer
    • custom analyzer

    ES内置分析器

    • standard tokenizer
    • edge ngram tokenizer
    • keyword tokenizer
    • letter analyzer
    • lowercase analyzer
    • ngram analyzers
    • whitespace analyzer
    • pattern analyzer
    • uax email url analyzer
    • path hierarchy analyzer

    ES内置过滤器

    • standard filter
    • ascii folding filter
    • length filter
    • lowercase filter
    • ngram filter
    • edge ngram filter
    • porter stem filter
    • shingle filter
    • stop filter stop
    • word delimiter filter
    • stemmer token filter
    • stemmer override filter
    • keyword marker filter
    • keyword repeat filter
    • kstem filter
    • snowball filter
    • phonetic filter
    • synonym filter
    • compound word filter
    • reverse filter
    • elision filter
    • truncate filter
    • unique filter
    • pattern capture filter
    • pattern replace filter
    • trim filter
    • limit token count filter
    • hunspell filter
    • common grams filter
    • normalization filter

    ES内置的character filter

    • mapping char filter 根据配置的映射关系替换字符
    • html strip char filter 去掉HTML元素
    • pattern replace char filter 用正则表达式处理字符串

    自定义分析器

    ES允许用户通过配置文件elasticsearch.yml自定义分析器Analyzer

        index:
               analysis:
                         analyzer:
                                myAnalyzer:
                                       tokenizer: standard
                                       filter: [standard, lowercase, stop]
    

    也可以使用第三方分析器,比如IKAnalyzer

    IKAnalyzer

    IK简介

    IK Analyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始, IKAnalyzer已经推出了4个大版本。最初,它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词组件。从3.0版本开 始,IK发展为面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现。在2012版本中,IK实现了简单的分词 歧义排除算法,标志着IK分词器从单纯的词典分词向模拟语义分词衍化。

    IK Analyzer 2012特性

    1.采用了特有的“正向迭代最细粒度切分算法“,支持细粒度和智能分词两种切分模式;

    2.在系统环境:Core2 i7 3.4G双核,4G内存,window 7 64位, Sun JDK 1.6_29 64位 普通pc环境测试,IK2012具有160万字/秒(3000KB/S)的高速处理能力。

    3.2012版本的智能分词模式支持简单的分词排歧义处理和数量词合并输出。

    4.采用了多子处理器分析模式,支持:英文字母、数字、中文词汇等分词处理,兼容韩文、日文字符

    5.优化的词典存储,更小的内存占用。支持用户词典扩展定义。特别的,在2012版本,词典支持中文,英文,数字混合词语。

    安装

    1. 通过git clone https://github.com/medcl/elasticsearch-analysis-ik,下载分词器源码
    2. 执行命令:mvn clean package,打包生成elasticsearch-analysis-ik-1.2.5.jar
    3. 将这个jar拷贝到ES_HOME/plugins/analysis-ik目录下面,如果没有该目录,则先创建该目录
    4. ES_HOME/config/elasticsearch.yml文件在文件最后加入如下内容:
    index:
      analysis:                   
        analyzer:      
          ik:
              alias: [ik_analyzer]
              type: org.elasticsearch.index.analysis.IkAnalyzerProvider
          ik_max_word:
              type: ik
              use_smart: false
          ik_smart:
              type: ik
              use_smart: true
    index.analysis.analyzer.default.type: ik
    

    测试

    1. 创建一个索引,名为index。
    curl -XPUT http://localhost:9200/index
    
    1. 为索引index创建mapping
    curl -XPOST http://localhost:9200/index/fulltext/_mapping -d'
    {
        "fulltext": {
                 "_all": {
                "analyzer": "ik"
            },
            "properties": {
                "content": {
                    "type" : "string",
                    "boost" : 8.0,
                    "term_vector" : "with_positions_offsets",
                    "analyzer" : "ik",
                    "include_in_all" : true
                }
            }
        }
    }'
    
    1. 测试
    curl 'http://localhost:9200/index/_analyze?analyzer=ik&pretty=true' -d '
    {
    "text":"世界如此之大"
    }'
    

    4.显示结果

    {
      "tokens" : [ {
        "token" : "text",
        "start_offset" : 4,
        "end_offset" : 8,
        "type" : "ENGLISH",
        "position" : 1
      }, {
        "token" : "世界",
        "start_offset" : 11,
        "end_offset" : 13,
        "type" : "CN_WORD",
        "position" : 2
      }, {
        "token" : "如此",
        "start_offset" : 13,
        "end_offset" : 15,
        "type" : "CN_WORD",
        "position" : 3
      }, {
        "token" : "之大",
        "start_offset" : 15,
        "end_offset" : 17,
        "type" : "CN_WORD",
        "position" : 4
      } ]
    }
    

    欢迎关注我的微信订阅号:



    欢迎关注我的开发者头条独家号搜索:269166

    相关文章

      网友评论

        本文标题:Elasticsearch中的分析器和IK分词器插件

        本文链接:https://www.haomeiwen.com/subject/uhsbsxtx.html