弹性搜索中的软 must_not

Soft must_not in elastisearch

我试图在 elasticsearch 的文档列表中搜索一个词,同时排除包含该词的表达式。

例如,我想在下面的列表中搜索单词 "good",但以软方式排除表达式 "quite good":

  1. 这是一个很好的文档。
  2. 这是一个很好的文档。
  3. 这是一个很好的文件。确实不错

所以它会 return 1 和 3,因为它有一个 "good" 的实例,它不包含在表达式 "quite good" 中。 我尝试使用 BooleanQuery 或 SpanNotQuery,但每次都排除文档 n°3。

另一种方法是使用分析器删除我不想 运行 搜索的表达式。但是,这使我的排除非常静态,无法在查询时设置。

您知道这是否可能以及如何实现吗?

糟糕,SpanNotQuery 确实成功了,我一定是一开始就测试错了。

这个查询给出了预期的结果:

{
  "query": {
    "span_not": {
      "include": {
        "span_term": { "field": "good" }
      },
      "exclude": {
        "span_near": {
          "clauses": [
            { "span_term": {"field": "quite" }},
            { "span_term": {"field": "good" }}
          ],
          "slop": 0,
          "in_order": true
        }
      }
    }
  }
}