gpt4 book ai didi

Django-haystack:如何选择在 SearchQuerySet 中使用哪个索引?

转载 作者:行者123 更新时间:2023-12-01 19:28:55 30 4
gpt4 key购买 nike

我一直在查看关于 multiple indexes 的 Haystack 文档,但我不知道到底如何使用它们。

此示例中的主要模型是Proposal。我想要有两个返回提案列表的搜索索引:一个仅在提案本身中搜索,另一个在提案及其评论中搜索。我已经像这样设置了 search_indexes.py:

class ProposalIndexBase(indexes.SearchIndex, indexes.Indexable)
title = indexes.CharField(model_attr="title", boost=1.1)
text = indexes.NgramField(document=True, use_template=True)
date = indexes.DateTimeField(model_attr='createdAt')

def get_model(self):
return Proposal


class ProposalIndex(ProposalIndexBase):
comments = indexes.MultiValueField()

def prepare_comments(self, object):
return [comment.text for comment in object.comments.all()]


class SimilarProposalIndex(ProposalIndexBase):
pass

这是我在 views.py 中的搜索:

def search(request):
if request.method == "GET":
if "q" in request.GET:
query = str(request.GET.get("q"))
results = SearchQuerySet().all().filter(content=query)
return render(request, "search/search.html", {"results": results})

如何设置一个单独的 View 来从特定索引获取 SearchQuerySet?

最佳答案

Haystack(和其他自动生成的)文档并不是一个清晰的好例子,它就像阅读电话簿一样令人兴奋。我认为您提到的“多个索引”部分实际上是关于访问不同的后端搜索引擎(如 whoosh、solr 等)进行查询。

但是您的问题似乎是关于如何查询不同模型的“SearchIndexes”。在您的示例中,如果我正确理解您的问题,您希望有一个针对“提案”的搜索查询,另一个针对“提案”+“评论”的搜索查询。

我想你想看看 SearchQuerySet API ,它描述了如何过滤搜索返回的查询集。有一个方法叫models它允许您提供模型类或模型类列表来限制查询集结果。

例如,在您的搜索 View 中,您可能希望有一个查询字符串参数,例如“内容”,该参数指定搜索是针对“提案”还是针对“所有内容”(提案和评论)。因此,您的前端需要在调用 View 时提供额外的 content 参数(或者您可以为不同的搜索使用单独的 View )。

您的查询字符串需要类似于:

/search/?q=python&content=proposal
/search/?q=python&content=everything

您的 View 应该解析 content 查询字符串参数以获取用于过滤搜索查询结果的模型:

# import your model classes so you can use them in your search view
# (I'm just guessing these are what they are called in your project)
from proposals.models import Proposal
from comments.models import Comment

def search(request):
results = None
if request.method == "GET":
if "q" in request.GET:
query = str(request.GET.get("q"))
# Add extra code here to parse the "content" query string parameter...
# * Get content type to search for
content_type = request.GET.get("content")
# * Assign the model or models to a list for the "models" call
search_models = []
if content_type is "proposal":
search_models = [Proposal]
elif content_type is "everything":
search_models = [Proposal, Comment]
# * Add a "models" call to limit the search results to the particular models
results = SearchQuerySet().all().filter(content=query).models(*search_models)
return render(request, "search/search.html", {"results": results})

如果您有大量搜索索引(即来自多个模型的大量内容),您可能不想在 View 中对模型进行硬编码,而是使用 django 中的 get_model 函数.db动态获取模型类。

关于Django-haystack:如何选择在 SearchQuerySet 中使用哪个索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24945161/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com