Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 Full-Text Search в JSON ?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 1586
Послушал Бартунова о реализации jsonb и т.д. и возник вопрос:
На внутренних текстовых полях можно строить полнотекстовые индексы и делаить поиск по ним?
5 окт 17, 16:17    [20845864]     Ответить | Цитировать Сообщить модератору
 Re: Full-Text Search в JSON ?  [new]
vyegorov
Member

Откуда: Рига
Сообщений: 1020
Ролг Хупин,

Что значит “внутренние текстовые поля”?
5 окт 17, 22:48    [20846750]     Ответить | Цитировать Сообщить модератору
 Re: Full-Text Search в JSON ?  [new]
qwwq
Member

Откуда:
Сообщений: 2341
Ролг Хупин,
если иммутабной функцией можете вернуть своё "унудреннее дегздовое боле" (штобыононезначило) -- можете и построить индекс--шминдекс.

или вам "вообще" ?
какой поиск хотите ? черканите пару формул,чоль.
5 окт 17, 23:16    [20846817]     Ответить | Цитировать Сообщить модератору
 Re: Full-Text Search в JSON ?  [new]
jim0m
Member

Откуда:
Сообщений: 3
больше похоже на то что автор имел поиск в json, но не осилил формулировку, а так, читая What's New in 10 https://wiki.postgresql.org/wiki/New_in_postgres_10#Full_Text_Search_support_for_JSON_and_JSONB
6 окт 17, 08:46    [20847076]     Ответить | Цитировать Сообщить модератору
 Re: Full-Text Search в JSON ?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 1586
jim0m
больше похоже на то что автор имел поиск в json, но не осилил формулировку, а так, читая What's New in 10 https://wiki.postgresql.org/wiki/New_in_postgres_10#Full_Text_Search_support_for_JSON_and_JSONB


автор осилил форумлировку, да, именно полнотекстовое индексирование внутренних полей и поиск в них имелся в виду.
6 окт 17, 10:40    [20847348]     Ответить | Цитировать Сообщить модератору
 Re: Full-Text Search в JSON ?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 1586
qwwq
Ролг Хупин,
если иммутабной функцией можете вернуть своё "унудреннее дегздовое боле" (штобыононезначило) -- можете и построить индекс--шминдекс.

или вам "вообще" ?
какой поиск хотите ? черканите пару формул,чоль.


Полнотесктовый поиск и хочу, какие тут формулы могут быть?
Именно по отдельным полям, а не весь JSON объект как текст.

"унудреннее дегздовое боле" (штобыононезначило) - это жызондовое полдэ, выражаясь вашим странным езыгом

Full Text Search support for JSON and JSONB
You can now create Full Text Indexes on JSON and JSONB columns.

This involves converting the JSONB field to a `tsvector`, then creating an specific language full-text index on it:
6 окт 17, 10:43    [20847359]     Ответить | Цитировать Сообщить модератору
 Re: Full-Text Search в JSON ?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 1586
vyegorov
Ролг Хупин,

Что значит “внутренние текстовые поля”?



Я наивно подумал, что можно будет индексировать и искать по внутренним полям JSON, оказалось нет, индексируется весь JSON, в нем ищется.
Например,

drop table if exists bookdata

create table bookdata
(id  serial NOT NULL PRIMARY KEY,
 info json NOT NULL
)

CREATE INDEX bookdata_fts ON bookdata
               USING gin (( to_tsvector('english',info) ));

INSERT INTO bookdata (info)
VALUES
 ( '{ "title": "The Tattooed Duke", "items": {"product": "Diaper","qty": 24}}'),
 ( '{ "title": "She Tempts the Duke", "items": {"product": "Toy Car","qty": 1}}'),
 ( '{ "title": "The Duke Is Mine", "items": {"product": "Toy Train","qty": 2}}'),
 ( '{ "title": "What I Did For a Duke", "items": {"product": "Toy Train","qty": 2}}'),
 ('{ "title": "King Kong", "items": {"product": "Toy Train","qty": 2}}');

SELECT info -> 'title' as title
FROM bookdata
WHERE to_tsvector('english',info) @@ to_tsquery('duke');            


