建议像google与postgresql三元组和全文搜索

时间:2012-05-16 15:44:12

标签: postgresql full-text-search trigraphs

我想进行google suggestions等文字搜索。

由于神奇的PostgreSQL,我正在使用Postgis

我正在考虑使用FTS,但我发现它无法搜索partial words,因此我找到了this question,并看到了trigrams是如何工作的。

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

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

是否可以使全文搜索和Trigrams在PGSQL中协同工作?

2 个答案:

答案 0 :(得分:4)

你可以在Postgres中做到这一点,并且不需要Lucene。

您可以在tsquerytsvector中引用短语,如下所示。您可以在:*字词后添加tsquery进行前缀搜索:

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;是等价的。

答案 1 :(得分:1)

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

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

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