1,添加了 refresh_interval 设置为 30秒,减少频繁刷新对性能的影响 含义,默认多少

2,分片数多大合适

3,解释type=keyword含义,及场景

4,分词器

1,刷新

1. 默认值

Elasticsearch 默认的 refresh_interval 是 1秒,即:

"refresh_interval": "1s"

这意味着:

  • 新写入的数据通常在 1秒后 可被搜索(近实时搜索,NRT)。

  • 频繁刷新会增加 I/O 和 CPU 开销,影响写入性能。


2. 设置为 30s 的含义
"refresh_interval": "30s"

优化后的影响:

  • 写入性能提升:减少刷新频率,降低 I/O 压力,适合批量写入场景。

  • 搜索延迟增加:新数据最长需要 30秒 才能被搜索到(牺牲实时性换取吞吐量)。

  • 适合场景:日志、监控等对实时性要求不高的场景。

2,分片

1. 分片数设置的核心原则
(1) 单个分片大小建议
  • 推荐范围10GB–50GB(官方建议)

  • 最小不建议低于 1GB(否则管理开销大)

  • 最大不建议超过 100GB(影响查询性能和恢复速度)

(2) 分片总数限制
  • 单个节点总分片数 ≤ 1000(包括主分片和副本)

    • 例如:3 节点集群,总分片数 ≤ 3000(避免 JVM 内存压力)

(3) 分片数与节点数的关系
  • 主分片数:建议 ≤ 节点数 × 3(确保均匀分布)

  • 副本分片数:通常 1-2(高可用场景可增加)


2. 如何计算合适的分片数?

公式

分片数 = MAX(数据总大小 / 30GB, 节点数)

示例

  • 数据量 500GB,集群 5 个节点

    • 分片数 = MAX(500GB / 30GB, 5) ≈ 17 个分片

  • 数据量 1TB,集群 10 个节点

    • 分片数 = MAX(1000GB / 30GB, 10) ≈ 34 个分片

调整建议

  • 小数据量(<100GB):直接 1-5 个分片

  • 中等数据量(100GB–1TB)5–20 个分片

  • 大数据量(>1TB)20–100 个分片(需结合节点规模)

3,type keyword

1. keyword 的核心特性
特性 说明
不分词 存储原始字符串,不会像 text 类型那样被分词器拆分。
精确匹配 适合 term 查询、filter、聚合(如 terms aggregation)。
区分大小写 默认大小写敏感("Foo" 和 "foo" 视为不同值)。
支持聚合和排序 由于使用 doc_values,适合排序(sort)和聚合(bucket)。
高效存储 通过倒排索引和列式存储(doc_values)优化查询性能。

2. 适用场景

(1) 需要精确匹配的字段

  • ID 类字段:用户ID、订单号、商品SKU(如 user_id: "U1001")。

  • 状态码:HTTP状态码(status: "200")、订单状态(status: "paid")。

  • 标签/分类:产品分类(category: "electronics")、颜色(color: "red")。

(2) 需要聚合或排序的字段

  • 分组统计:按城市聚合订单数(terms aggregation on city)。

  • 排序:按品牌名称排序(sort on brand_name)。

(3) 短文本且无需全文搜索

  • 人名/地名"北京""John Doe"(如果不需要分词搜索)。

  • 枚举值:性别(gender: "male")、布尔值(is_active: "true")。


3. 与 text 类型的对比
场景 keyword text
是否分词 ❌ 存储原始值 ✅ 被分词器拆分(如 "Hello World" → ["hello", "world"])
适合查询类型 termfilter、聚合 matchmatch_phrase(全文搜索)
是否支持排序 ❌(除非启用 fielddata,但开销大)
典型用例 订单号、状态码、标签 文章内容、商品描述、日志消息

4,分词器 

标准 / 空格 / keyword不分词 / 中文

Elasticsearch 分词器 (Analyzer) 详解

分词器是 Elasticsearch 文本处理的核心组件,负责将原始文本转换为可搜索的词项(Term)。合理选择和使用分词器对搜索质量至关重要。

1. 分词器的组成

一个完整的分词器包含三个部分:

  1. Character Filters (字符过滤器)

    • 在分词前预处理原始文本

    • 例如:去除HTML标签、替换特殊字符

  2. Tokenizer (分词器)

    • 将文本拆分为词项

    • 每个分词器必须且只能有一个

  3. Token Filters (词项过滤器)

    • 对分词结果进行再处理

    • 例如:小写转换、去除停用词、添加同义词

2. 内置分词器

Elasticsearch 提供多种内置分词器:

(1) Standard Analyzer (标准分词器)

  • 默认分词器

  • 按Unicode文本分割规则分词

  • 小写化所有词项

  • 移除标点符号

示例

text

复制

下载

"Elasticsearch 7.0发布" → ["elasticsearch", "7.0", "发布"]

