ElasticSearch:为中文分词器增加对英文的支持(让中文分词器可以处理中英文混合文档)

来源:互联网 发布:js定位当前地理位置 编辑:程序博客网 时间:2024/04/24 14:39

本文地址,需转载请注明出处:

http://blog.csdn.net/hereiskxm/article/details/47441911


当我们使用中文分词器的时候,其实也希望它能够支持对于英文的分词。试想,任何一个存储文字的字段都有可能是中英文夹杂的。


我们的项目中使用IKAnalyzer作为中文分词器,它在处理文档过程中遇到英文时,利用空格和标点将英文单词取出来,同时也会对其转全小写处理。其实这和真正的英文分词已经很接近了,只有一墙之隔:词干提取。一个真正的英文分词器除了分割提取单词和全小写处理以外,还会把单词回溯成词根。

比如说有一个句子:

I like cats!

它的正确分词为:

[i, like, cat]

词根化是一个英文分词器需要具备的功能。IKAnalyzer正是缺少了这点,它对例句的处理结果会是:[i, like, cats],这显然不是我们想要的:我们希望用 “cat”“cats” 都能搜索出这个句子,而不是非得用“cats” 才能搜到。


分析一下analyzer的内部逻辑:

Analyzer 的内部就是一条流水线

  • Step 1 字符过滤(Character filter)
  • Step 2 分词 (Tokenization)
  • Step 3 Token 过滤(Token filtering)

Elasticsearch 已经默认构造了 8个 Analyzer。若无法满足我们的需求,可以通过「Setting API」构造 Analyzer。


通过构造analyzer,我们可以对IK中文分词器做一些修改,让它实现回溯词根。

{
  "settings": {
    "analysis": {
      "analyzer": {
        "optimizeIK": {
          "type": "custom",
          "tokenizer": "ik",
          "filter": [
            "stemmer"
          ]

        }
      }
    }
  }
}

我们新建了一个分析器,它使用ik作为分词器,使用stemmer作为过滤器。stemmer是elasticsearch自带的一个提取词干的算法,类似的还有snowball,都支持多种语言,有兴趣可以作比较。它将在ik对文档完成分词之后,将其中的英文单词做提取词干处理。

测试一下:

-POST   {index_name}/_analyze?pretty&analyzer=optimizeIK

"I like cats"

返回结果:

{

  • "tokens": [
    • {
      • "token": "i",
      • "start_offset": 1,
      • "end_offset": 2,
      • "type": "ENGLISH",
      • "position": 1
      },
    • {
      • "token": "like",
      • "start_offset": 3,
      • "end_offset": 7,
      • "type": "ENGLISH",
      • "position": 2
      },
    • {
      • "token": "cat",
      • "start_offset": 8,
      • "end_offset": 12,
      • "type": "ENGLISH",
      • "position": 3
      }
    ]
}

至此,optimizeIK分析器同时拥有了中文+外文分词的功能。


如果你想把这个分析器设成该index的默认分析器,给它的命名叫default即可。


欢迎交流。

0 0
原创粉丝点击