--- title: "通配符查询分析配置" date: 2026-02-13 lastmod: 2026-02-13 description: "indices.query.query_string.analyze_wildcard 配置项用于控制是否对通配符查询词项进行分词分析。" tags: ["查询", "通配符", "QueryString", "分词"] summary: "配置项作用 # 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` 配置项用于控制**在通配符和前缀查询中是否对词项进行分词器分析**。 当启用时,通配符词项会被分词器分解成多个词元(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*] ``` ## 配置建议 ## 生产环境(默认) ```yaml indices: query: query_string: analyze_wildcard: false # 默认值 ``` **建议**: 保持默认值 `false`。精确匹配,性能更好。 ## 同义词搜索 ```yaml indices: query: query_string: analyze_wildcard: true ``` **建议**: 设置为 `true`。使用同义词或需要词元匹配时使用。 ## 词干提取场景 ```yaml indices: query: query_string: analyze_wildcard: true ``` **建议**: 设置为 `true`。使用词干提取等高级分析时使用。 ## 代码示例 ## easysearch.yml 基础配置 ```yaml indices: query: query_string: analyze_wildcard: false ``` ## 启用分析配置 ```yaml indices: query: query_string: analyze_wildcard: true ``` ## 查询级别覆盖 ```json GET /_search { "query": { "query_string": { "query": "product*", "analyze_wildcard": true } } } ``` ## 相关配置 | 配置项 | 作用 | 默认值 | |--------|------|--------| | `indices.query.query_string.analyze_wildcard` | 是否分析通配符 | false | | `indices.query.query_string.allowLeadingWildcard` | 是否允许前导通配符 | true | ## 查询示例 ## 不分析通配符(默认) ```json GET /_search { "query": { "query_string": { "query": "title:quick*" } } } ``` **结果**: 只匹配以 "quick" 开头的词项。 ## 启用分析通配符 ```json 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. **监控建议**: 监控查询性能,评估配置效果。