elastisearch中的软must_not

时间:2019-02-28 15:22:15

标签: elasticsearch lucene full-text-search elasticsearch-dsl

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

例如,我想在下面的列表中搜索单词“ good”,但以柔和的方式排除“非常好”一词:

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

因为它有一个“好”的实例,该实例没有包含在表达式“非常好”中,所以它将返回1和3。 我尝试使用BooleanQuery或SpanNotQuery,但每次都排除文档n°3。

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

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

1 个答案:

答案 0 :(得分:1)

糟糕的是,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
        }
      }
    }
  }
}