我需要为我的Django应用程序实现全文搜索,将MySQL作为后端运行。
假设我有一个模型如下:
class MyItem(models.Model):
title = models.CharField()
short_description = models.TextField()
description = models.TextField()
我想首先在标题中找到搜索词出现的结果,然后在short_description中以及在描述字段的末尾。如果我不必为此任务使用额外的模块/应用程序,我会更高兴。
答案 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'原生全文搜索引擎覆盖一个或多列:
上查看还有一个描述如何安装,使用它以及如何通过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提供全文功能。