JSON上的Postgres全文搜索

时间:2018-10-08 15:41:18

标签: json postgresql pattern-matching full-text-search tsvector

我将json值转储到text字段中,因为我有一些无效的json数据,这些数据无法存储在json / jsonb中。在下面的示例中,我想搜索并突出显示"Value16": 16711680,但是在"Value20": 16711680上我也很受欢迎。

{
  "Value01": 122,
  "Value02": 25,
  "Value03": 9,
  "Value04": 538,
  "Value05": false,
  "Value06": 65534,
  "Value07": 2,
  "Value08": 0,
  "Value09": 2,
  "Value10": 1,
  "Value11": 0,
  "Value12": 0,
  "Value13": false,
  "Value14": 0,
  "Value15": 0,
  "Value16": 16711680,
  "Value17": 0,
  "Value18": 0,
  "Value19": 0,
  "Value20": 16711680,
  "Value21": 0,
  "Value22": 0
}

我尝试了以下查询,但是没有用。我需要在这里使用任何转义字符吗?

to_tsquery('Value16<->16711680')

to_tsquery('Value16&16711680')

基本上,我只想在键和值一起匹配时将它们匹配。
如何在json文本中搜索键/值对?

1 个答案:

答案 0 :(得分:2)

由于您的键和值直接相邻,因此我建议您进行短语搜索(需要Postgres 9.6 或更高版本):

...
WHERE my_tsvector @@ to_tsquery('simple', 'Value16 <-> 16711680');

或者:

...
WHERE my_tsvector @@ phraseto_tsquery('simple','Value16 16711680');

仅限定两个相邻的搜索词(忽略它们之间的噪音字符)。运算符还有<N>变体,用于将术语分开几个单词。

详细说明:

您甚至可以将其与前缀匹配结合使用: