elasticsearch 无法将“bool”查询与“knn”查询组合- Elastisearch

hmmo2u0o  于 5个月前  发布在  ElasticSearch
关注(0)|答案(2)|浏览(108)

我正在尝试构建一个ElasticSearch查询,以便从搜索引擎项目的索引中获取一些结果。我也使用了pproximate KNN。现在,我有几个条件要添加到我的KNN查询中,但它似乎并没有像预期的那样工作。
下面是我的完整查询的一个示例。

{
    "_source": {
        "includes": [
            "id",
            "name"
        ]
    },
    "from": 0,
    "size": 60,
    "query": {
        "bool": {
            "must_not": [
                {
                    "term": {
                        "id": 12345
                    } 
                }
            ]
        }
    },
    "knn": {
        "field": "text_embedding.predicted_value",
        "k": 100,
        "num_candidates": 300,
        "query_vector_builder": {
            "text_embedding": {
                "model_id": "sentence-transformers__all-minilm-l6-v2",
                "model_text": "Loreum Epsom"
            }
        }
    }
}

字符串
...“id”字段在我的elasticsearch索引中被Map为一个'integer'。它被期望的结果不能包括“id”= 12345的_doc,但它返回了具有该“id”的_doc。出了什么问题?

cgvd09ve

cgvd09ve1#

如果你想排除一组特定的文档,你需要使用一个过滤的knn查询(从ES 8.4开始可用):

{
  "_source": {
    "includes": [
      "id",
      "name"
    ]
  },
  "from": 0,
  "size": 60,
  "knn": {
    "field": "text_embedding.predicted_value",
    "k": 100,
    "num_candidates": 300,
    "query_vector_builder": {
      "text_embedding": {
        "model_id": "sentence-transformers__all-minilm-l6-v2",
        "model_text": "Loreum Epsom"
      }
    },
    "filter": {                <--- add your filter here
      "bool": {
        "must_not": [
          {
            "term": {
              "id": 12345
            }
          }
        ]
      }
    }
  }
}

字符串

8yoxcaq7

8yoxcaq72#

问题在于“must_not”子句中的“term”查询的使用。“term”查询旨在与字符串字段精确匹配,而“id”字段Map为整数。这种不匹配导致结果中意外包含“id”= 12345的文档。要有效排除“id”= 12345的文档,您应该使用“range”查询而不是“term”查询。“range”查询适用于数值字段,并允许您指定要排除的值的范围。
修改must_not子句:

"must_not": [
        {
            "range": {
                "id": {
                    "from": 12345,
                    "to": 12345 + 1
                }
            }
        }
    ]

字符串
参考-https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-range-query.html
This link中有一个partiular部分,它提供了一个具体的示例,说明如何使用范围查询来根据数值排除文档
希望这个答案能帮到你...

相关问题