Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.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和#x27之间的差异;s_u_搜索与icontains_Django_Full Text Search - Fatal编程技术网

Django和#x27之间的差异;s_u_搜索与icontains

Django和#x27之间的差异;s_u_搜索与icontains,django,full-text-search,Django,Full Text Search,我最近才开始学习Django,所以如果这个问题对你来说太生疏,请原谅我 我在Django中实现了一个搜索函数。我在MySQL DB全文索引中创建了一个字段,然后在我的书模型中创建了一个字段:search\u keywords,我基本上存储了所有的单词,包括书的标题和内容。然后我的搜索功能会执行类似的操作: search_keyword = self.request.GET.get('keywords') if search_keyword: # '*' is added

我最近才开始学习Django,所以如果这个问题对你来说太生疏,请原谅我

我在Django中实现了一个搜索函数。我在MySQL DB全文索引中创建了一个字段,然后在我的书模型中创建了一个字段:
search\u keywords
,我基本上存储了所有的单词,包括书的标题和内容。然后我的搜索功能会执行类似的操作:

search_keyword = self.request.GET.get('keywords')
    if search_keyword:
        # '*' is added for cases where user enters only part of the keyword
        qs = qs.filter(keywords__search=search_keyword + '*')
但是,如果我的搜索查询是“intro”,我知道其中有一个单词/术语,如“test.introduction”(如果这个术语只是“introduction”,那么它就可以正常工作),那么上述方法就不起作用

然后,当我尝试此方法时:

        qs = qs.filter(keywords__icontains=search_keyword)
它发现了“测试、介绍”等


所以我开始想为什么会这样。“\uuu search”是否仅用于全文搜索?我知道“\uu icontains”的大小写是有意义的(不区分大小写,并且包含单词的一部分),但是为什么要在数据库中创建全文索引,这样我们就可以在Django中使用“\uu search”?这就是速度优势吗(例如,在需要搜索大量文本的情况下?或者我完全遗漏了什么?

区别在于要在数据库上执行的SQL查询结果……我个人更喜欢“\u icontains”,因为所有数据库都支持“\u搜索”,而mysql只支持“\u搜索”()(还支持Django中的PostgreSQL)≥ 1.10-见附件)

查看每个方法的查询:

使用搜索

>>> str(Contact.objects.filter(first_name__search='john').query)

'SELECT `contact_contact`.`id`, `contact_contact`.`title`, `contact_contact`.`first_name`, `contact_contact`.`last_name`, `contact_contact`.`user_id`, `contact_contact`.`role_id`, `contact_contact`.`organization_id`, `contact_contact`.`dob`, `contact_contact`.`email`, `contact_contact`.`notes`, `contact_contact`.`create_date` FROM `contact_contact` WHERE MATCH (`contact_contact`.`first_name`) AGAINST (john IN BOOLEAN MODE)'
使用icontains

>>> str(Contact.objects.filter(first_name__icontains='john').query)

'SELECT `contact_contact`.`id`, `contact_contact`.`title`, `contact_contact`.`first_name`, `contact_contact`.`last_name`, `contact_contact`.`user_id`, `contact_contact`.`role_id`, `contact_contact`.`organization_id`, `contact_contact`.`dob`, `contact_contact`.`email`, `contact_contact`.`notes`, `contact_contact`.`create_date` FROM `contact_contact` WHERE `contact_contact`.`first_name` LIKE %john% '

谢谢,@Darwin!这解释了很多。我还从你那里学到了如何检查Django的底层查询。:)这可能有点漏掉了引导…因为u icontains不被认为是全文搜索。至少对于PostgreSQL,如果我尝试u搜索,并且完整的错误消息是“此数据库后端未实现全文搜索”。Django版本1。8@akki,啊……我明白你的意思了!我对他说的是,我学会了在后台通过
str(YourModelName.objects.filter(attributeName\uuu search='something').query)看到Django为我们创建的等效SQL语句
。差不多就这些。你也可以在上面达尔文的例子中看到。希望这能有所帮助??我不知道我怎么错过了答案的这一部分。谢谢:)