我想进行google suggestions等文字搜索。
由于神奇的PostgreSQL,我正在使用Postgis。
我正在考虑使用FTS,但我发现它无法搜索partial words,因此我找到了this question,并看到了trigrams是如何工作的。
主要问题是我正在研究的搜索引擎是用于西班牙语。 FTS在词干和dictionaries(同义词,拼写错误),UTF等方面表现出色。 Trigrams适用于部分单词,但它们只适用于ASCII,并且(显然)它们不使用字典之类的东西。
我在想是否有任何方式可以使用两者中最好的东西。
是否可以使全文搜索和Trigrams在PGSQL中协同工作?
答案 0 :(得分:4)
你可以在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()
会删除您的报价。您可以编写自己的版本(不是那么难),或者在它们之后进行一些后处理来构建您的术语n-gram。
上面的额外单引号只是逃避。 select $$ i heart 'new york city' $$::tsvector;
是等价的。
答案 1 :(得分:1)