阅读(4078) (0)

Django4.0 搜索-文档搜索

2022-03-15 09:42:54 更新

标准数据库操作对于大量文本搜索来说太过简陋了。虽然上面的示例可以看作是对字符串的操作,但是全文搜索查看的是实际的单词。依据所使用的系统,可以采用下面的某些方法:

  • 忽略 “停用词语”,例如 "a","the","and"。
  • 词干化,这样 "pony" 和 "ponies" 会被认为是一样的。
  • 根据不同的标准为单词设置权重,例如其在文本中出现的频率,或所属字段(如标题或关键字)的重要性。

使用搜索软件有很多选项,最常见的有 Elastic 和 Solr。它们都是基于全文搜索的解决方案。要用它们搜索来自 Django 模型的数据,你需要一个抽象层,将数据(包括对数据库 id 的指针)转换为文本文档。当使用该引擎的某次搜索返回了一份文档,你可以在数据库中查看它。有很多第三方库被设计为处理这种问题。

PostgreSQL 支持

PostgreSQL 内置了其专属的全文本搜索实现。虽然并不像其它搜索引擎那样强大,但它的优点是内置在数据库中,所以它能很方便的与其它关联查询条件进行联合查询,如按分类查询。
django.contrib.postgres​ 模块提供了一些助手函数来执行这些查询。例如,查询可能筛选出所有提到了 "cheese" 的博客条目:

>>> Entry.objects.filter(body_text__search='cheese')
[<Entry: Cheese on Toast recipes>, <Entry: Pizza recipes>]

你也可以在联合字段或关联模型上进行筛选:

>>> Entry.objects.annotate(
...     search=SearchVector('blog__tagline', 'body_text'),
... ).filter(search='cheese')
[
    <Entry: Cheese on Toast recipes>,
    <Entry: Pizza Recipes>,
    <Entry: Dairy farming in Argentina>,
]