如何从 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
会出现在搜索结果中,但其他不相关的结果也会出现,例如在搜索结果中包含 lawn
或 laugh
的产品text
。所以看起来 elasticsearch
不仅在搜索 laundry
,还在搜索这个词的变体。
我的搜索查询如下所示:
qs = SearchQuerySet().models(Product).filter(content__exact='laundry')
我的问题是:如何强制 haystack
或 elasticsearch
严格搜索我输入的关键字并忽略它们的变体?换句话说,如何确保 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
我正在尝试根据关键字搜索产品。我的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
会出现在搜索结果中,但其他不相关的结果也会出现,例如在搜索结果中包含 lawn
或 laugh
的产品text
。所以看起来 elasticsearch
不仅在搜索 laundry
,还在搜索这个词的变体。
我的搜索查询如下所示:
qs = SearchQuerySet().models(Product).filter(content__exact='laundry')
我的问题是:如何强制 haystack
或 elasticsearch
严格搜索我输入的关键字并忽略它们的变体?换句话说,如何确保 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