【问题标题】:Postgresql prefix wildcard for full text全文的 Postgresql 前缀通配符
【发布时间】:2012-10-15 19:22:31
【问题描述】:

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

在搜索词后加上后缀通配符似乎很容易,但是我不知道如何指定前缀通配符。

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

SELECT "t1".* 
FROM "t1" 
WHERE (to_tsvector('simple', "t1"."city") @@ to_tsquery('simple', 'don:*') )

应该返回匹配“伦敦”的结果

但是我似乎无法进行前缀搜索...

SELECT "t1".* 
FROM "t1" 
WHERE (to_tsvector('simple', "t1"."city") @@ to_tsquery('simple', ':*don') )

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

SELECT "t1".* 
FROM "t1" 
WHERE (to_tsvector('simple', "t1"."city") @@ to_tsquery('simple', ':*don:*') )

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

【问题讨论】:

    标签: sql postgresql full-text-search full-text-indexing


    【解决方案1】:

    全文搜索适用于查找单词,而不是子字符串。

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

    select * from depesz blog 上有一个very good example of using pg_trgm for substring search

    【讨论】:

    • 感谢您的回答,我们已经在查询方面实现了类似的功能,因此通过添加三元组,希望这会给我们带来所需的性能提升。再次感谢。
    • 如何在 2 列而不是 1 列上使用 gist (column_name gist_trgm_ops)?
    【解决方案2】:

    一种疯狂而疯狂的做法是创建一个包含所有文档的 tsvector 索引,相反。并反转您对后缀搜索的查询。

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

    select
    reverse('brown fox')::tsvector @@ (reverse('rown') || ':*')::tsquery --true
    

    【讨论】:

    • 不幸的是,如果您查询row 而不是rown,它将不会返回结果。原因是它会从头到尾检查,但只从第一个(在这种情况下是最后一个)字母开始检查,而不是从中间检查。
    • @BernardPotocki 不在规范中;) 没有子字符串的全文搜索就够难了。如果你想搜索 row 并匹配 brown 那么这是一个很好的正则表达式用例
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多