Postgres полнотекстовый поиск на JSON - PullRequest
0 голосов
/ 08 октября 2018

Я выгружаю значение 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 голосов
/ 09 октября 2018

Поскольку ваш ключ и значение находятся в непосредственной близости, я бы предложил поиск фразы (требуется Postgres 9.6 или более поздняя версия):

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

Или:

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

Подходит только для двух поисковых терминов, расположенных рядом друг с другом (игнорируя символы шума между ними).Существует также вариант оператора <N> для терминов, разделенных на пару слов.

Подробное объяснение:

Вы даже можете комбинировать это с сопоставлением префиксов:

...