(2) Simple Analyzer (简单分词器)

  • 遇到非字母字符就分割

  • 小写化所有词项

示例

text

复制

下载

"Hello-world 2023" → ["hello", "world", "2023"]

(3) Whitespace Analyzer (空格分词器)

  • 仅按空白字符分割

  • 不进行小写转换

示例

text

复制

下载

"Quick Brown Fox" → ["Quick", "Brown", "Fox"]

(4) Stop Analyzer (停用词分词器)

  • 类似Simple Analyzer

  • 额外移除常见停用词(the, a, an等)

示例

text

复制

下载

"The quick brown fox" → ["quick", "brown", "fox"]

(5) Keyword Analyzer (关键词分词器)

  • 不进行任何分词

  • 将整个输入作为单个词项输出

示例

text

复制

下载

"Elasticsearch分析" → ["Elasticsearch分析"]

(6) Pattern Analyzer (模式分词器)

  • 使用正则表达式分词

  • 默认使用\W+(非字母字符)分割

示例

text

复制

下载

"user-123@example.com" → ["user", "123", "example", "com"]

(7) Language Analyzers (语言分词器)

  • 针对特定语言优化

  • 支持30+种语言(english, french, chinese等)

中文示例

text

复制

下载

"我爱Elasticsearch" → ["我", "爱", "elasticsearch"]

3. 中文分词器

由于内置分词器对中文支持有限,通常需要第三方插件:

(1) IK Analyzer (最常用)

  • 支持两种分词模式:

    • ik_smart:智能切分(较粗粒度)

    • ik_max_word:最细粒度切分

示例(ik_max_word)

text

复制

下载

"中华人民共和国" → ["中华", "中华人民", "中华人民共和国", "华人", "人民", "人民共和国", "共和", "共和国"]

(2) Jieba Analyzer

  • 结巴分词移植版

  • 支持三种模式:

    • search:搜索引擎模式

    • index:索引模式

    • other:用户自定义

(3) HanLP Analyzer

  • 功能丰富的NLP工具包

  • 支持命名实体识别、依存句法分析等

4. 自定义分词器

可以通过组合不同组件创建自定义分词器:

json

复制

下载

PUT /my_index
{
  "settings": {
    "analysis": {
      "char_filter": {
        "my_char_filter": {
          "type": "html_strip",
          "escaped_tags": ["br"]
        }
      },
      "filter": {
        "my_stopwords": {
          "type": "stop",
          "stopwords": ["的", "是", "了"]
        }
      },
      "analyzer": {
        "my_custom_analyzer": {
          "type": "custom",
          "char_filter": ["my_char_filter"],
          "tokenizer": "ik_max_word",
          "filter": [
            "lowercase",
            "my_stopwords"
          ]
        }
      }
    }
  }
}

5. 分词器使用场景

场景 推荐分词器 原因
英文内容 standard 或 english 良好的英语处理能力
中文搜索 ik_smart 平衡召回率和准确率
中文索引 ik_max_word 最大化召回率
代码/标签 keyword 或 whitespace 保持原始格式
多语言 自定义组合 适应不同语言特点
精确匹配 keyword 不进行分词处理

6. 测试分词器

使用_analyze API测试分词效果:

json

复制

下载

GET /_analyze
{
  "analyzer": "ik_smart",
  "text": "Elasticsearch中文分词器测试"
}

响应示例:

json

复制

下载

{
  "tokens": [
    {
      "token": "elasticsearch",
      "start_offset": 0,
      "end_offset": 13,
      "type": "ENGLISH",
      "position": 0
    },
    {
      "token": "中文",
      "start_offset": 13,
      "end_offset": 15,
      "type": "CN_WORD",
      "position": 1
    },
    {
      "token": "分词器",
      "start_offset": 15,
      "end_offset": 18,
      "type": "CN_WORD",
      "position": 2
    },
    {
      "token": "测试",
      "start_offset": 18,
      "end_offset": 20,
      "type": "CN_WORD",
      "position": 3
    }
  ]
}

7. 最佳实践

  1. 索引和搜索使用相同分词器:确保查询词项与索引词项一致

  2. 中文必用专门分词器:内置分词器会将中文拆分为单字

  3. 测试不同分词效果:选择最适合业务的分词策略

  4. 考虑同义词处理:通过token filter添加同义词扩展

  5. 注意分词性能:复杂分词器会影响索引速度

8. 常见问题

Q:为什么搜索不到某些内容?
A:检查是否使用了合适的分词器,查询词项是否与索引词项匹配

Q:如何实现拼音搜索?
A:使用拼音分词插件或将拼音作为子字段

Q:分词器可以修改吗?
A:已有字段的分词器不能修改,需要重建索引

正确理解和配置分词器是构建高质量搜索体验的基础,建议根据实际数据特点和查询需求进行充分测试和优化。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