📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

配置项作用 #

indices.query.query_string.analyze_wildcard 配置项用于控制在通配符和前缀查询中是否对词项进行分词器分析

当启用时,通配符词项会被分词器分解成多个词元(tokens),从而实现更灵活的匹配模式。

配置项属性 #

  • 配置路径: indices.query.query_string.analyze_wildcard
  • 数据类型: Boolean(布尔值)
  • 默认值: false
  • 是否可选: 是
  • 作用域: NodeScope(节点级别)

配置项详解 #

工作机制 #

通配符查询处理流程

analyzeWildcard = false (默认):

查询: title:foo*bar*
    │
    ↓
只进行规范化处理
    │
    ↓
    ↓ foo*bar* (直接使用)
    │
    ↓
查找以 "foo*bar*" 开头的词项
    │
    ↓
返回结果


analyzeWildcard = true:

查询: title:foo*bar*
    │
    ↓
进行分词分析
    │
    ↓    ↓
    foo    bar
    │     │
    ↓     ↓
  tokens  tokens
    │     │
    ↓     ↓
foo* OR bar* (扩展匹配)
    │
    ↓
查找以 "foo" 或 "bar" 开头的词项
    │
    ↓
返回更广泛的结果

分析模式对比 #

不同配置的匹配结果

查询: phone*

analyzeWildcard = false:
只规范化
    ↓
phone* → 匹配 "phone*" 开头的词
    │
    ↓
精确匹配前缀


analyzeWildcard = true:
分词分析
    ↓
phone → [phone, tele, call]
    ↓
phone* → 匹配 [phone*, tele*, call*]
    │
    ↓
扩展匹配前缀

与字段分析器的关系 #

字段分析器的影响

字段分析器: standard

原始文本: "smart phone"

analyzeWildcard = false:
smart* → 查找 "smart*" 开头

analyzeWildcard = true:
分析: [smart, phone]
smart* → [smart*, phone*]

配置建议 #

生产环境(默认) #

indices:
  query:
    query_string:
      analyze_wildcard: false  # 默认值

建议: 保持默认值 false。精确匹配,性能更好。

同义词搜索 #

indices:
  query:
    query_string:
      analyze_wildcard: true

建议: 设置为 true。使用同义词或需要词元匹配时使用。

词干提取场景 #

indices:
  query:
    query_string:
      analyze_wildcard: true

建议: 设置为 true。使用词干提取等高级分析时使用。

代码示例 #

easysearch.yml 基础配置 #

indices:
  query:
    query_string:
      analyze_wildcard: false

启用分析配置 #

indices:
  query:
    query_string:
      analyze_wildcard: true

查询级别覆盖 #

GET /_search
{
  "query": {
    "query_string": {
      "query": "product*",
      "analyze_wildcard": true
    }
  }
}

相关配置 #

配置项作用默认值
indices.query.query_string.analyze_wildcard是否分析通配符false
indices.query.query_string.allowLeadingWildcard是否允许前导通配符true

查询示例 #

不分析通配符(默认) #

GET /_search
{
  "query": {
    "query_string": {
      "query": "title:quick*"
    }
  }
}

结果: 只匹配以 “quick” 开头的词项。

启用分析通配符 #

GET /search
{
  "query": {
    "query_string": {
      "query": "title:quick*",
      "analyze_wildcard": true
    }
  }
}

结果: 匹配 “quick” 及其同义词开头的词项。

性能影响分析 #

analyze_wildcard 设置优点缺点
false(默认)性能好,可预测匹配有限
true匹配更灵活额外 CPU 开销

CPU 开销对比 #

查询性能对比

查询: term*term*term

analyzeWildcard = false:
- 规范化处理
- 直接查找前缀
- CPU 开销: 低 ✅

analyzeWildcard = true:
- 分词分析
- 扩展查找前缀
- CPU 开销: 高 ❌

使用场景 #

推荐使用默认值的场景 #

  • 标准搜索: 常规的前缀/通配符搜索
  • 性能优先: 需要快速响应
  • 简单字段: 字段不使用复杂分析器

推荐启用分析的场景 #

  • 同义词扩展: 字段配置了同义词
  • 词干提取: 使用词干提取器
  • 复杂分析器: 使用自定义分析器
  • 灵活匹配: 需要词元级别的匹配

分析器配置示例 #

配合字段分析器

索引映射:
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "standard"
      }
    }
  }
}

使用 analyze_wildcard:

查询: "title:running*"
    │
    ↓
standard 分析器分词
    │
    ↓    ↓
  [running, ran]
    │
    ↓
running* OR ran*
    │
    ↓
扩展匹配结果

注意事项 #

  1. 默认值: 默认值为 false,适用于大多数场景。

  2. 性能影响: 启用分析会增加 CPU 开销。

  3. 字段分析器: 效果取决于字段的分词器配置。

  4. 查询级别: 可以在查询请求中覆盖索引级配置。

  5. 动态更新: 支持动态更新,修改后立即生效。

  6. 匹配范围: 启用后会扩大匹配范围。

  7. 测试验证: 启用后需要验证查询结果符合预期。

  8. 同义词: 同义词扩展时特别有用。

  9. 词干提取: 词干提取时可以提高召回率。

  10. 监控建议: 监控查询性能,评估配置效果。