词汇识别 #
词汇识别是文本分析的第一步:将文本拆分为可搜索的词项。不同语言的词汇识别方式差异很大,需要选择合适的分析器和分词器。
不同语言的挑战 #
英语 #
英语单词相对容易识别:单词之间通常以空格或标点分隔。但也有一些边界情况:
you're是一个单词还是两个?o'clock、cooperate、half-baked、eyewitness等复合词如何处理?
德语和荷兰语 #
这些语言会将独立的单词合并成长复合词,例如:
Weißkopfseeadler(white-headed sea eagle)
为了在查询 Adler(eagle)时也能匹配到 Weißkopfseeadler,需要将复合词拆分成词组。
亚洲语言 #
亚洲语言更复杂:
- 很多语言在单词、句子甚至段落之间没有空格
- 有些词可以用一个字表达,但同样的字在另一个字旁边时就是不同意思的长词的一部分
标准分析器 #
任何全文检索的 text 字段默认使用 standard 分析器。标准分析器包括:
- 分词器:
standard分词器 - 词元过滤器:
lowercase(小写转换)和stop(停用词,默认关闭)
标准分析器可以这样重新实现:
{
"type": "custom",
"tokenizer": "standard",
"filter": ["lowercase", "stop"]
}
标准分词器 #
standard 分词器基于 Unicode 文本分割算法,能够:
- 识别单词边界(空格、标点)
- 处理大多数欧洲语言
- 处理亚洲语言(虽然可能不够精确)
示例:
GET /_analyze
{
"tokenizer": "standard",
"text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}
输出:
[ The, 2, QUICK, Brown, Foxes, jumped, over, the, lazy, dog's, bone ]
可以看到:
Brown-Foxes被拆分为Brown和Foxesdog's被保留为一个词项(不会拆分)
语言特定的分析器 #
对于特定语言,Easysearch 提供了专门的分析器:
- 中文:需要中文分词器(如 IK 分词器)
- 日语:需要日语分词器(如 Kuromoji)
- 韩语:需要韩语分词器
- 德语:可以使用德语分析器处理复合词
ICU 分词器 #
对于需要更精确 Unicode 支持的语言,可以使用 ICU 分词器:
PUT /my_index
{
"settings": {
"analysis": {
"analyzer": {
"my_icu_analyzer": {
"tokenizer": "icu_tokenizer"
}
}
}
}
}
ICU 分词器能够:
- 更好地处理 Unicode 文本
- 支持更多语言的文本分割规则
- 处理变音符号和特殊字符
选择合适的分词器 #
选择分词器时需要考虑:
语言类型:
- 欧洲语言:
standard分词器通常足够 - 亚洲语言:需要语言特定的分词器
- 混合语言:可能需要自定义分析器
- 欧洲语言:
文本特点:
- 是否包含复合词
- 是否需要保留特殊字符
- 是否需要处理变音符号
查询需求:
- 是否需要精确匹配
- 是否需要模糊匹配
- 是否需要处理同义词
测试分词器 #
使用 _analyze API 测试分词器的效果:
GET /_analyze
{
"tokenizer": "standard",
"text": "The quick brown fox"
}
或者测试整个分析器:
GET /my_index/_analyze
{
"field": "title",
"text": "The quick brown fox"
}
小结 #
- 词汇识别是将文本拆分为词项的第一步
- 不同语言的词汇识别方式差异很大
standard分词器适合大多数欧洲语言- 亚洲语言需要语言特定的分词器
- 可以使用
_analyzeAPI 测试分词器的效果
下一步可以继续阅读: