小编典典

如何在Django的sqlite3数据库中使用全文搜索?

python

我正在使用带有固定数据库内容的sqlite3数据库的Django应用程序。固定是指数据库的内容不会随时间变化。该模型是这样的:

class QScript(models.Model):
    ch_no = models.IntegerField()
    v_no = models.IntegerField()
    v = models.TextField()

该表中大约有6500条记录。给定一个可能缺少某些单词或某些单词拼写错误的文本,我需要确定其ch_nov_no。例如,如果vdb中有一个文本为
“ This is an example verse” 的字段, 给定的文本(例如 “ This a egsample verse”)
应该给我ch_nov_nodb。我相信可以使用全文搜索来完成。

我的查询是:

  1. 全文搜索可以做到吗?根据我的研究,我的猜测是可以的,正如sqlite3页面中所说: 全文搜索是“ Google,Yahoo和Bing对放置在万维网上的文档所做的事情” 。引用SO,我也与许多其他文章一起阅读了这篇文章,但是没有找到与我的要求 最接近的内容

  2. 如何在Django模型中使用FTS? 我读了这篇文章,但没有帮助。似乎太过时了。在这里阅读: “ …需要直接操作数据库以添加全文索引” 。搜索提供了大多数与MySQL相关的信息,但是我需要在sqlite3中进行。那么如何在sqlite3中进行 直接操作 呢?


编辑:

我坚持使用sqlite3的选择正确吗?还是应该使用其他方式(例如Alex
Morozov所说的haystack +
elasticsearch )?我的数据库不会再增大,而且我研究过,对于小型数据库,sqlite 几乎总是
更好(我的情况与使用sqlite时的第四名相匹配)。


阅读 240

收藏
2021-01-20

共1个答案

小编典典

我认为,尽管sqlite是一款了不起的软件,但其全文搜索功能却非常有限。相反,您可以使用带有某些后端(例如Elasticsearch)的Haystack
Django应用程序为数据库建立索引。就FTS而言,具有此设置(仍然能够访问您的sqlite数据库)似乎是最可靠,最灵活的方式。

Elasticsearch具有基于Levenshtein距离的模糊搜索(简而言之,它将处理您的“示例”查询)。因此,您需要做的是正确的查询类型:

from haystack.forms import SearchForm
from haystack.generic_views import SearchView
from haystack import indexes


class QScriptIndex(indexes.SearchIndex, indexes.Indexable):
    v = indexes.CharField(document=True)

    def get_model(self):
        return QScript


class QScriptSearchForm(SearchForm):
    text_fuzzy = forms.CharField(required=False)

    def search(self):        
        sqs = super(QScriptSearchForm, self).search()

        if not self.is_valid():
            return self.no_query_found()

        text_fuzzy = self.cleaned_data.get('text_fuzzy')
        if text_fuzzy:
            sqs = sqs.filter(text__fuzzy=text_fuzzy)

        return sqs


class QScriptSearchView(SearchView):        
    form_class = QScriptSearchForm

更新:只要PostgreSQL具有Levenshtein距离功能,您还可以将其用作Haystack后端以及独立的搜索引擎。如果选择第二种方法,则必须实现自定义查询表达式,如果使用的是最新版本的Django,这相对容易。

2021-01-20