Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django中的简单搜索_Django_Search - Fatal编程技术网

Django中的简单搜索

Django中的简单搜索,django,search,Django,Search,我有一个非常简单的博客应用程序,我想添加一个非常简单的搜索功能 我的模型有3个关键字段 class BlogPost(models.Model): title = models.CharField(max_length=100) # the title intro = models.TextField(blank=True, null=True) # an extract content = models.TextField(blank=True, null=True)

我有一个非常简单的博客应用程序,我想添加一个非常简单的搜索功能

我的模型有3个关键字段

class BlogPost(models.Model):
    title = models.CharField(max_length=100) # the title
    intro = models.TextField(blank=True, null=True) # an extract
    content = models.TextField(blank=True, null=True) # full post
我不需要谷歌。我不想搜索评论(不管怎么说,评论都放在disqs上)。我只想要一个日期排名,关键字过滤的帖子集

我在谷歌上找到的关于某种形式的“django”和“search”的所有东西都带有极其复杂的Haystack+后端解决方案。我不需要这些。我不想在一个低使用率的特性上消耗更多的资源(在我移植到Django之前,我曾经有一个搜索框,它一个月可能有4次搜索)

我在这里花时间询问的原因(而不仅仅是写一个凌乱的小脚本)是这已经存在于admin中了。您可以设置要搜索的列,然后只需搜索即可“正常工作”


有没有办法控制管理员提供的搜索,并将其拉入我面向用户的应用程序?

您可以使用搜索操作符。它被记录在文档中。还有一个,不区分大小写,从搜索开始

下面是一个工作示例(改编自我自己的Django网站):


注意_搜索只在MySQL中可用,需要直接操作数据库来添加全文索引。有关更多详细信息,请参阅。

如果您想要一个真正简单的搜索,可以使用查找和:

你还应该注意到,草垛并不一定要“复杂得可怕”。您可以在不到15分钟的时间内使用Whoosh后端设置haystack

2016年更新:在1.10版中添加了Django(仅限PostgreSQL)。使用新模块对原始问题的回答可能如下所示:

from django.contrib.postgres.search import SearchVector

results = BlogPost.objects.annotate(
    search=SearchVector('title', 'intro', 'content'),
).filter(search=your_search_query)
新的全文搜索模块包含更多功能(例如,按相关性排序),您可以。

从Django:

显然,它使用数据库选项来执行搜索。如果没有其他内容,您应该能够重用其中的一些代码

文档也这么说:


但是,全文搜索使用MySQL索引(仅当您使用MySQL时)。

如果您希望它像管理员一样工作,可以尝试我的迷你库。它基本上是一个管理搜索功能的端口。使用pip安装它:

pip install django-simple-search
然后像这样使用它:

from simple_search import search_filter
from .models import BlogPost

search_fields = ['^title', 'intro', 'content']
query = 'search term here'
posts = BlogPost.objects.filter(search_filter(search_fields, query))

我还为此写了一篇博文:

我同意,干草堆+嗖嗖声很容易开始。如果这太费劲的话,不妨使用谷歌网站搜索。我说的复杂不仅仅是指设置。它的代码比这艘班轮多了好几英里。我知道它做得更多,性能也更好,但快速、肮脏的搜索是我目前唯一追求的。谢谢@如果脏搜索不起作用,Stijn将引入另一个搜索引擎(我会选择Bing,因为他们仍然有一个合适的服务器端API),这将是我的下一个调用端口。谢谢,非常有用。如果搜索没有结果怎么办?如何生成和添加新的BlogPost()对象?“\uuu search”操作符仅适用于支持全文索引的某些后端和表类型。谢谢,我已经在回答中包含了这一点。
# Apply keyword searches.
def construct_search(field_name):
    if field_name.startswith('^'):
        return "%s__istartswith" % field_name[1:]
    elif field_name.startswith('='):
        return "%s__iexact" % field_name[1:]
    elif field_name.startswith('@'):
        return "%s__search" % field_name[1:]
    else:
        return "%s__icontains" % field_name

if self.search_fields and self.query:
    for bit in self.query.split():
        or_queries = [models.Q(**{construct_search(str(field_name)): bit}) for field_name in self.search_fields]
        qs = qs.filter(reduce(operator.or_, or_queries))
    for field_name in self.search_fields:
        if '__' in field_name:
            qs = qs.distinct()
            break
pip install django-simple-search
from simple_search import search_filter
from .models import BlogPost

search_fields = ['^title', 'intro', 'content']
query = 'search term here'
posts = BlogPost.objects.filter(search_filter(search_fields, query))