【问题标题】:PostgreSQL JSON quick search (search value in from any key)PostgreSQL JSON 快速搜索(从任意键中搜索值)
【发布时间】:2017-08-31 09:48:19
【问题描述】:

我尝试在 PostgreSQL JSONB 列中找到快速搜索功能的解决方案。要求是我们可以在任何 JSON 键中搜索值。

表结构:

创建表实体 ( id bigint 非空, jtype 字符变化(64)NOT NULL, jdata jsonb, CONSTRAINT entity_pk PRIMARY KEY (id) )

想法是我们将不同类型的json存储在一张表中,jtype定义json实体类型,jdata-json数据,例如:

   jtype='person',jvalue = '{"personName":"John", "personSurname":"Smith", "company":"ABS Software", "position":"Programmer"}'
   jtype='company', jvalue='{"name":"ABS Software", "address":"Somewhere in Alaska"}'

目标是进行快速搜索,用户可以键入“ABS”并找到记录 - 公司和在公司工作的人。

Oracle DB 的模拟是函数 CONTAINS:

SELECT jtype, jvalue FROM entity WHERE CONTAINS (jvalue, 'ABS') > 0;

GIN 索引只允许搜索键/值对

GIN 索引可用于有效地搜索键或键/值 在大量 jsonb 文档(基准)中出现的对。二 提供 GIN“操作员类”,提供不同的性能 和灵活性的权衡。

https://www.postgresql.org/docs/current/static/datatype-json.html#JSON-INDEXING

【问题讨论】:

    标签: json postgresql jsonb postgresql-9.6


    【解决方案1】:

    https://github.com/postgrespro/jsquery 可能对您正在寻找的东西有用,尽管我以前没有使用过它。

    【讨论】:

      【解决方案2】:

      从 Postgresql 10 开始,您可以在 JSON/JSONB 列上创建索引,然后在该列的值中进行全文搜索,如下所示:

      libdata=# SELECT bookdata -> 'title'
               FROM bookdata
               WHERE to_tsvector('english',bookdata) @@ to_tsquery('duke');            
      ------------------------------------------
      "The Tattooed Duke"
      "She Tempts the Duke"
      "The Duke Is Mine"
      "What I Did For a Duke"
      

      更多文档可以在here找到。

      【讨论】:

      • 谢谢,我们刚刚迁移到 Posgresql 10,我们将使用此功能
      猜你喜欢
      • 2022-01-24
      • 2019-10-04
      • 2017-11-11
      • 2017-10-14
      • 2015-03-20
      • 2021-09-26
      • 2021-11-01
      • 2011-05-11
      • 1970-01-01
      相关资源
      最近更新 更多