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

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

假设我有一个模型如下:

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

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

【问题讨论】:

    标签: mysql django full-text-search


    【解决方案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 的人有同样的问题:stackoverflow.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 提供全文功能。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-22
        • 2015-07-03
        • 1970-01-01
        • 2012-04-16
        • 1970-01-01
        • 2016-08-24
        • 2021-01-28
        相关资源
        最近更新 更多