# 多语言搜索技巧
本文我们将讨论如何在 Typesense 集合中处理特定语言的文本内容。我们将涵盖以下内容:
# 基础语言配置
要启用特定语言的文本处理功能,在定义集合模式时,可以通过字段定义中的 locale
参数指定语言:
{
"name": "posts",
"fields": [
{ "name": "title", "type": "string", "locale": "vi" },
{ "name": "description", "type": "string", "locale": "en" }
]
}
每个字段都可以有自己的语言设置,这样您就可以在同一文档中处理多语言内容。
# 默认行为与英文文本
当字段没有指定语言时,Typesense 会默认将其视为英文(en
)。这会产生以下重要影响:
- 对于默认的英文字段,欧洲语言中的变音符号(重音标记)会自动被移除
- 对于非英语语言,由于使用了 ICU(国际 Unicode 组件)分词,变音符号会被保留
这会以重要方式影响搜索行为:
- 当搜索保留变音符号的字段时,带有精确重音符号的匹配项会被优先考虑
- 由于拼写容错机制,如果找不到精确的重音匹配,会匹配不带重音的版本
- 为了获得最佳匹配效果,在决定是否保留变音符号时,应考虑用户可能的搜索模式
# 语言代码支持
Typesense 支持任何有效的两字母 ISO 639-1 语言代码 (opens new window)。这意味着您不仅限于常见文档中列出的语言,还可以使用任何标准语言代码,例如:
vi
表示越南语id
表示印度尼西亚语ms
表示马来语nl
表示荷兰语pl
表示波兰语- 等等
locale 参数接受任何有效的 ISO 639-1 代码,并将使用该语言对应的 ICU 规则进行处理。
# 工作原理
当您指定 locale 时:
- Typesense 使用 ICU 库进行语言处理
- 两字母代码直接传递给 ICU 的 locale 处理器
- 应用适当的语言规则进行分词和文本处理
# 设置 Locale
{
"fields": [
{ "name": "title", "type": "string", "locale": "ANY-VALID-ISO-CODE" }
]
}
其中 ANY-VALID-ISO-CODE
可以是任何标准的两字母语言代码。
# 常用语言
虽然任何 ISO 639-1 代码都适用,但以下是一些常用语言及其对应代码:
语言 | 代码 | 备注 |
---|---|---|
阿拉伯语 | ar | 从右向左书写 |
中文 | zh | 支持简体和繁体 |
荷兰语 | nl | |
英语 | en | 未指定语言时的默认选项 |
法语 | fr | |
德语 | de | |
印地语 | hi | |
印尼语 | id | |
意大利语 | it | |
日语 | ja | |
韩语 | ko | |
马来语 | ms | |
波兰语 | pl | |
葡萄牙语 | pt | |
俄语 | ru | 西里尔字母 |
希腊语 | el | 西里尔字母 |
西班牙语 | es | |
泰语 | th | |
土耳其语 | tr | |
越南语 | vi |
# 语言特定功能
不同语系会获得专门的处理:
# 基于脚本的语言特性
中日韩语言 (Chinese, Japanese, Korean)
- 无空格分词处理
- 字符变体处理
从右到左书写语言 (阿拉伯语, 希伯来语)
- 正确的文本方向处理
- 特殊字符规范化
含特殊字符的语言
- 变音符号处理
- 特殊字符规范化
- 正确的排序规则
# 分词处理
部分语言具有特殊的分词处理方式:
- 泰语:词间无空格,需要特殊的分词规则
- 日语:汉字与假名混合文本的分词
- 越南语:正确处理音调符号和复合词
- 中文:基于字符的分词及变体处理
# 高级分词选项
# 使用 pre_segmented_query
自定义分词
对于具有复杂词边界或需要更精细控制分词的语言,Typesense 提供了 pre_segmented_query
参数。该功能允许您:
- 为索引和查询使用自定义分词器
- 让 Typesense 仅按空格分割,而不应用默认分词规则
这在以下场景特别有用:
- 中文等中日韩语言,基于机器学习的分词可能更准确
- 具有复杂复合词的语言
- 特定领域的分词需求
使用示例:
{
"q": "预分词的查询",
"pre_segmented_query": true
}
使用此功能时请确保:
- 索引分词方式与查询分词方式保持一致
- 索引内容和查询中的分词均以空格分隔
- 保持分词方法的一致性
# 最佳实践
始终指定语言环境(如果字段不是英文)
{ "fields": [ { "name": "title_vi", "type": "string", "locale": "vi" }, { "name": "title_th", "type": "string", "locale": "th" } ] }
字段命名规范
对于多语言内容,在字段名中包含语言代码:{ "title_en": "English Title", "title_vi": "Tiêu đề tiếng Việt", "title_th": "ชื่อเรื่องภาษาไทย" }
考虑变音符号处理
对于欧洲语言,需要考虑用户是否可能使用带或不带变音符号的形式进行搜索。
自定义分词
对于默认分词效果可能不理想的语言,考虑使用
pre_segmented_query
参数。
← 常见数据类型搜索技巧 数据过滤技巧 →