我正在使用带有固定数据库内容的sqlite3数据库的Django应用程序。固定是指数据库的内容不会随时间变化。该模型是这样的:
class QScript(models.Model): ch_no = models.IntegerField() v_no = models.IntegerField() v = models.TextField()
该表中大约有6500条记录。给定一个可能缺少某些单词或某些单词拼写错误的文本,我需要确定其ch_no和v_no。例如,如果vdb中有一个文本为 “ This is an example verse” 的字段, 则 给定的文本(例如 “ This a egsample verse”) 应该给我ch_no和v_nodb。我相信可以使用全文搜索来完成。
ch_no
v_no
v
全文搜索可以做到吗?根据我的研究,我的猜测是可以的,正如sqlite3页面中所说: 全文搜索是“ Google,Yahoo和Bing对放置在万维网上的文档所做的事情” 。引用SO,我也与许多其他文章一起阅读了这篇文章,但是没有找到与我的要求 最接近的内容 。
如何在Django模型中使用FTS? 我读了这篇文章,但没有帮助。似乎太过时了。在这里阅读: “ …需要直接操作数据库以添加全文索引” 。搜索提供了大多数与MySQL相关的信息,但是我需要在sqlite3中进行。那么如何在sqlite3中进行 直接操作 呢?
我坚持使用sqlite3的选择正确吗?还是应该使用其他方式(例如Alex Morozov所说的haystack + elasticsearch )?我的数据库不会再增大,而且我研究过,对于小型数据库,sqlite 几乎总是 更好(我的情况与使用sqlite时的第四名相匹配)。
我认为,尽管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,这相对容易。