------ !
SELECT info -> 'title' as title
FROM bookdata
WHERE to_tsvector('english',info) @@ to_tsquery('diaper');            


Мне надо, чтобы "diaper" не индексировался и не находился, но, естественно он будет искаться.
7 окт 17, 11:30    [20850534]     Ответить | Цитировать Сообщить модератору
 Re: Full-Text Search в JSON ?  [new]
qwwq
Member

Откуда:
Сообщений: 2341
Ролг Хупин
...
Мне надо, чтобы "diaper" не индексировался и не находился, но, естественно он будет искаться.


я же говорил "черкни пару формул"

предположу (могу врать), что дону хотелось бы этакого:
+
drop table if exists bookdata;

create table bookdata
(id  serial NOT NULL PRIMARY KEY,
 info json NOT NULL
);

CREATE INDEX bookdata_fts ON bookdata
               USING gin (( to_tsvector('english',info->'title') ));

INSERT INTO bookdata (info)
VALUES
 ( '{ "title": "The Tattooed Duke", "items": {"product": "Diaper","qty": 24}}'),
 ( '{ "title": "She Tempts the Duke", "items": {"product": "Toy Car","qty": 1}}'),
 ( '{ "title": "The Duke Is Mine", "items": {"product": "Toy Train","qty": 2}}'),
 ( '{ "title": "What I Did For a Duke", "items": {"product": "Toy Train","qty": 2}}'),
 ('{ "title": "King Kong", "items": {"product": "Toy Train","qty": 2}}');

SELECT info -> 'title' as title
FROM bookdata
WHERE to_tsvector('english',info->'title') @@ to_tsquery('duke');            


------ !
SELECT info -> 'title' as title
FROM bookdata
WHERE to_tsvector('english',info->'title') @@ to_tsquery('diaper');            


а то ж дон говорит предложениями , продолжения которых он не понимает.

т.е. создаёт т.с. шизофазные смеси из известных ему но непонятых им лексем. почти более чем полностью лишенные смысла.
7 окт 17, 12:42    [20850669]     Ответить | Цитировать Сообщить модератору
 Re: Full-Text Search в JSON ?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 1586
qwwq
Ролг Хупин
...
Мне надо, чтобы "diaper" не индексировался и не находился, но, естественно он будет искаться.


я же говорил "черкни пару формул"

предположу (могу врать), что дону хотелось бы этакого:
+
drop table if exists bookdata;

create table bookdata
(id  serial NOT NULL PRIMARY KEY,
 info json NOT NULL
);

CREATE INDEX bookdata_fts ON bookdata
               USING gin (( to_tsvector('english',info->'title') ));

INSERT INTO bookdata (info)
VALUES
 ( '{ "title": "The Tattooed Duke", "items": {"product": "Diaper","qty": 24}}'),
 ( '{ "title": "She Tempts the Duke", "items": {"product": "Toy Car","qty": 1}}'),
 ( '{ "title": "The Duke Is Mine", "items": {"product": "Toy Train","qty": 2}}'),
 ( '{ "title": "What I Did For a Duke", "items": {"product": "Toy Train","qty": 2}}'),
 ('{ "title": "King Kong", "items": {"product": "Toy Train","qty": 2}}');

SELECT info -> 'title' as title
FROM bookdata
WHERE to_tsvector('english',info->'title') @@ to_tsquery('duke');            


------ !
SELECT info -> 'title' as title
FROM bookdata
WHERE to_tsvector('english',info->'title') @@ to_tsquery('diaper');            


а то ж дон говорит предложениями , продолжения которых он не понимает.

т.е. создаёт т.с. шизофазные смеси из известных ему но непонятых им лексем. почти более чем полностью лишенные смысла.


жжош, чтобы не сказать: *ишь
7 окт 17, 12:52    [20850685]     Ответить | Цитировать Сообщить модератору
 Re: Full-Text Search в JSON ?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 1586
qwwq
Ролг Хупин
...
Мне надо, чтобы "diaper" не индексировался и не находился, но, естественно он будет искаться.


