json - PostgreSQL 9.4 - jsonb 数组的元素到 ts_vector 中

标签 json postgresql full-text-search tsvector nosql

我目前正在使用 PostgreSQL 中的 NOSQL 数据库。它包含 3 个表,其中包含 id、数据 (jsonb) 和 tsv (tsvector) 字段。

我在从数据字段创建 tsvector 时遇到了一些困难。使用 jsonb 对象我没有任何问题:

对于这样的事情:

    {"genres":{"genre": "Electronic"}, 
    "labels": {"label": {"@name": "Turbo", "@catno": "HEMI-06PU"}}, 
    "styles": {"style": ["House", "Techno", "Tech House"]}}

我用过:

UPDATE rel SET tsv = setweight(to_tsvector(coalesce(data->>'genre','')),'B') || 
    setweight(to_tsvector(coalesce(data->'labels'->'label'->>'@name','')),'C') || 
    setweight(to_tsvector(coalesce(data->'styles'->>'style','')),'D');

但现在我也有像这样的嵌套结构:

    "tracklist": {"track": [
     {"title": "Untitled", 
      "artists": {"artist": {"id": "676", "anv": null, "join": ",", "name": "Peter Benisch", "role": null, "tracks": null}}, 
      "duration": "5:42", 
      "position": "1"}, 
     {"title": "Good Morning", 
      "artists": {"artist": {"id": "166", "anv": null, "join": ",", "name": "Fred Everything", "role": null, "tracks": null}}, 
      "duration": "4:10", 
      "position": "2"}]

我试图将“轨道”数组中所有轨道的每个标题都放入我的 tsvector 中。整个表格中的轨道数量可能不同。

我试过用

    (jsonb_array_elements(data->'tracklist'->'track'))->>'title' 

每行给了我一个标题。

任何人都可以帮助将这些行作为 to_tsvector() 函数的输入吗?或者对此有不同的解决方案吗?

最佳答案

也许可以帮到你,我的表有 prop 作为 jsonb 数据

{"title":"title 1","description":"description bla","tags":["tag1","tag2"]} 

当我得到标签时:

SELECT prop->'tags' from test;

这会返回一个像这样的对象

{"tags":["tag1","tag2"]}

在这种情况下,我使用 'tags'->'tags' 并获取元素数组

SELECT prop->'tags'->'tags' from test;

这个返回数组:

["tag1","tags2"]

使用此函数 jsonb_array_elements_text() 获取数组中的元素并使用 WITH 子句封装结果并像行一样返回

WITH r AS
(Select jsonb_array_elements_text(prop->'tags'->'tags') AS tags
FROM test)
SELECT to_tsvector('simple',string_agg(tags,' ')) AS ts_vector FROM r;

当标签、用户或其他字段“简单”时推荐使用,因为这些字段没有“停用词”

关于json - PostgreSQL 9.4 - jsonb 数组的元素到 ts_vector 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30660298/

相关文章:

asp.net-mvc - ASP.NET MVC Web API : Posting a list of objects

sql - CASE...WHEN 在 Postgresql 中的 WHERE 子句中

postgresql - 管理 postgresql 数据库更新的技术

mysql - 如何在 Rails 中集成 "Did you mean"功能?

mysql - 对关系表进行 SQL 多关键字全文搜索以返回按相关性评级的所有结果

python-instagram 示例 (404) 无法解析响应,JSON 无效

c# - 我可以让 Json.net 使用 "primary"构造函数反序列化 C# 9 记录类型,就好像它有 [JsonConstructor] 一样?

javascript - 使用ajax清空(val)html字段并在数据库中的该字段中输入下一个值

postgresql - 我试图将 postgresql md5 更改为 scram-sha-256,但我得到 FATAL 密码身份验证失败

mysql - MySQL 自然搜索 50% 阈值的解决方法