Django MySQL 全文搜索

Posted

技术标签:

【中文标题】Django MySQL 全文搜索【英文标题】:Django MySQL full text search 【发布时间】:2011-01-15 23:09:57 【问题描述】:

我需要为我的 Django 应用程序实现全文搜索,运行 mysql 作为后端。

假设我有一个模型如下:

class MyItem(models.Model):
    title = models.CharField()
    short_description = models.TextField()
    description = models.TextField()

我希望首先在标题中出现搜索词的结果,然后在 short_description 中,最后在描述字段中。如果我不必为此任务使用额外的模块/应用程序,我会更开心。

【问题讨论】:

【参考方案1】:

previously highest rated answer 已弃用。从 Django 1.10 开始,不再有用于 MySQL 数据库的search 字段查找(参见search section in the 1.10 documentation)。

release notes for 1.10 也提出了解决方案,通过定义自定义查找:

###__search 查询查找

搜索查找,仅支持 MySQL 并且在 功能,已弃用。将其替换为自定义查找:

from django.db import models

class Search(models.Lookup):
   lookup_name = 'search'

   def as_mysql(self, compiler, connection):
       lhs, lhs_params = self.process_lhs(compiler, connection)
       rhs, rhs_params = self.process_rhs(compiler, connection)
       params = lhs_params + rhs_params
       return 'MATCH (%s) AGAINST (%s IN BOOLEAN MODE)' % (lhs, rhs), params

models.CharField.register_lookup(Search)
models.TextField.register_lookup(Search)

【讨论】:

现在需要更高,更多最新答案 + 不依赖外部包。 这对我在 Django 2+ 上也很有效,谢谢分享! 这对我有用,但是在测试期间它失败了——我想我会把它放在这里,以防使用这个 sn-p 的人有同样的问题:***.com/questions/61486725/…【参考方案2】:

你可以在django中使用全文搜索

MyItem.objects.filter(title__search="some search text")

有一件事是——你不能从 Django 模型中定义全文索引,你需要直接在数据库中做(使用 phpMyAdmin 或 SQL 查询)

请参阅 Django 文档以获取名为 search 的字段查找

【讨论】:

这在使用 MySQL 时默认不起作用,因为它不使用表类型 MyISAM。您收到错误“使用的表类型不支持 FULLTEXT 索引” @SilverLight 如何针对复合FULLTEXT 搜索索引等多列执行此操作? @RohitKhatri 您可以使用 Django 中的Q 对象构建复杂的查找:docs.djangoproject.com/en/2.2/topics/db/queries/…。这里的主要特点是它允许用“或”连接查询集。 @Silver Light 也许我错过了它,但我似乎找不到名为search 的引用字段查找?!可能被删除了吗?【参考方案3】:

如果您正在寻找强大的解决方案,我推荐http://haystacksearch.org/

设计的非常好。

【讨论】:

我想我最终会得到我试图避免的第 3 方解决方案。 是的,您可能需要澄清为什么这是您想要的解决方案?此选项将使您保持数据库独立,并且在您将数据库模型添加到搜索条件时它可以很好地扩展。例如,在一个项目中,我开始对一张表使用 haystack,但最终产品是查询十张。但是不要忘记,如果您确切地知道原始 sql 术语中想要什么,您可以使用它。 docs.djangoproject.com/en/dev/topics/db/sql 。祝你好运【参考方案4】:

我不知道它现在是否有帮助,但我已经为 Django 创建了一个新的 Python 库,它支持 MySQLs 和 MariaDBs 的原生全文 搜索引擎超过一个或 多个列

您可以在GitHub repository查看它

还有如何安装、使用它以及如何通过 Django 迁移 (Django 1.7+) 创建 FULLTEXT INDEX 的说明。

如果您已经为您的模型配置了索引并设置了SearchManager,您应该能够运行类似的东西:

Mymodel.objects.search('Something')
Mymodel.objects.search('Somet*')
Mymodel.objects.search('+Something -Awesome')

只是想更新这个主题,因为到目前为止我还没有找到可接受的解决方案,它也可能对那里的人有所帮助:)

干杯 多米

【讨论】:

【参考方案5】:

来自 django docs 关于全文搜索:

例子:

Entry.objects.filter(headline__search="+Django -jazz Python")

SQL 等价物:

SELECT ... WHERE MATCH(tablename, headline) AGAINST (+Django -jazz Python IN BOOLEAN MODE);

请注意,这仅在 MySQL 中可用,并且需要直接操作数据库来添加全文索引。默认情况下,Django 使用 BOOLEAN MODE 进行全文搜索。有关更多详细信息,请参阅MySQL documentation。

现在直接操作数据库。在 MySQL 中,您可以按照以下步骤创建全文索引 (source article):

打开命令提示符,输入mysql -u root -p。提示输入 root 密码。 输入use your_db_name 切换到您的django 数据库。 输入CREATE FULLTEXT INDEX index_name ON table_name (column_names)

就是这样!在您的 django 数据库中启用 FTS 索引。现在你可以使用 django 丰富的QuerySet API 进行全文搜索了。

编辑:以上引用不再存在于 django 版本 >1.9 中。

【讨论】:

我在提供的链接中找不到您的报价。 @run_the_race 那是因为 django 大于 1.9 的版本中不再存在该部分。我已经更新了网址,以便在撰写本文时将您带到与我的答案相关的版本。 查看tbr 的回答,了解 Django > 1.9 的解决方法,其中 __search 已从 mysql 中删除【参考方案6】:

Django 只为 PostgreSQL 提供全文功能。

【讨论】:

以上是关于Django MySQL 全文搜索的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 QuerySets 和 MySql“全文搜索”在多个字段中进行 Django 搜索?

使用haystack实现Django的全文搜索 -- Elasticsearch搜索引擎

为 Django 全文搜索创建索引

全文搜索之MySQL与ElasticSearch搜索引擎

在视图中使用全文搜索 + GIN (Django 1.11 )

django-全文解锁和搜索引擎