# 多语言搜索技巧

本文我们将讨论如何在 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 时:

  1. Typesense 使用 ICU 库进行语言处理
  2. 两字母代码直接传递给 ICU 的 locale 处理器
  3. 应用适当的语言规则进行分词和文本处理

# 设置 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 参数。该功能允许您:

  1. 为索引和查询使用自定义分词器
  2. 让 Typesense 仅按空格分割,而不应用默认分词规则

这在以下场景特别有用:

  • 中文等中日韩语言,基于机器学习的分词可能更准确
  • 具有复杂复合词的语言
  • 特定领域的分词需求

使用示例:

{
  "q": "预分词的查询",
  "pre_segmented_query": true
}

使用此功能时请确保:

  • 索引分词方式与查询分词方式保持一致
  • 索引内容和查询中的分词均以空格分隔
  • 保持分词方法的一致性

# 最佳实践

  1. 始终指定语言环境(如果字段不是英文)

    {
      "fields": [
        { "name": "title_vi", "type": "string", "locale": "vi" },
        { "name": "title_th", "type": "string", "locale": "th" }
      ]
    }
    
  2. 字段命名规范
    对于多语言内容,在字段名中包含语言代码:

    {
      "title_en": "English Title",
      "title_vi": "Tiêu đề tiếng Việt",
      "title_th": "ชื่อเรื่องภาษาไทย"
    }
    
  3. 考虑变音符号处理

    对于欧洲语言,需要考虑用户是否可能使用带或不带变音符号的形式进行搜索。

  4. 自定义分词

    对于默认分词效果可能不理想的语言,考虑使用 pre_segmented_query 参数。