Python Django搜索:设置Haystack_Default_操作符=';或';无效

Python Django搜索:设置Haystack_Default_操作符=';或';无效,python,django,django-haystack,Python,Django,Django Haystack,我正在用Haystack和Whoosh搜索我正在建立的django网站。我想在搜索词上使用OR运算符(例如,“搜索字符串”将查找文本为“搜索”或“字符串”的对象,而不是“搜索”和“字符串”) 这看起来很简单,因为haystack允许您通过在settings.py文件中设置来覆盖默认的“AND”操作符 不幸的是,将此添加到my settings.py没有任何效果。我在stackoverflow上发现了一些与此行为相关的引用,但没有解决方案。我也发现了一个,但从去年开始就一直存在,没有任何评论或分类

我正在用Haystack和Whoosh搜索我正在建立的django网站。我想在搜索词上使用OR运算符(例如,“搜索字符串”将查找文本为“搜索”或“字符串”的对象,而不是“搜索”和“字符串”)

这看起来很简单,因为haystack允许您通过在settings.py文件中设置来覆盖默认的“AND”操作符

不幸的是,将此添加到my settings.py没有任何效果。我在stackoverflow上发现了一些与此行为相关的引用,但没有解决方案。我也发现了一个,但从去年开始就一直存在,没有任何评论或分类

我可能做错了什么,所以我想我应该在这里发布,看看是否有解决办法。没有一个我有点困了

My settings.py中的My haystack设置:

HAYSTACK_CONNECTIONS = {
    'default': {
        'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine',
        'PATH': os.path.join(os.path.dirname(__file__), 'whoosh_index'),
    },
}
HAYSTACK_DEFAULT_OPERATOR = 'OR'
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
我的看法是:

from haystack import views as hsviews

def search_test(request):
    return hsviews.basic_search(request)
我的搜索索引.py文件:

import datetime
from haystack import indexes
from myApp.models import MyModel
from django.contrib.auth.models import User

class MyModelIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.NgramField(document=True, use_template= True)
    isPublic = indexes.BooleanField(model_attr='isPubliclyVisible')
    brand = indexes.CharField(model_attr='brand')
    model = indexes.CharField(model_attr='model')
    owner = indexes.CharField(model_attr='owner')
    owner_username = indexes.CharField()
    obj_type = indexes.CharField()

    def get_model(self):
        return MyModel

    def index_queryset(self, using=None):
        """Used when the entire index for model is updated."""
        return self.get_model().objects.filter(isPubliclyVisible = True)

    def prepare_owner_username(self, obj):
        return obj.owner.user.username

    def prepare_obj_type(self,obj):
        return 'MyModel'

我确实发现了这一点(我还没有为我的解决方案进行测试/思考),但我认为,如果我/我们做错了什么,这一点有其自身的问题。

我建议您编写自己的视图,而不是使用Haystack内置的基本搜索功能,这样您就可以更好地控制搜索查询的执行方式。这样,您就可以通过扩展视图或自定义搜索查询功能来处理更复杂的搜索,而且测试起来也更容易

例如,您可以构建单独的SearchQuerySet过滤器来执行搜索的每个关键字,然后将它们“或”放在一起,如下所示:

def get_query(request):
    """
    This function retrieves any query terms (e.g q=search+term)
    from the request object.

    :param request: request object
    :returns: query terms as a list (split on whitespace)
    """
    query = None
    qs_keyword = 'q'
    if (qs_keyword in request.GET) and request.GET[qs_keyword].strip():
        query_string = request.GET[qs_keyword]
        query = query_string.split()
    return query

def perform_query(request):
    """
    This is a helper function to perform the actual query.

    You can extend this to handle more complicated searches using AND,
    OR, boolean qualifiers, etc.

    :param request: request object
    :returns: SearchQuerySet results
    """
    query = get_query(request)
    if not query:
        results = EmptySearchQuerySet()
    else:
        results = SearchQuerySet()
        for search_term in query:
            # you can use the "|" (or) operator
            results |= results.filter(content=search_term)
            # or else use "filter_or"
            # results = results.filter_or(content=search_term)
    return results

def your_search_view(request, *args, **kwargs):
    """
    This is your search view to process the query and display your results.
    """
    # call "perform_query" to do the actual search
    results = perform_query(request)

    # do the rest of your view processing ...
    return render_to_response(etc.)

谢谢这个周末我没有时间尝试一下,但会在接下来的几天内更新。更新:这看起来应该可以很好地发挥作用——不幸的是,我从Haystack那里得到了一些更坏的行为。SearchQuerySet().all()返回一个空列表。但是如果我使用基本的_search()视图,它工作得很好,因此我知道索引正在工作。您可能希望尝试在django shell中手动执行查询,以测试根据您的要求构建SearchQuerySet结果的步骤。这是一种测试代码的好方法,可以将代码与视图的所有隐藏处理隔离开来。是的,这就是我得到空列表的地方。在shell中我做到了:从haystack.query导入SearchQuerySet,results=SearchQuerySet().all(),results.count()更新:仍然不确定为什么我要在命令行中获得这些结果,但代码运行正常——非常好!我意识到我是在用一个帖子来点击搜索结果——这与上面的代码不匹配。谢谢你的帮助!如果您碰巧知道为什么我可能在命令行中得到一个空字符串,请告诉我。