Django MySQL全文搜索

时间:2010-02-12 00:08:26

标签: mysql django full-text-search

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

假设我有一个模型如下:

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

我想首先在标题中找到搜索词出现的结果,然后在short_description中以及在描述字段的末尾。如果我不必为此任务使用额外的模块/应用程序,我会更高兴。

6 个答案:

答案 0 :(得分:24)

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

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

有一件事是 - 您无法从Django模型定义全文索引,您需要直接在数据库中进行(使用PHPMyAdmin或SQL查询)

请参阅Django文档,了解名为search

的字段查找

答案 1 :(得分:5)

如果您正在寻找一个强有力的解决方案,我建议http://haystacksearch.org/

经过深思熟虑。

答案 2 :(得分:3)

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

您可以在GitHub repository

上查看

还有一个描述如何安装,使用它以及如何通过Django迁移(Django 1.7 +)创建FULLTEXT INDEX内容。

如果您已配置索引并为模型设置SearchManager,则应该能够执行以下操作:

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

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

干杯 多米

答案 3 :(得分:1)

来自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进行全文搜索。

答案 4 :(得分:0)

previously highest rated answer已过时。从Django 1.10开始,不再为MySQL数据库提供search字段查找(请参见search section in the 1.10 documentation)。

release notes for 1.10还通过定义自定义查找来为此提供解决方案:

  

__搜索查询查找

     

搜索查找,仅支持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)

答案 5 :(得分:0)

Django仅为PostgreSQL提供全文功能。