я же говорил "черкни пару формул"

предположу (могу врать), что дону хотелось бы этакого:
+
drop table if exists bookdata;

create table bookdata
(id  serial NOT NULL PRIMARY KEY,
 info json NOT NULL
);

CREATE INDEX bookdata_fts ON bookdata
               USING gin (( to_tsvector('english',info->'title') ));

INSERT INTO bookdata (info)
VALUES
 ( '{ "title": "The Tattooed Duke", "items": {"product": "Diaper","qty": 24}}'),
 ( '{ "title": "She Tempts the Duke", "items": {"product": "Toy Car","qty": 1}}'),
 ( '{ "title": "The Duke Is Mine", "items": {"product": "Toy Train","qty": 2}}'),
 ( '{ "title": "What I Did For a Duke", "items": {"product": "Toy Train","qty": 2}}'),
 ('{ "title": "King Kong", "items": {"product": "Toy Train","qty": 2}}');

SELECT info -> 'title' as title
FROM bookdata
WHERE to_tsvector('english',info->'title') @@ to_tsquery('duke');            


------ !
SELECT info -> 'title' as title
FROM bookdata
WHERE to_tsvector('english',info->'title') @@ to_tsquery('diaper');            


а то ж дон говорит предложениями , продолжения которых он не понимает.

т.е. создаёт т.с. шизофазные смеси из известных ему но непонятых им лексем. почти более чем полностью лишенные смысла.



Продолжим наше *донистое обсуждение:

1. дропнул свой индекс, создал такой, как вы написали выше

CREATE INDEX bookdata_fts2 ON bookdata
               USING gin (( to_tsvector('english',info->'title') ));


2. Это сработало, не выбрало ни одной записи, хорошо:
SELECT info -> 'title' as title
FROM bookdata
WHERE to_tsvector('english',info->'title') @@ to_tsquery('diaper'); 


3. Почему этот запрос выбрал 3 записи? мы же проиндексировали только одно поле:

SELECT info -> 'title' as title
FROM bookdata
WHERE to_tsvector('english',info) @@ to_tsquery('diaper');
7 окт 17, 13:02    [20850698]     Ответить | Цитировать Сообщить модератору
 Re: Full-Text Search в JSON ?  [new]
qwwq
Member

Откуда:
Сообщений: 2341
Ролг Хупин,

йцукен, как говорят благородные доны.
ну ганглий отключи от генериловки шизофазий (т.е. синтеза)
и включи на анализ собственных сверхидей
"балансируй, кетчуп"

или посмотри планы, и подумай, как оно все довольно просто унутре без всякой магии и бреда устроено

вот я накидал тут от скуки еще кейсик:

+
drop table if exists bookdata;

create table bookdata
(id  serial NOT NULL PRIMARY KEY,
 info json NOT NULL
);

CREATE INDEX bookdata_fts ON bookdata
               --USING gin (( to_tsvector('english',info->'title') ));/*
		USING gin (( to_tsvector('english',info) )); --*/

INSERT INTO bookdata (info)
VALUES
 ( '{ "title": "The Tattooed Duke", "items": {"product": "Diaper","qty": 24}}'),
 ( '{ "title": "She Tempts the Duke", "items": {"product": "Toy Car","qty": 1}}'),
 ( '{ "title": "The Duke Is Mine", "items": {"product": "Toy Train","qty": 2}}'),
 ( '{ "title": "What I Did For a Duke", "items": {"product": "Toy Train","qty": 2}}'),
 ('{ "title": "King Kong", "items": {"product": "Toy Train","qty": 2}}');

INSERT INTO bookdata (info) SELECT 
('{ "title": "King Kong Peace'||' Duke '|| g || ' ", "items": {"product": "Toy Train","qty": 2}}')::jsonb
FROM generate_series(0,10000) g;

VACUUM ANALYZE bookdata;

explain 
SELECT info -> 'title' as title
FROM bookdata
WHERE to_tsvector('english',info) @@ to_tsquery('duke') --NO ind scan 
	AND to_tsvector('english',info->'title') @@ to_tsquery('duke');--+recheck


