ElasticSearch自定义分析器-集成结巴分词插件

关于结巴分词 ElasticSearch 插件:

https://github.com/huaban/elasticsearch-analysis-jieba

该插件由huaban开发。支持Elastic Search 版本<=2.3.5。

结巴分词分析器

结巴分词插件提供3个分析器:jieba_index、jieba_search和jieba_other。

  1. jieba_index: 用于索引分词,分词粒度较细;
  2. jieba_search: 用于查询分词,分词粒度较粗;
  3. jieba_other: 全角转半角、大写转小写、字符分词;

使用jieba_index或jieba_search分析器,可以实现基本的分词效果。

以下是最小配置示例:

{
    "mappings": {
        "test": {
            "_all": {
                "enabled": false
            },
            "properties": {
                "name": {
                    "type": "string",
                    "analyzer": "jieba_index",
                    "search_analyzer": "jieba_index"
                }
            }
        }
    }
}

在生产化境中,因为业务的需要,需要考虑实现以下功能:

  1. 支持同义词;
  2. 支持字符过滤器;

结巴插件提供的分析器jieba_index、jieba_search无法实现以上功能。

自定义分析器

当jieba_index、jieba_search分析器不满足生成环境的需求时,我们可以使用自定义分析器来解决以上问题。

分析器是由字符过滤器,分词器,词元过滤器组成的。

一个分词器允许包含多个字符过滤器+一个分词器+多个词元过滤器。

因业务的需求,我们需要使用映射字符过滤器来实现分词前某些字符串的替换操作。如将用户输入的c#替换为csharp,c++替换为cplus。

下面逐一介绍分析器各个组成部分。

1. 映射字符过滤器Mapping Char Filter

这个是Elastic Search内置的映射字符过滤器,位于settings –> analysis -> char_filter下:

PUT /my_index
{
    "settings": {
        "analysis": {
            "char_filter": {
                "mapping_filter": {
                    "type": "mapping",
                    "mappings": [
                      "c# => csharp",
                      "c++ => cplus"
                  ]
                }
            }
        }
    }
}

也可以通过文件载入字符映射表。

PUT /my_index
{
    "settings": {
        "analysis": {
            "char_filter": {
                "mapping_filter": {
                    "type": "mapping",
                    "mappings_path": "mappings.txt"
                }
            }
        }
    }
}

文件默认存放config目录下,即config/ mappings.txt。

2. 结巴分词词元过滤器JiebaTokenFilter

JiebaTokenFilter接受一个SegMode参数,该参数有两个可选值:Index和Search。

我们预先定义两个词元过滤器:jieba_index_filter和jieba_search_filter。

PUT /my_index
{
    "settings": {
        "analysis": {
            "filter": {
                "jieba_index_filter": {
                    "type": "jieba",
                    "seg_mode": "index"
                },
                "jieba_search_filter": {
                    "type": "jieba",
                    "seg_mode": "search"
                }
            }
        }
    }
}

这两个词元过滤器将分别用于索引分析器和查询分析器。

3. stop 停用词词元过滤器

因分词词元过滤器JiebaTokenFilter并不处理停用词。因此我们在自定义分析器时,需要定义停用词词元过滤器来处理停用词。

Elastic Search提供了停用词词元过滤器,我们可以这样来定义:

PUT /my_index
{
    "settings": {
        "analysis": {
            "filter": {
                "stop_filter": {
                    "type":       "stop",
                    "stopwords": ["and", "is", "the"]
                }
            }
        }
    }
}

也可以通过文件载入停用词列表

PUT /my_index
{
    "settings": {
        "analysis": {
            "filter": {
                "stop_filter": {
                    "type": "stop",
                    "stopwords_path": "stopwords.txt"
                }
            }
        }
    }
}

文件默认存放config目录下,即config/ stopwords.txt。

4. synonym 同义词词元过滤器

我们使用ElasticSearch内置同义词词元过滤器来实现同义词的功能。

PUT /my_index
{
    "settings": {
        "analysis": {
            "filter": {
                "synonym_filter": {
                    "type": "synonym",
                    "stopwords": [
                      "中文,汉语,汉字"
                  ]
                }
            }
        }
    }
}

如果同义词量比较大时,推荐使用文件的方式载入同义词库。

PUT /my_index
{
    "settings": {
        "analysis": {
            "filter": {
                "synonym_filter ": {
                    "type": "synonym",
                    "stopwords_path": "synonyms.txt"
                }
            }
        }
    }
}

5. 重新定义分析器jieba_index和jieba_search

Elastic Search支持多级分词,我们使用whitespace分词作为分词器;并在词元过滤器加入定义好的Jiebie分词词元过滤器:jieba_index_filter和jieba_search_filter。

PUT /my_index
{
    "settings": {
        "analysis": {
            "analyzer": {
                "jieba_index": {
                    "char_filter": [
                      "mapping_filter"
                  ],
                    "tokenizer": "whitespace",
                    "filter": [
                      "jieba_index_filter",
                      "stop_filter",
                      "synonym_filter"
                  ]
                },
                "jieba_search": {
                    "char_filter": [
                      "mapping_filter"
                  ],
                    "tokenizer": "whitespace",
                    "filter": [
                      "jieba_search_filter",
                      "stop_filter",
                      "synonym_filter"
                  ]
                }
            }
        }
    }
}

注意,上面分析器的命名依然使用jieba_index和jieba_search,以便覆盖结巴分词插件提供的分析器。

当存在多个同名的分析器时,Elastic Search会优先使用索引配置中定义的分析器。

