Postgresql前缀通配符为全文

Pau*_*rey 20 sql postgresql full-text-search full-text-indexing

我正在尝试使用Postgresql运行全文查询,该查询可以使用通配符来满足部分匹配.

在搜索词后面有一个后缀通配符似乎很容易,但我无法弄清楚如何指定前缀通配符.

例如,我可以使用类似的东西轻松地执行后缀搜索.

SELECT "t1".* 
FROM "t1" 
WHERE (to_tsvector('simple', "t1"."city") @@ to_tsquery('simple', 'don:*') )
Run Code Online (Sandbox Code Playgroud)

应该返回匹配"伦敦"的结果

但是,我似乎不能像...那样做前缀搜索

SELECT "t1".* 
FROM "t1" 
WHERE (to_tsvector('simple', "t1"."city") @@ to_tsquery('simple', ':*don') )
Run Code Online (Sandbox Code Playgroud)

理想情况下,我希望在搜索词的前端和末尾添加一个通配符,例如......

SELECT "t1".* 
FROM "t1" 
WHERE (to_tsvector('simple', "t1"."city") @@ to_tsquery('simple', ':*don:*') )
Run Code Online (Sandbox Code Playgroud)

我可以使用LIKE条件但是我希望能从Postgres中的全文搜索功能中受益.

Tom*_*zky 13

全文搜索有助于查找单词,而不是子字符串.

对于子字符串搜索,您最好使用PostgreSQL 9.1和/ 或索引like '%don%'提供的pg_trgm扩展.但是你的索引会非常大(甚至比你的表大几倍)并且写入性能不是很好.using gin (column_name gin_trgm_ops)using gist (column_name gist_trgm_ops)

有一个很好的例子,select*from depesz博客使用pg_trgm进行子字符串搜索.


Nei*_*gan 5

一种狂野而疯狂的做法是创建所有文档的tsvector索引,反之亦然.并反转您对后缀搜索的查询.

这基本上是Solr用其ReversedWildcardFilterFactory做的事情

select
reverse('brown fox')::tsvector @@ (reverse('rown') || ':*')::tsquery --true
Run Code Online (Sandbox Code Playgroud)

  • 实用与否,这是一个邪恶的酷伎俩. (3认同)
  • 不幸的是,如果你查询 `row` 而不是 `rown`,它不会返回结果。原因是它会从头到尾检查,但再次仅从第一个(在这种情况下为最后一个)字母开始,而从不从中间开始。 (2认同)