我正在尝试构建一个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。出了什么问题?
2条答案
按热度按时间cgvd09ve1#
如果你想排除一组特定的文档,你需要使用一个过滤的knn查询(从ES 8.4开始可用):
字符串
8yoxcaq72#
问题在于“must_not”子句中的“term”查询的使用。“term”查询旨在与字符串字段精确匹配,而“id”字段Map为整数。这种不匹配导致结果中意外包含“id”= 12345的文档。要有效排除“id”= 12345的文档,您应该使用“range”查询而不是“term”查询。“range”查询适用于数值字段,并允许您指定要排除的值的范围。
修改must_not子句:
字符串
参考-https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-range-query.html
This link中有一个partiular部分,它提供了一个具体的示例,说明如何使用范围查询来根据数值排除文档
希望这个答案能帮到你...