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

问题描述 投票:4回答:1

我一直在浏览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})

如何设置从特定索引获取SearchQuerySet的单独视图?

django django-haystack
1个回答
7
投票

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

但是您的问题似乎与如何查询不同模型的“ SearchIndexes”有关。在您的示例中,如果我正确理解了您的问题,那么您想要一个针对“建议”的搜索查询,另一个针对“建议” +“评论”的搜索查询。

我认为您想查看SearchQuerySet API,它描述了如何过滤搜索返回的查询集。有一种称为models的方法,该方法可让您提供模型类或模型类列表以限制查询集结果。

例如,在搜索视图中,您可能想要一个查询字符串参数,例如“ content”,它指定搜索是针对“提案”还是针对“所有内容”(提案和注释)。因此,您的前端在调用视图时需要提供额外的content参数(或者您可以将单独的视图用于不同的搜索)。

您的查询字符串应类似于:

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

并且您的视图应解析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})

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

© www.soinside.com 2019 - 2024. All rights reserved.