Elasticsearch分词

本文深入探讨了Elasticsearch中的_analyze API,它用于分析字段或分词器如何处理和索引文本。标准分词器将英文文本如'QuickBrownFoxes!'拆分为独立的词项。而对于中文,IK分词器提供了ik_max_word和ik_smart两种模式,前者做最细粒度拆分,后者做最粗粒度拆分,适应不同的查询需求。通过示例展示了IK分词器对中文句子的分词结果。

_analyze用于分析field或者analyzer/tokenizer是如何分析和索引一段文字。
token: 索引中的词
position指明词在原文本中是第几个出现的
start_offset和end_offset表示词在原文本中占据的位置。

Analyzer 由三部分组成

• Character Filters:原始文本处理,如去除 html
首先,字符串按顺序通过每个字符过滤器 。他们的任务是在分词前整理字符串。一个字符过滤器可以用来去掉HTML,或者将 & 转化成 and。
• Tokenizer:按照规则切分为单词
其次,字符串被 分词器 分为单个的词条。一个 whitespace的分词器遇到空格和标点的时候,可能会将文本拆分成词条。
• Token Filters:对切分单词加工、小写、删除 stopwords,增加同义词
最后,词条按顺序通过每个 token 过滤器 。这个过程可能会改变词条,例如,lowercase token filter 小写化(将ES转为es)、stop token filter 删除词条(例如, 像 a, and, the 等无用词),或者synonym token filter 增加词条(例如,像 jump 和 leap 这种同义词)。

standard分词器

GET /_analyze
{
  "analyzer" : "standard",
  "text" : "Quick Brown Foxes!"
}

返回结果

{
  "tokens" : [
    {
      "token" : "quick",
      "start_offset" : 0,
      "end_offset" : 5,
      "type" : "<ALPHANUM>",
      "position" : 0
    },
    {
      "token" : "brown",
      "start_offset" : 6,
      "end_offset" : 11,
      "type" : "<ALPHANUM>",
      "position" : 1
    },
    {
      "token" : "foxes",
      "start_offset" : 12,
      "end_offset" : 17,
      "type" : "<ALPHANUM>",
      "position" : 2
    }
  ]
}

中文分词器

IK中文分词器地址:https://github.com/medcl/elasticsearch-analysis-ik

optional2需要jdk11,我使用optional1完成安装。

参照官网测试用例

GET /_analyze
{
  "analyzer" : "ik_max_word",
  "text" : "美国留给伊拉克的是个烂摊子吗"
}

返回预期结果

{
  "tokens" : [
    {
      "token" : "美国",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "CN_WORD",
      "position" : 0
    },
    {
      "token" : "留给",
      "start_offset" : 2,
      "end_offset" : 4,
      "type" : "CN_WORD",
      "position" : 1
    },
    {
      "token" : "伊拉克",
      "start_offset" : 4,
      "end_offset" : 7,
      "type" : "CN_WORD",
      "position" : 2
    },
    {
      "token" : "的",
      "start_offset" : 7,
      "end_offset" : 8,
      "type" : "CN_CHAR",
      "position" : 3
    },
    {
      "token" : "是",
      "start_offset" : 8,
      "end_offset" : 9,
      "type" : "CN_CHAR",
      "position" : 4
    },
    {
      "token" : "个",
      "start_offset" : 9,
      "end_offset" : 10,
      "type" : "CN_CHAR",
      "position" : 5
    },
    {
      "token" : "烂摊子",
      "start_offset" : 10,
      "end_offset" : 13,
      "type" : "CN_WORD",
      "position" : 6
    },
    {
      "token" : "吗",
      "start_offset" : 13,
      "end_offset" : 14,
      "type" : "CN_CHAR",
      "position" : 7
    }
  ]
}

ik分词器提供了2种analyzer,官网说明如下:
ik_max_word: 会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合,适合 Term Query;

ik_smart: 会做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”,适合 Phrase 查询。

### Elasticsearch 分词原理 Elasticsearch分词过程涉及将输入文本分解成更小的单元,即 tokens。这一操作对于提高搜索精度至关重要[^1]。具体来说,在索引阶段,当文档被提交给 Elasticsearch 时,会先通过指定的 Analyzer 对字段内容执行预处理工作;而在查询过程中,则会对用户的查询请求做同样的 tokenization 处理以便于后续匹配。 #### Analyzer 组件结构 Analyzer 主要由三部分构成: - **Character Filters**: 负责移除或转换字符; - **Tokenizer**: 将连续的文字流切割为单个词汇单位(tokens); - **Token Filters**: 进一步修改这些 tokens 或者增加新的 ones[^3]。 ### 常见内置分词器及其应用场景 为了适应不同类型的自然语言数据,Elasticsearch 提供了一系列标准分词器选项,包括但不限于 Standard Tokenizer, Whitespace Tokenizer 和 Keyword Tokenizer 等。每种 tokenizer 都有各自的特点以及适用范围,例如 Standard Tokenizer 可以很好地应对大多数西方文字的语言特性,而 Keyword Tokenizer 则适合用于不需要实际分割单词的情况,比如 IP 地址或者标签列表[^2]。 ### 自定义分词器配置实例 除了利用现成的选择外,还可以根据业务逻辑创建个性化的 analyzer 来优化搜索体验。下面是一个简单的例子展示如何设置一个新的中文分词方案: ```json PUT /my_index { "settings": { "analysis": { "analyzer": { "my_custom_analyzer": { "type": "custom", "tokenizer": "ik_max_word", "filter": ["lowercase"] } } } } } ``` 在此 JSON 片段中,“`ik_max_word`”代表了一个针对汉语设计的强大分词算法,它能识别并切分复杂的汉字组合。“`lowercase`”过滤器则用来统一大小写形式,从而增强跨平台的一致性和准确性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值