这样在代码调用层面便无需再更改。

下面是完整的配置:

PUT /my_index
{
    "settings": {
        "analysis": {
            "char_filter": {
                "mapping_filter": {
                    "type": "mapping",
                  "mappings_path": "mappings.txt"
                }
            }
            "filter": {
                "synonym_filter ": {
                    "type": "synonym",
                    "stopwords_path": "synonyms.txt"
                },
                "stop_filter": {
                    "type": "stop",
                    "stopwords_path": "stopwords.txt"
                },
                "jieba_index_filter": {
                    "type": "jieba",
                    "seg_mode": "index"
                },
                "jieba_search_filter": {
                    "type": "jieba",
                    "seg_mode": "search"
                }
            }
            "analyzer": {
                "jieba_index": {
                    "char_filter": [
                      "mapping_filter"
                  ],
                    "tokenizer": "whitespace",
                    "filter": [
                      "jieba_index_filter",
                      "stop_filter",
                      "synonym_filter"
                  ]
                },
                "jieba_search": {
                    "char_filter": [
                      "mapping_filter"
                  ],
                    "tokenizer": "whitespace",
                    "filter": [
                      "jieba_search_filter",
                      "stop_filter",
                      "synonym_filter"
                  ]
                }
            }
        }
    }
}

参考资料:

https://www.elastic.co/guide/en/elasticsearch/reference/2.3/index.html

http://www.tuicool.com/articles/eUJJ3qF

时间: 2024-10-17 11:49:57

ElasticSearch自定义分析器-集成结巴分词插件的相关文章

在ElasticSearch中使用 IK 中文分词插件

我这里集成好了一个自带IK的版本,下载即用, https://github.com/xlb378917466/elasticsearch5.2.include_IK 添加了IK插件意味着你可以使用ik_smart(最粗粒度的拆分)和ik_max_word(最细粒度的拆分)两种analyzer. 你也可以从下面这个地址获取最新的IK源码,自己集成, https://github.com/medcl/elasticsearch-analysis-ik, 里面还提供了使用说明,可以很快上手. 一般使用

Elasticsearch安装中文分词插件ik

Elasticsearch默认提供的分词器,会把每个汉字分开,而不是我们想要的根据关键词来分词.例如: curl -XPOST "http://localhost:9200/userinfo/_analyze?analyzer=standard&pretty=true&text=我是中国人" 我们会得到这样的结果: { tokens: [ { token: text start_offset: 2 end_offset: 6 type: <ALPHANUM>

Elasticsearch 自定义多个分析器

分析器(Analyzer) Elasticsearch 无论是内置分析器还是自定义分析器,都由三部分组成:字符过滤器(Character Filters).分词器(Tokenizer).词元过滤器(Token Filters). 分析器Analyzer工作流程: Input Text => Character Filters(如果有多个,按顺序应用) => Tokenizer => Token Filters(如果有多个,按顺序应用) => Output Token 字符过滤器(C

Elasticsearch 中文分词插件 jcseg 安装 (Ubuntu 14.04 下)

搜索可以说是开发中很常见的场景了,同样这次也一样... 之前的组合多数是选择 Mysql + Sphinx ,这次因为工作原因不再使用这种组合,虽然是老牌组合,但是确实限制诸多,而且每次配环境也是个问题,挺烦的...这次就尝试使用 Elasticsearch + Jcseg ,因为在文档检索方面 elasticsearch 做的相当不错,但是对中文环境来说就差一个很好的中文分词器,还好,国内好的中文分词器也有蛮多,但是我个人还是比较推荐 Jcseg . 好了,废话不多扯. 版本说明: elast

ElasticSearch安装ik分词插件

一.IK简介 IK Analyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包.最初,它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词组件.从3.0版本开 始,IK发展为面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现.在2012版本中,IK实现了简单的分词 歧义排除算法,标志着IK分词器从单纯的词典分词向模拟语义分词衍化. 二.安装IK分词插件 1.获取分词的依赖包 通过git clone https://g

Elasticsearch 集成IK分词器

我个人最喜欢使用IK分词,确实很方便,并且更新也快,这里做个简单介绍吧 分词插件IK 插件安装 1. 下载https://github.com/medcl/elasticsearch-analysis-ik 2. 解压进入目录执行"mvn clean package",生成target目录. 3. 解压后将config/ik目录复制到你的elasticsearch主目录的config目录下 4. 编辑config/elasticsearch.yml,在文件末尾添加下面内容(不能有tab

elasticsearch分词插件的安装

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

ElasticSearch:分析器

ElasticSearch入门 第七篇:分析器 这是ElasticSearch 2.4 版本系列的第七篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 ElasticSearch入门 第三篇:索引 ElasticSearch入门 第四篇:使用C#添加和更新文档 ElasticSearch入门 第五篇:使用C#查询文档 ElasticSearch入门 第六篇:复合数据类型--数组,对象和嵌套 Elasti

Elasticsearch是一个分布式可扩展的实时搜索和分析引擎,elasticsearch安装配置及中文分词

http://fuxiaopang.gitbooks.io/learnelasticsearch/content/  (中文) 在Elasticsearch中,文档术语一种类型(type),各种各样的类型存在于一个索引中.你也可以通过类比传统的关系数据库得到一些大致的相似之处: 关系数据库 ⇒ 数据库 ⇒ 表 ⇒ 行 ⇒ 列(Columns) Elasticsearch ⇒ 索引 ⇒ 类型 ⇒ 文档 ⇒ 字段(Fields)一个Elasticsearch集群可以包含多个索引(数据库),也就是说其