功能简介
在全文搜索引擎如OpenSearch和Elasticsearch中,分词器是其核心功能。分词器负责将输入的字符流分割成独立的词元,这些词元是后续搜索和索引操作的基础。通过分词,连续的文本被转换为一系列便于计算机处理的单元,从而实现全文搜索。
OpenSearch和Elasticsearch提供了一些默认的分词器,但是只支持英文分词,对中文分词不友好。
OpenSearch和Elasticsearch有相关的开源中文分词插件,如IK分词器和HanLP分词器。然而开源版本的中文分词器在处理中文文本时仍然会出现一些歧义问题或未登录词汇的情况,因此天翼云云搜索服务对中文分词进行了增强。
天翼云云搜索服务中的OpenSearch和Elasticsearch对HanLP分词器进行中文分词增强,这是对其文本处理和搜索能力的一项重要增强。通过增强中文分词能力,搜索引擎能够在处理中文文本时更加精准地分词,从而提升搜索结果的准确性和用户体验。
核心原理
在OpenSearch和Elasticsearch中,中文分词器负责将输入的中文文本(如文档内容)分割成独立的词元,处理后的词元被存储在Elasticsearch的倒排索引中,以便后续的搜索操作能够快速检索到相关文档。搜索阶段,用户输入的查询字符串同样需要经过分词器的处理,分词器将查询字符串分割成词元,这些词元将用于在倒排索引中查找匹配的文档。搜索过程可能会涉及多个词元的组合查询,搜索引擎会根据查询语句的语法和逻辑,执行相应的搜索算法来找到匹配的文档。中文分词器的选择和配置对搜索效果和性能具有重要影响。用户需要根据文本的语言、特点和需求,选择合适的分词器。
天翼云云搜索服务提供的中文分词器
IK分词器
天翼云云搜索服务中的IK分词器是开源分词器,包括最大化分词模式(ik_max_word)、最小化分词模式(ik_smart)。允许自定义词典,支持定制化的分词处理,适应特定场景和行业的需求。
IK插件包含2种分词器:ik_smart和 ik_max_word。
- ik_smart模式:智能分词模式,采用较为灵活的中文分词算法,能够对中文文本进行智能的切分,以保留尽可能多的语义信息。适用于一般的全文搜索、文本分析和检索需求。
- ik_max_word模式:最大化分词模式,会尽可能多地将文本切分成单个词语,从而获取尽可能多的候选词。适用于对文本进行细粒度的分析和处理。
HanLP分词器
HanLP分词器是源于一个开源且功能强大的HanLP自然语言处理工具包,它由一系列模型和算法组成。目前天翼云云搜索服务中的HanLP分词器是基于开源HanLP分词器对hanlp、hanlp_crf等分词器进行了一定程度的优化,以适应不同的场景。
目前HanLP插件提供hanlp、hanlp_crf、hanlp_nlp、hanlp_speed等分词器,针对不同的应用场景,可以选择使用不同的分词器。
- hanlp分词器,基于词典的分词。当需要快速处理大量文本,且对分词精度要求不是特别高时,词典分词是一个很好的选择。它侧重于分词速度,能够每秒处理数千万字符,非常适合对实时性要求较高的场景;在内存资源有限的环境下,词典分词由于其较低的内存占用,也是一个理想的选择。另外hanlp分词器经过优化分词效果也比较不错,适合通用的场景,平衡了分词精度和分词速度。
- hanlp_crf和hanlp_nlp分词器,基于模型的分词器。hanlp_crf和hanlp_nlp分词器在处理复杂文本结构时表现出色,能够准确识别并处理句子中的长距离依赖关系。由于其较强的泛化能力,在处理特定领域的文本时(如新闻、法律、医疗等),能够提供更全面、准确的文本分析结果。适用于对分词准确程度要求很高,不追求分词速度的场景下,且比较消耗内存资源。
- hanlp_speed,极速词典分词。在需要极快速度处理文本的场景下,极速词典分词是最佳选择,它通过优化词典结构和算法实现了超高的分词速度。在内存资源非常有限的环境下,极速词典分词由于其低内存占用特性而更具优势。适合追求分词速度,而对精度要求不是很高的情况下。
- hanlp_n_short和hanlp_dijkstra:构建词图并寻找最短路径的方式来实现分词,能够较好地识别并处理新词和未登录词。对于包含大量新词、缩写、专业术语等复杂文本,能够提供更准确的分词结果,效率不如词典分词,优于算法分词。
- hanlp_index和 ik_max_word类似:会尽可能多地将文本切分成单个词语,从而获取尽可能多的候选词。适用于对文本进行细粒度的分析和处理。
中文分词增强的优势
相比开源中文分词器,优化后的部分中文分词器在搜索结果上更具有优势。另外,天翼云云搜索服务中文分词增强模块内置了多种中文分词器,可以适应不同的场景,用户可以添加自定义词库来提高未登陆词的分词精度。
使用示例:
测试分词器分词效果:
GET _analyze
{
"text": "美国阿拉斯加州发生8.0级地震",
"analyzer": "hanlp"
}
返回结果:
{
"tokens": [{
"token": "美国",
"start_offset": 0,
"end_offset": 2,
"type": "nsf",
"position": 0
}, {
"token": "阿拉斯加州",
"start_offset": 2,
"end_offset": 7,
"type": "nsf",
"position": 1
}, {
"token": "发生",
"start_offset": 7,
"end_offset": 9,
"type": "v",
"position": 2
}, {
"token": "8.0",
"start_offset": 9,
"end_offset": 12,
"type": "m",
"position": 3
}, {
"token": "级",
"start_offset": 12,
"end_offset": 13,
"type": "q",
"position": 4
}, {
"token": "地震",
"start_offset": 13,
"end_offset": 15,
"type": "n",
"position": 5
}]
}
使用其他分词器可以在analyzer字段指定。
创建mappings的时候可以在字段中指定分词器:
PUT demo
{
"mappings": {
"properties": {
"field1": {
"type": "text",
"analyzer": "hanlp"
}
}
}
}
返回结果:
{
"acknowledged": true,
"shards_acknowledged": true,
"index": "demo"
}