【问题标题】:Partial matches with PostgreSQL full text search部分匹配 PostgreSQL 全文搜索
【发布时间】:2017-06-05 17:50:36
【问题描述】:

Django's documentation 用于 PostgreSQL 全文搜索使用以下示例:

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

我想使用它,但要通过仅搜索单词的一部分来获得相同的结果。目前这没有结果:

>>> Entry.objects.filter(body_text__search='Chee')
[]

基本上,我希望获得与使用body_text__icontains 相同的结果。我想使用全文搜索,以便在完成这项工作后,我可以利用可重用搜索向量、加权查询和排名等功能。

有没有办法通过部分单词查询获得结果?

【问题讨论】:

标签: python django postgresql full-text-search


【解决方案1】:

django.contrib.postgres.search modulePotgreSQL's full-text search engine 上实现。

具体来说,它将文本值转换为 PostgreSQL “tsvector” 值,并将您的搜索词转换为 PostgreSQL “tsquery” 值。所以,如果你正在使用这个功能,你应该了解how to search using tsquery

你给出的例子在 PostgreSQL 中是这样说明的:

=> SELECT 'Cheese on Toast recipes'::tsvector @@ 'Cheese'::tsquery;
 ?column? 
----------
 t
(1 row)

=> SELECT 'Cheese on Toast recipes'::tsvector @@ 'Chees'::tsquery;
 ?column? 
----------
 f
(1 row)

因此,'Chees' 的 tsquery 与文本不匹配。 Django 告诉你正确的事情。

一个匹配的tsquery例子是'Chees:*':

=> SELECT 'Cheese on Toast recipes'::tsvector @@ 'Chees:*'::tsquery;
 ?column? 
----------
 t
(1 row)

更大的答案是:如果您想正确使用此功能,您需要了解如何以 PostgreSQL 期望的方式形成全文搜索查询:-)

【讨论】:

  • 其实django.contrib.postgres.search模块会产生如下查询:SELECT to_tsvector('Cheese on Toast recipes') @@ plainto_tsquery('Cheese');和你写的很不一样。
  • 实际上,我没有提供任何 Django 生成的示例,因此您的“实际上”与我写的内容并不矛盾 :-) 提供的示例是为了说明如何以PostgreSQL 会话。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 2022-08-11
  • 2018-01-12
  • 2011-03-04
  • 2023-01-02
  • 1970-01-01
  • 2018-04-24
相关资源
最近更新 更多