ElasticSearch是一个高效的分布式搜索引擎,其中分词器是它的核心组件之一,平常开发中选择一个合适的分词器可以很大程度上提高检索效率,所以特意花点时间快速了解ElasticSearch中各大常见的分词器,本文也将分别介绍ElasticSearch中常见的几大分词器的特点、适用场景,以及如何使用
推荐阅读:
- ElasticSearch快速入门_知识汲取者的博客-CSDN博客
分词器是在搜索引擎和文本处理中起关键作用的组件,它负责将文本切分成一个个有意义的词语,以建立索引或进行搜索和分析。
上面可能说的有一些太官方了,详细点说就是,ES搜索引擎是根据词条进行检索的,这里的词条相当于MySQL中的索引,是ElasticSearch能实现海量数据高效检索的核心,在MySQL中,如果我们不恰当的建立索引,就会影响数据库的查询性能,比如我们为区分度不大的字段建立索引,SQL优化器评测发现走索引性能和全表扫描的性能差不多,这时候就直接进行全表扫描了,此时索引就一点作用都没有了,同理这个分词也是一样的道理,他都目的也是将一个一句话分成若干个词条,以词条为索引,以此来提高检索的效率和检索的正确性。
再举一个实际的例子,比如这里有一句话“他们在商店买了一些苹果手机和一些苹果”,如果我们分词时将苹果手机进行拆分,我们搜索苹果手机,可能无法搜索出带有苹果手机的文档
他们 在 商店 买 一些 苹果 手机 和 一些 苹果
而一下的分词,则可以正确搜索出带有苹果手机的词条
他们 在 商店 买 了 一些 苹果手机 和 一些 苹果
方式一:创建索引时,通过映射直接指定分词器
PUT /your_index_name
{"mappings": {"properties": {"your_field_name": {"type": "text","analyzer": "your_analyzer_name"},// }}
}
方式二:修改索引时,通过修改映射修改分词器
PUT /your_index_name/_mapping
{"properties": {"your_field_name": {"type": "text","analyzer": "your_analyzer_name"},// }
}
注意:
standard
Standard Analyzer
、Whitespace Analyzer
、Simple Analyzer
、Keyword Analyzer
、Stop Analyzer
等分词器,其它分词器,比如:IK Analyzer
需要手动下载分词器主要由以下三部分组成
分词器 | 分词依据 | 特点 |
---|---|---|
Standard Analyzer | 空格、标点符号 | 小写化处理、过滤符号 |
Whitespace Analyzer | 空格 | 不进行小写化处理、保留所有字符 |
Simple Analyzer | 非字母(符号、数字) | 小写化处理、过滤符号、支持中文拼音分词 |
Keyword Analyzer | 无 | 将整个输入作为一个词条 |
Stop Analyzer | 空格 | 小写化处理、过滤停用词 |
IK Analyzer | 词典 | 中文分词 |
Edge NGram Analyzer | n-gram | 按指定步长进行分词 |
Pattern Analyzer | 正则匹配字符 | 较为灵活 |
Language Analyzer | 空格 | 支持多国语言 |
Custom Analyzer | 自定义 | 灵活 |
Standard Analyzer(默认):
standard
示例:
原始文本:"The quick brown fox jumps over the lazy dog."
分词结果:["the", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog"]
Whitespace Analyzer:
whitespace
示例:
原始文本:"The quick brown fox jumps over the lazy dog."
分词结果:["The", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog."]
Simple Analyzer:
类型: simple
特点:
适用场景:适用一些简单的中文分词
示例:
原始文本:"The quick brown fox jumps over the lazy dog."
分词结果:["the", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog"]
Keyword Analyzer:
keyword
示例:
原始文本:"The quick brown fox jumps over the lazy dog."
分词结果:["The quick brown fox jumps over the lazy dog."]
Stop Analyzer:
stop
示例:
原始文本:"The quick brown fox jumps over the lazy dog."
分词结果:["quick", "brown", "fox", "jumps", "over", "lazy", "dog"]
IK Analyzer:
详情请参考:
ik_max_word
:会将文本做最细粒度的拆分,会穷尽各种可能的组合,适合 Term Queryik_smart
:会做最粗粒度的拆分,不会对同一个词进行重复分词,适合 Phrase 查询示例:
原始文本:"中华人民共和国国歌"
ik_max_word分词结果:["中华人民共和国", "中华人民", "中华", "华人", "人民共和国", "人民", "人", "民", "共和国", "共和", "和", "国国", "国歌"]
ik_smart分词结果:["中华人民共和国", "国歌"]
ik分词器的使用步骤
plugins
文件夹)中NGram Analyzer:
详情参考:ElasticSearch之ngram分词器-CSDN博客
类型:
edge_ngram
:从单词的开头提取 n-gramngram
:在整个单词中提取 n-gram适用场景:适用于前缀搜索和搜索建议
示例:
原始文本:"I am Chinese."edge_ngram分词结果:
n=2(bigram): ["I am", "am Chinese."]
n=3(trigram): ["I am Chinese."]
n=4(four-gram): ["I am Chinese."]ngram分词结果:
n=2(bigram): ["I am", "am Chinese."]
n=3(trigram): ["I am Chinese."]
n=4(four-gram): ["I am Chinese."]
备注:
{"settings": {// 创建分词器"analysis": {"analyzer": {"my_edge_ngram_analyzer": {"tokenizer": "standard", // 指定分词器"filter": ["my_edge_ngram_filter"] // 指定词汇过滤器}},"filter": {"my_edge_ngram_filter": {"type": "edge_ngram","min_gram": 1, // 词汇最小长度为一个字符,注意:一个单词、数字、中文都是一个字符"max_gram": 10 // 词汇最大长度为10个字符}}}},"mappings": {"properties": {"content": {"type": "text","analyzer": "my_edge_ngram_analyzer" // 使用我们配置的分词器}}}
}
知识拓展:n-gram 概念
n-gram 是一种文本处理的方法,其中 “n” 表示包含的元素的数量。在自然语言处理和信息检索中,n-gram 通常指的是连续的 n 个单词(或字符)序列。
- Unigram(1-gram): 包含一个单词的序列。例如,对于句子 “The quick brown fox”,每个单词都是一个 unigram。
- Bigram(2-gram): 包含两个相邻单词的序列。例如,对于句子 “The quick brown fox”,bigrams 包括 “The quick”、“quick brown”、“brown fox”。
- Trigram(3-gram): 包含三个相邻单词的序列。例如,对于句子 “The quick brown fox”,trigrams 包括 “The quick brown”、“quick brown fox”。
这个 n 表示按照几个单词来进行划分
pattern
{"settings": {"analysis": {"analyzer": {"my_pattern_analyzer": {"type": "pattern","pattern": "\W+" // 正则表达式模式,表示使用非单词字符作为分隔符}}}},"mappings": {"properties": {"content": {"type": "text","analyzer": "my_pattern_analyzer"}}}
}
上诉配置的 Pattern Analyzer 与 Standard Analyzer的效果是一模一样的
english
:英语分词器french
:法语分词器{"mappings": {"properties": {"content": {"type": "text","analyzer": "english"}}}
}
原始文本:"The quick brown fox jumps over the lazy dog."
分词结果:["quick", "brown", "fox", "jumps", "over", "lazy", "dog"]
Custom Analyzer:
类型: custom
特点: 可以根据具体需求自定义分词器,包括指定分词器、字符过滤器、标记过滤器等。
适用场景:现有分词器不满足当前功能,或者想要实现更加高效且灵活的分词
实现自定义分词器的步骤:
Custom Analyzer
。Custom Analyzer
分配给相应的字段。示例:
在下面的示例中,
my_analyzer
是一个自定义的Custom Analyzer
,包含了一个 HTML 标签过滤器、标准分词器和小写过滤器。该分析器被应用于名为 “content” 的字段。实际上,你可以根据需求自定义各个组件,以满足你的分词需求。
{"settings": {"analysis": {// 指定字符过滤器"char_filter": {"my_char_filter": {"type": "html_strip" // 去除文本中的 HTML 标签的字符过滤器}},// 指定分词器"tokenizer": {"my_tokenizer": {"type": "standard" // 指定标准分词器,按照标准分词器进行分词}},// 指定词汇过滤器"filter": {"my_filter": {"type": "lowercase" // 小写化处理}},// 创建自定义分词器"analyzer": {"my_analyzer": {"type": "custom","char_filter": ["my_char_filter"],"tokenizer": "my_tokenizer","filter": ["my_filter"]}}}},"mappings": {"properties": {"content": { // 给 content 字段应用 自定义分词器"type": "text","analyzer": "my_analyzer"}}}
}
原始文本:<p>This is <strong>bold</strong> text.</p>
分词结果:["this", "is", "bold", "text"]
参考资料:
- Anatomy of an analyzer | Elasticsearch Guide 8.11| Elastic
- ElasticSearch 分词器,了解一下 - 知乎 (zhihu)
本文发布于:2024-01-28 18:04:44,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/17064362879257.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |