如何从 django-haystack 和 Elasticsearch 中排除不相关的搜索结果?

How to exclude unrelated search results from django-haystack and Elasticsearch?

我正在尝试根据关键字搜索产品。我的haystack索引如下:

class ProductIndex(indexes.SearchIndex, indexes.Indexable):
    name= indexes.CharField(model_attr='name')
    text = indexes.CharField(document=True) # contains keywords associated with the product

在这种情况下,字段 "text" 包含一组与产品关联的关键字。例如,这是一个示例产品索引:

name: "Tide Detergent"
text: "laundry household shopping cleaning supplies"

当我搜索 laundry 时,Tide Detergent 会出现在搜索结果中,但其他不相关的结果也会出现,例如在搜索结果中包含 lawnlaugh 的产品text。所以看起来 elasticsearch 不仅在搜索 laundry,还在搜索这个词的变体。

我的搜索查询如下所示:

qs = SearchQuerySet().models(Product).filter(content__exact='laundry')

我的问题是:如何强制 haystackelasticsearch 严格搜索我输入的关键字并忽略它们的变体?换句话说,如何确保 haystack 仅搜索 laundry 并排除任何其他术语?

我找到了答案。我使用原始 elasticsearch 查询而不是直接通过 haystack。在该查询中,我使用了 constant_score 查询,该查询将搜索 精确 术语,而不是另外的模糊术语。

{
    "query":{
        "query":{
            "constant_score":{
                "filter":{
                    "bool":{
                        "must":[
                            {"bool":{
                                    "must":[
                                        {
                                            "term": {
                                                "text":"laundry"
                                            }
                                        }
                                    ]
                                }
                            }
                        ]
                    }
                }
            }
        }
    }
}

这里是关于 constant_score 查询的更多信息:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-constant-score-query.html