------ !
explain
SELECT info -> 'title' as title
FROM bookdata
WHERE 	to_tsvector('english',info) @@ to_tsquery('diaper') --ind scan
	AND to_tsvector('english',info->'title') @@ to_tsquery('diaper');--+filter==recheck

-- унутре неонка:
SELECT to_tsvector('english',info) as title
	,to_tsvector('english',info::text) as title2
FROM bookdata
WHERE 	to_tsvector('english',info) @@ to_tsquery('diaper')
;
--'diaper':5 'duke':3 'tattoo':2
--''24':9 'diaper':7 'duke':4 'item':5 'product':6 'qti':8 'tattoo':3 'titl':1'
-- т.е. сермяга в том, что не индексируются в лексемы теги жейсона -- их имена
-- и прочий мета--мусор
7 окт 17, 13:29    [20850728]     Ответить | Цитировать Сообщить модератору
 Re: Full-Text Search в JSON ?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 1586
я - тормоз, а ты дон.


Да теги мне и не нужны, по идее - это разные индексы, и они используются при поиске

--1
CREATE INDEX bookdata_fts2 ON bookdata
USING gin (( to_tsvector('english',info->'title') )); -- здесь индексируется только одно жысоновское поле
--2
CREATE INDEX bookdata_fts ON bookdata
USING gin (( to_tsvector('english',info) )); -- здесь индексируется весь JSON объект

и, следовательно, значения полей (например - 'diaper'), не входящих в индекс не должны находиться, а по факту они находятся

Или правильно сказать так:

Поля с искомым значением будут находиться в любом случае? в чем тогда разница - индекс на весь жысон или на оотдельные поля?
7 окт 17, 13:42    [20850749]     Ответить | Цитировать Сообщить модератору
 Re: Full-Text Search в JSON ?  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 3444
Ролг Хупин
3. Почему этот запрос выбрал 3 записи? мы же проиндексировали только одно поле:

SELECT info -> 'title' as title
FROM bookdata
WHERE to_tsvector('english',info) @@ to_tsquery('diaper');


Hmm идея что один и тот же запрос может возвращать разные результаты в зависимости от того что именно вы индексировали - она в SQL весьма неожиданна. Вполне логично что база при отсутствии подходящего индекса делает seq scan и так или иначе отдает все подходящие под ваш запрос строки.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
7 окт 17, 13:44    [20850751]     Ответить | Цитировать Сообщить модератору
 Re: Full-Text Search в JSON ?  [new]
qwwq
Member

Откуда:
Сообщений: 2341
Maxim Boguk,

дон просто со вчерашнего не просох
давит батоны из последних сил
подумать некогда
7 окт 17, 13:52    [20850757]     Ответить | Цитировать Сообщить модератору
 Re: Full-Text Search в JSON ?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 1586
Maxim Boguk
Ролг Хупин
3. Почему этот запрос выбрал 3 записи? мы же проиндексировали только одно поле:

SELECT info -> 'title' as title
FROM bookdata
WHERE to_tsvector('english',info) @@ to_tsquery('diaper');


Hmm идея что один и тот же запрос может возвращать разные результаты в зависимости от того что именно вы индексировали - она в SQL весьма неожиданна. Вполне логично что база при отсутствии подходящего индекса делает seq scan и так или иначе отдает все подходящие под ваш запрос строки.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru


Не думаю, что в самом SQL.

Возможно меня сбивает с толку то, что в SQL Server, если не построить полнотекстовый индекс на поле,
то FTS запросы к такой таблице будут возвращать ошибку.
7 окт 17, 14:35    [20850801]     Ответить | Цитировать Сообщить модератору
 Re: Full-Text Search в JSON ?  [new]
Melkij
Member

Откуда: Санкт-Петербург
Сообщений: 340
Ролг Хупин
Возможно меня сбивает с толку то, что в SQL Server, если не построить полнотекстовый индекс на поле,
то FTS запросы к такой таблице будут возвращать ошибку.

Однозначно сбивает. Postgresql ничего не скажет, пойдёт честный seqscan делать.
7 окт 17, 17:34    [20851034]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить