gpt4 book ai didi

django - Django 的 __search 与 __icontains 之间的区别

转载 作者:行者123 更新时间:2023-12-04 18:07:38 27 4
gpt4 key购买 nike

我最近开始学习 Django,所以如果这对你来说是一个太新手的问题,请原谅我。

我有一个在 Django 中实现的搜索功能。我在 MySQL DB 全文索引中创建,然后在我的书模型中有一个字段:search_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 + '*')

但是,如果我的搜索查询是“介绍”,其中我知道有一个像“test.introduction”这样的词/术语(如果该术语只是“介绍”,那么它可以正常工作),则上述方法不起作用。

然后当我尝试这样做时:
        qs = qs.filter(keywords__icontains=search_keyword)

它找到“test.introduction”等。

所以我开始想知道为什么会这样。 '__search' 仅用于全字搜索吗?我知道 '__icontains' 的大小写是有道理的(不区分大小写并包含单词的一部分),但是为什么要费心在数据库中创建全文索引,以便我们可以在 Django 中使用 '__search' 呢?这是速度优势吗(例如,在需要搜索大量文本的情况下?或者我在这里完全遗漏了什么?

最佳答案

不同之处在于要在数据库上执行的结果 SQL 查询...我个人更喜欢“__icontains”,因为所有数据库都支持,而“__search”仅适用于 mysql ( as django docs )(也支持 Django ≥ 1.10 中的 PostgreSQL — 见 documentation)。

查看每个方法的查询:

使用 __search

>>> 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% '

关于django - Django 的 __search 与 __icontains 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22799919/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com