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搜索引擎