【问题标题】:Does the phrase search operator <-> work with JSONB documents or only relational tables?短语搜索运算符 <-> 是否适用于 JSONB 文档或仅适用于关系表?
【发布时间】:2019-09-03 00:09:07
【问题描述】:

短语搜索运算符 &lt;-&gt; 是否适用于 JSONB 文档或仅适用于 PostgreSQL 中的关系表?

我还没有尝试过这个,因为我还没有设置 Postgres 托管。这个问题的答案将有助于确定我将使用什么数据库和什么工具。

我在以下位置找到了这个示例代码:https://compose.com/articles/mastering-postgresql-tools-full-text-search-and-phrase-search/:

SELECT document_id, document_text FROM documents  
WHERE document_tokens @@ to_tsquery('jump <-> quick');  

我只需要知道 JSONB 文档是否支持此运算符。

【问题讨论】:

  • 那么你有答案了吗?

标签: postgresql full-text-search jsonb string-search


【解决方案1】:

短语搜索功能已集成到text search data type tsquery。您显示的text search operator @@tsvector 放在左侧,将tsquery 放在右侧。 tsvector 可以由任何字符类型以及 JSON 文档构建。

相关:

您可以使用dedicated functions 之一将jsonjsonb 文档转换为文本搜索向量:

to_tsvector()
json(b)_to_tsvector()

请注意,这些仅包括 JSON 文档中的 ,而不包括 。通常,这就是您想要的。 基本示例:

SELECT to_tsvector(jsonb '{"foo":"jump quickly"}')
    @@ to_tsquery('jump <-> quick:*');

在短语搜索的顶部展示前缀匹配。见:

或者,您可以简单地从 JSON 文档的 text 表示创建 tsvector 以包含键名:

SELECT to_tsvector((jsonb '{"foo-fighter":"jump quickly"}')::text)
    @@ to_tsquery('foo <-> fight:*');

显然会产生更大的tsvector

两者都可以被索引(这是文本搜索的重点)。只有索引绑定到关系表。 (你可以index the expression!)
表达式本身可以应用于任何值,而不是像您似乎暗示的那样绑定到表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    相关资源
    最近更新 更多