Django MySQL全文搜索

edk*_*rin 20 mysql django full-text-search

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

假设我的模型如下:

class MyItem(models.Model):
    title = models.CharField()
    short_description = models.TextField()
    description = models.TextField()
Run Code Online (Sandbox Code Playgroud)

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

Sil*_*ght 24

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

MyItem.objects.filter(title__search="some search text")
Run Code Online (Sandbox Code Playgroud)

有一点是 - 你不能从Django模型定义全文索引,你需要直接在数据库中进行(使用PHPMyAdmin或SQL查询)

有关字段查找,请参阅Django文档 search

  • 所以没有办法在多个列上执行此操作,对吧? (3认同)
  • 使用 MySQL 时,默认情况下这不起作用,因为它不使用表类型 MyISAM。您收到错误“所使用的表类型不支持 FULLTEXT 索引” (2认同)

tbr*_*tbr 9

之前收视率最高的答案被弃用。从Django 1.10开始,不再search为MySQL数据库提供字段查找(请参见1.10文档中搜索部分)。

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)
Run Code Online (Sandbox Code Playgroud)

  • 现在这需要更高,需要更多最新答案,并且不依赖外部软件包。 (2认同)

Dom*_*ton 7

我不知道现在是否有帮助,但我已经为 Django 创建了一个新的 Python 库,它支持MySQL 和 MariaDB 的一列或多列本机全文搜索引擎:

您可以在GitHub 存储库上查看它

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

如果您已经配置了索引并SearchManager为您的模型设置了 ,您应该能够运行如下命令:

Mymodel.objects.search('Something')
Mymodel.objects.search('Somet*')
Mymodel.objects.search('+Something -Awesome')
Run Code Online (Sandbox Code Playgroud)

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

干杯多米


mic*_*ael 5

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

这是经过深思熟虑的.