2012-05-16 41 views
7

我想要做一个文本搜索,如google suggestions建议像谷歌与Postgresql卦和全文搜索

由于神奇的Postgis,我使用PostgreSQL

我想使用FTS,但我看到它无法搜索partial words,所以我发现this question,并看到了如何trigrams作品。

主要问题是我正在使用的搜索引擎是西班牙语。 FTS在干扰和dictionaries(同义词,拼写错误),UTF等方面效果很好。 Trigrams适用于部分文字,但它们仅适用于ASCII,并且(显然)它们不使用词典之类的东西。

我在想如果有什么方法可以使用两者中最好的东西。

是否有可能使全文搜索和Trigrams在PGSQL中一起工作?

回答

3

你可以在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;是等同的。

+0

哇!你能否添加一个关于这个三重报价文档的参考? – jperelli

+1

三重报价实际上是正常的SQL,我只是逃避与另一个单引号。文档在这里提到它:http://www.postgresql.org/docs/9.3/static/textsearch-controls.html –

2

我建议看看Lucene。它可以本地集成在Java中,很容易在.NET中使用,或者在PHP中使用SOLR和Web服务。

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

最后但并非最不重要的一点,它也是非常快的(对于大容量,比如说4Gb索引〜数据库中的5000000行,它比Postgres数据库快得多)。

+3

我会用类似的解决方案,使用elasticsearch,但我不能接受,因为它不能回答这个问题(万一有人到这里寻找答案)。谢谢! – jperelli