如何在Django中实现全文搜索?

jnn*_*nns 9 python django full-text-search django-queryset

我想在django博客应用程序中实现搜索功能.现状是我有一个用户提供的字符串列表,每个字符串缩小了查询集,只包括那些与字符串匹配的对象.

看到:

if request.method == "POST":
    form = SearchForm(request.POST)
    if form.is_valid():
        posts = Post.objects.all()
        for string in form.cleaned_data['query'].split():
            posts = posts.filter(
                    Q(title__icontains=string) | 
                    Q(text__icontains=string) |
                    Q(tags__name__exact=string)
                    )
        return archive_index(request, queryset=posts, date_field='date')
Run Code Online (Sandbox Code Playgroud)

现在,如果我不想要连接由逻辑AND搜索但逻辑OR的每个单词怎么办?我该怎么办?有没有办法用Django自己的Queryset方法做​​到这一点,还是必须回退到原始的SQL查询?

一般来说,这样做全文搜索是一个合适的解决方案,还是建议使用像Solr,Whoosh或Xapian这样的搜索引擎.他们有什么好处?

And*_*lio 16

我建议你采用搜索引擎.

我们使用了Haystack搜索,django的模块化搜索应用程序支持许多搜索引擎(Solr,Xapian,Whoosh等...)

好处:

  • 快点
  • 即使不查询数据库也可以执行搜索查询.
  • 突出显示搜索的字词
  • "更像这个"功能
  • 拼写建议
  • 更好的排名
  • 等等...

缺点:

  • 搜索索引的大小可以非常快
  • 最好的搜索引擎之一(Solr)作为Java servlet运行(Xapian没有)

我们对这个解决方案非常满意,并且很容易实现.


Dan*_*man 5

实际上,您发布的查询确实使用OR而不是AND - 您\用来分隔Q对象.并且会&.

一般来说,我强烈建议使用合适的搜索引擎.我们在Solr之上使用Haystack取得了很好的成功 - Haystack管理所有Solr配置,并公开了一个非常类似于Django自己的ORM的漂亮API.