建议像谷歌与Postgresql卦和全文搜索
我想做一个像Google建议一样的文本搜索。
由于神奇的Postgis,我使用PostgreSQL。
我在考虑使用FTS,但是我发现它不能搜索部分单词,所以我找到了这个问题,并且看到了trigrams如何工作。
主要的问题是我正在使用的搜索引擎是西班牙语。 FTS在词干和词典(同义词,拼写错误),UTF等等方面运作良好。 Trigrams适用于部分词汇,但它们仅适用于ASCII,并且(显然)它们不使用词典之类的东西。
我在想是否有任何方法可以使用两者中最好的东西。
是否有可能使全文搜索和Trigrams在PGSQL中一起工作?
你可以在Postgres中做到这一点,并且不需要Lucene。
你可以在tsquery
或tsvector
引用短语,如下所示。 您可以在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()
会[plain]to_tsquery()
你的引号。 你可以编写你自己的版本,但不要这么做(这并不难),或者在它们之后做一些后期处理来建立你的术语n-gram。
上面的额外单引号只是逃避。 select $$ i heart 'new york city' $$::tsvector;
是等同的。
我会建议看看Lucene。 它可以本地集成在Java中,很容易在.NET中使用,或者在PHP中使用SOLR和Web服务。
它具有很强的自由文本搜索功能,开箱即用的排名,使用不同分析器支持不同的语言(链接为西班牙文)。
最后但并非最不重要的一点是,它的速度也非常快(对于大容量来说,比如4Gb索引〜数据库中500万行,它比Postgres数据库要快得多)。
链接地址: http://www.djcxy.com/p/59465.html上一篇: suggest like google with postgresql trigrams and full text search