You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求举例解析Elasticsearch同义词过滤器expand与lenient属性用法

Elasticsearch同义词过滤器:expand和lenient属性实例解析

expand 属性:控制同义词的匹配方向

expand的核心是决定同义词是双向互扩还是单向替换。

场景1:expand=true(默认值)

假设我们定义同义词规则:apple, fruit,表示apple和fruit互为同义词。

创建带同义词过滤器的索引:

PUT /test_index
{
  "settings": {
    "analysis": {
      "filter": {
        "my_synonym_filter": {
          "type": "synonym",
          "synonyms": ["apple, fruit"],
          "expand": true
        }
      },
      "analyzer": {
        "my_synonym_analyzer": {
          "tokenizer": "standard",
          "filter": ["lowercase", "my_synonym_filter"]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "content": {
        "type": "text",
        "analyzer": "my_synonym_analyzer"
      }
    }
  }
}

添加测试文档:

POST /test_index/_doc/1
{ "content": "I love apple" }

POST /test_index/_doc/2
{ "content": "I love fruit" }

查询测试:

  • 用apple查询:GET /test_index/_search?q=content:apple,会返回文档1和2
  • 用fruit查询:GET /test_index/_search?q=content:fruit,同样返回文档1和2

原因:expand=true时,同义词规则会被扩展成apple => apple, fruit和fruit => fruit, apple,两边关键词能互相匹配对方的文档。

场景2:expand=false

修改同义词过滤器的expand: false,重新创建索引(或更新设置),同义词规则保持apple, fruit。

此时查询:

  • 用apple查询:会返回文档1和2(apple被替换为fruit,能匹配两个文档)
  • 用fruit查询:只会返回文档2(fruit不会被替换为apple,只能匹配自身)

原因:expand=false时,同义词规则仅单向处理为apple => fruit,只有查询apple时会被替换为fruit,反之不生效。


lenient 属性:处理同义词解析错误

lenient用来控制当同义词规则存在语法错误时,系统是直接报错还是忽略错误继续运行。

场景1:lenient=false(默认值)

假设同义词规则写错了,比如用了错误的单向替换格式:apple => fruit, banana(正确单向替换应为apple => fruit,多逗号会导致解析失败)。

创建索引时会直接报错:

PUT /test_index_error
{
  "settings": {
    "analysis": {
      "filter": {
        "my_synonym_filter": {
          "type": "synonym",
          "synonyms": ["apple => fruit, banana"],
          "lenient": false
        }
      },
      "analyzer": {
        "my_synonym_analyzer": {
          "tokenizer": "standard",
          "filter": ["lowercase", "my_synonym_filter"]
        }
      }
    }
  }
}

返回结果会提示同义词解析失败,索引创建终止。

场景2:lenient=true

同样用错误的同义词规则,但设置lenient: true:

PUT /test_index_lenient
{
  "settings": {
    "analysis": {
      "filter": {
        "my_synonym_filter": {
          "type": "synonym",
          "synonyms": ["apple => fruit, banana", "orange, citrus"],
          "lenient": true
        }
      },
      "analyzer": {
        "my_synonym_analyzer": {
          "tokenizer": "standard",
          "filter": ["lowercase", "my_synonym_filter"]
        }
      }
    }
  }
}

此时索引会创建成功,错误的apple => fruit, banana规则会被忽略,而正确的orange, citrus规则正常生效。

测试查询:

  • 用orange查询能匹配citrus的文档,反之亦然;
  • 用apple查询只会匹配包含apple的文档,不会关联fruit或banana。

内容的提问来源于stack exchange,提问作者randomDev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 11:20:28