在 Elasticsearch 中,一个字段可以设置 多个分词器,但具体应用方式有所不同,取决于字段的类型和使用场景。以下是常见的配置方法和限制:


1. 单字段只能有一个分词器

一个字段的 analyzer 属性只能设置一个分词器,用于对字段内容进行索引(index time)。例如:

示例:单字段设置一个分词器

json
PUT /my_index { "mappings": { "properties": { "title": { "type": "text", "analyzer": "standard" // 使用 standard 分词器 } } } }

2. 使用 search_analyzer 设置查询时的分词器

虽然字段的 analyzer 属性只能设置一个分词器,但可以通过 search_analyzer 设置一个不同的分词器用于查询时分析文本。

示例:设置索引和查询分词器

json
PUT /my_index { "mappings": { "properties": { "title": { "type": "text", "analyzer": "ik_max_word", // 索引时使用 ik_max_word 分词器 "search_analyzer": "ik_smart" // 查询时使用 ik_smart 分词器 } } } }
  • analyzer:用于索引内容时的分词器。
  • search_analyzer:用于查询内容时的分词器。

这种方式适合:

  • 索引时需要生成更多分词(如 ik_max_word),提高召回率。
  • 查询时需要更精确的分词(如 ik_smart)。

3. 多分词器的解决方案

3.1 使用 copy_to 配置多个字段

如果需要对一个字段同时使用多个分词器,可以通过 copy_to 将同一内容复制到多个字段,每个字段使用不同的分词器。

示例:配置多个分词器

json
PUT /my_index { "mappings": { "properties": { "title": { "type": "text", "analyzer": "ik_max_word", "copy_to": ["title_standard", "title_keyword"] }, "title_standard": { "type": "text", "analyzer": "standard" }, "title_keyword": { "type": "text", "analyzer": "keyword" } } } }
  • 主字段 title 使用 ik_max_word 分词器。
  • title 的内容会被复制到 title_standardtitle_keyword 字段,分别使用 standardkeyword 分词器。
  • 查询时,可以选择针对不同分词器的字段执行搜索。

3.2 使用 multi-fields 配置多个分词器

通过 fields 属性,可以为一个字段定义多个子字段,每个子字段可以使用不同的分词器。

示例:multi-fields 配置

json
PUT /my_index { "mappings": { "properties": { "title": { "type": "text", "analyzer": "ik_max_word", // 主字段分词器 "fields": { "standard": { "type": "text", "analyzer": "standard" // 子字段使用 standard 分词器 }, "keyword": { "type": "keyword" // 子字段不分词 } } } } } }
  • 主字段
    • title 使用 ik_max_word 分词器。
  • 子字段
    • title.standard 使用 standard 分词器。
    • title.keyword 不分词,直接存储原始值。

查询示例

json
GET /my_index/_search { "query": { "match": { "title.standard": "example text" } } }

3.3 动态模板实现批量字段分词器设置

如果需要为大量字段设置多个分词器,可以使用动态模板(Dynamic Templates)。

示例:动态模板配置

json
PUT /my_index { "mappings": { "dynamic_templates": [ { "multi_analyzer": { "match": "content_*", "mapping": { "type": "text", "analyzer": "ik_max_word", "fields": { "standard": { "type": "text", "analyzer": "standard" } } } } } ] } }
  • 所有以 content_ 开头的字段都会被应用此模板,默认使用 ik_max_word,并创建 standard 子字段。

4. 选择适合的方式

简单场景

  • 如果只需要一个分词器,直接通过 analyzer 设置即可。
  • 如果需要不同的索引和查询分词器,使用 analyzersearch_analyzer 配置。

复杂场景

  • 如果需要多个分词器,对一个字段内容做多种处理:
    • 小规模字段:使用 multi-fields
    • 大规模字段:使用 copy_to 或动态模板。

5. 注意事项

  1. 存储空间

    • 多分词器的配置会增加索引存储大小,特别是使用 copy_tomulti-fields
  2. 查询效率

    • 查询时需要明确指定字段,避免对所有分词器配置的字段同时查询,影响性能。
  3. 分词器兼容性

    • 不同分词器可能对同一文本产生截然不同的分词结果,需根据业务需求选择适合的分词器。

总结

一个字段的 analyzer 属性只能设置一个分词器,但可以通过以下方式实现多个分词器的效果:

  1. 使用 search_analyzer 设置查询分词器。
  2. 使用 copy_tomulti-fields 配置多个字段。
  3. 使用动态模板批量应用分词器。

点赞(368) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部