【问题标题】:Search engine like full text search in PostgreSQL搜索引擎,如 PostgreSQL 中的全文搜索
【发布时间】:2020-03-22 12:45:36
【问题描述】:

我有一个表中的标题和描述列表,它们在 tsvector 列中被索引。如何在 Postgres 中为这些字段实现类似 Google 搜索的全文搜索功能。我尝试了标准 Postgres 提供的各种功能,例如

to_tsquery('apple | orange') -- apple | orange

只要该函数具有这些术语之一,它就会返回行,因此它不会在顶部产生高度相关的结果,而顶部应该同时具有这两个术语。

plainto_tsquery('apple orange') -- apple & orange

此函数需要查询中的所有术语。但我希望首先得到同时包含 apple 和 orange 的结果,但仍然可以在稍后的结果中得到包含这些术语之一的结果。

phraseto_tsquery('apple orange') -- apple <> orange

此函数仅匹配 orange 后跟 apple,反之则不匹配。但对我来说,橙苹果也很重要。

我也尝试过websearch_to_tsquery(),但它的行为与上述功能非常相似。

如何让 Postgres 首先列出高度相关的行,其中包含搜索查询中的大部分术语,无论术语的顺序如何,然后再列出术语数量较少的行?

【问题讨论】:

    标签: postgresql search full-text-search


    【解决方案1】:
    to_tsquery('apple | orange')   --  apple | orange
    

    只要该函数具有这些术语之一,它就会返回行,因此它不会在顶部产生高度相关的结果,而顶部应该同时具有这两个术语。

    除非您告诉它如何对行进行排序,否则单个查询的行会以任意顺序返回。没有 ORDER BY 就没有“顶部”,只是碰巧先看到的东西。

    如何让 Postgres 首先列出高度相关的行,其中包含搜索查询中的大部分术语,无论术语的顺序如何,然后再列出术语数量较少的行?

    使用| 运算符,然后使用 ts_rank、ts_rank_cd 或您自己编写的自定义排名函数对这些行进行排名。为提高性能,您可能希望先使用 & 运算符,然后如果您没有获得足够的行数,则恢复为 |

    内置排名功能不关心顺序,也不关心接近度。所以他们可能不会做你想做的事。但是自己写并不是特别容易,所以我至少会先尝试一下。

    如果websearch_to_tsquery或phraseto_tsquery的引入也能引入一些相应的排名函数就好了。但由于他们发明的只是有序的接近,而不是无序的接近,如果它们确实存在的话,你不太可能会想要它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-16
      • 1970-01-01
      • 2018-07-22
      • 1970-01-01
      • 2021-01-24
      • 2013-03-09
      • 2010-09-22
      相关资源
      最近更新 更多