9

我想做一个像谷歌建议这样的文本搜索。

我使用PostgreSQL因为神奇的Postgis

我正在考虑使用FTS,但我发现它无法搜索部分单词,所以我找到了这个问题,并了解了trigrams的工作原理。

主要问题是我正在研究的搜索引擎是西班牙语。FTS 在词干和字典(同义词、拼写错误)、UTF 等方面表现出色。Trigrams 对部分单词很有效,但它们只适用于 ASCII,而且(显然)它们不使用字典之类的东西。

我在想是否有任何方法可以使用两者中最好的东西。

是否可以让全文搜索和三元组在 PGSQL 中一起工作?

4

2 回答 2

7

您可以在 Postgres 中执行此操作,并且不需要 Lucene。

tsquery您可以在下面引用或tsvector喜欢下面的短语。您可以在词:*后添加 atsquery来进行前缀搜索:

select
'''new york city'''::tsvector   @@ '''new yo'':*'::tsquery, --true
'''new york times'''::tsvector  @@ '''new yo'':*'::tsquery, --true
'''new york'''::tsvector        @@ '''new yo'':*'::tsquery, --true
'''new'''::tsvector             @@ '''new yo'':*'::tsquery, --false
'new'::tsvector                 @@ '''new yo'':*'::tsquery, --false
'new york'::tsvector            @@ '''new yo'':*'::tsquery  --false

主要问题是,to_tsvector()并且[plain]to_tsquery()会剥夺你的报价。您可以编写自己的不这样做的版本(这并不难),或者在它们之后进行一些后处理以构建您的术语 n-gram。

上面多余的单引号只是转义。select $$ i heart 'new york city' $$::tsvector;是等价的。

于 2014-07-29T06:05:23.450 回答
-1

我建议看看Lucene。它可以在 Java 中本地集成,也可以在 .NET 中轻松集成,或者在 php 中使用 SOLR 和 Web 服务。

它具有强大的自由文本搜索功能、开箱即用的术语排名、使用不同分析器支持不同语言(西班牙语链接)。

最后但同样重要的是,它也非常快(对于大容量,比如 4Gb 索引 ~ 数据库中的 5 000 000 行,它比 Postgres 数据库快得多)。

于 2012-08-17T20:28:38.103 回答