Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Текстовый блоб и поиск по нему / 25 сообщений из 27, страница 1 из 2
17.02.2022, 14:47
    #40134837
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текстовый блоб и поиск по нему
Комрады, дайте совет.

Есть табля с текстовыми блобами. Есть вероятность того, что понадобится быстрый поиск по блобам в селекте (CONTAINING и проч.).

Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE TBL_BLOBTEXT (
   ...
    BLOB_TEXT             DMN_BLOBTXT,
    BLOB_HASH             DMN_STRING_50,
    VHAR_TEXT             VARCHAR(8000)
  ...
);



Насколько оправдано будет создание varchar-клона этого поля размером, скажем, 8К+ символов? С учетом того, что сами блобы вряд ли будут больше этого размера и заполнять varchar-клон планируется в триггере AIU при помощи, например, LEFT(BLOB_TEXT,8000)?

=================
Док.

Win10 Ultim x64/Deb 10 amd64/Darwin Cocoa(Monterey):
FB 3.0.7.33374, Lazarus 2.3.0(trunk); FPC 3.3.1(trunk)
...
Рейтинг: 0 / 0
17.02.2022, 14:49
    #40134841
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текстовый блоб и поиск по нему
ты опять оптимизируешь сильно ЗАРАНЕЕ.
не парься.
...
Рейтинг: 0 / 0
17.02.2022, 14:55
    #40134842
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текстовый блоб и поиск по нему
Мимопроходящий,

не, я по предыдущей базе знаю, что такое наверняка понадобится :)
...
Рейтинг: 0 / 0
17.02.2022, 14:57
    #40134844
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текстовый блоб и поиск по нему
Док
не, я по предыдущей базе знаю, что такое наверняка понадобится :)
толку от такой "оптимизации" ноль.
...
Рейтинг: 0 / 0
17.02.2022, 15:18
    #40134853
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текстовый блоб и поиск по нему
Мимопроходящий,

я правильно понимаю, что в конструкции
Код: sql
1.
2.
3.
4.
5.
SELECT ID
FROM TBL_BLOBTEXT
WHERE 
   (BLOB_TEXT CONTAINING 'ы') --{1}
      OR (VHAR_TEXT CONTAINING 'ы') --{2}


оба предиката условия по производительности равны?
...
Рейтинг: 0 / 0
17.02.2022, 15:35
    #40134859
pastor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текстовый блоб и поиск по нему
Док
Мимопроходящий,

я правильно понимаю, что в конструкции
Код: sql
1.
2.
3.
4.
5.
SELECT ID
FROM TBL_BLOBTEXT
WHERE 
   (BLOB_TEXT CONTAINING 'ы') --{1}
      OR (VHAR_TEXT CONTAINING 'ы') --{2}


оба предиката условия по производительности равны?


нет.
за блобом всегда на отдельную страницу, текст - не всегда
у блобов еще свои отдельные накладки на версионность
...
Рейтинг: 0 / 0
17.02.2022, 15:41
    #40134864
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текстовый блоб и поиск по нему
я конечно извиняюсь за грубость, но полунамеки, как гуманитарий, я не понимаю. Можно пальцем показать, как правильно? :)
...
Рейтинг: 0 / 0
17.02.2022, 15:43
    #40134865
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текстовый блоб и поиск по нему
Док
я конечно извиняюсь за грубость, но полунамеки, как гуманитарий, я не понимаю. Можно пальцем показать, как правильно? :)
правильно Full-Text Search
но вряд ли оно тебе так таки надо.
...
Рейтинг: 0 / 0
17.02.2022, 15:44
    #40134866
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текстовый блоб и поиск по нему
pastor
за блобом всегда на отдельную страницу
побожись ещё.

зы: нет.
...
Рейтинг: 0 / 0
17.02.2022, 15:45
    #40134867
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текстовый блоб и поиск по нему
ДокНасколько оправдано будет создание varchar-клона этого поля размером, скажем,
8К+ символов?

Нинасколько. Тебе к https://www.sql.ru/forum/actualthread.aspx?tid=1341875
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
17.02.2022, 15:55
    #40134872
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текстовый блоб и поиск по нему
Мимопроходящий
Док
я конечно извиняюсь за грубость, но полунамеки, как гуманитарий, я не понимаю. Можно пальцем показать, как правильно? :)
правильно Full-Text Search
но вряд ли оно тебе так таки надо.

т.е. для "бытовых" нужд нужно еще UDR прикручивать? И будет работать на win/unix?

зы. наверное еще и за денежку? о_О
...
Рейтинг: 0 / 0
17.02.2022, 16:05
    #40134876
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текстовый блоб и поиск по нему
Ну так тебе шашечки или ехать. Если для отмазки - то можешь своё поле на
VARCHAR(32000), если чтобы работало быстро - таки да, стемизация, индексация и
прочие хитрые трюки.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
17.02.2022, 16:09
    #40134879
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текстовый блоб и поиск по нему
Док
т.е. для "бытовых" нужд нужно еще UDR прикручивать? И будет работать на win/unix?
зы. наверное еще и за денежку? о_О
есть ещё Sphinx, и его таки успешно прикручивают к FB, но нужно уточнить насчёт win/unix.
...
Рейтинг: 0 / 0
17.02.2022, 17:09
    #40134907
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текстовый блоб и поиск по нему
Док> Можно пальцем показать, как правильно? :)

Если ты уверен, что там именно <8K текста -
можешь прямо варчар-ом и хранить, нафига
тебе именно БЛОБ тогда?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
17.02.2022, 17:47
    #40134926
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текстовый блоб и поиск по нему
Гаджимурадов Рустам
Если ты уверен, что там именно <8K текста -
можешь прямо варчар-ом и хранить, нафига
тебе именно БЛОБ тогда?

Я не уверен, поэтому пусть лучше будет :)

Всем большое спасибо за советы и участие.
...
Рейтинг: 0 / 0
17.02.2022, 17:59
    #40134931
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текстовый блоб и поиск по нему
Док
Я не уверен, поэтому пусть лучше будет :)
когда на винде появилась VFAT (ещё до FAT32) с длинными именами файлов (до 255 символов), олдскулы шутили, что при такой-то длине ещё и наполнять файлы текстом – бессмысленно.
...
Рейтинг: 0 / 0
17.02.2022, 18:21
    #40134937
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текстовый блоб и поиск по нему
Мимопроходящий
олдскулы шутили

всегда найдется дурак, который проверит, можно ли сохранить "Войну и Мир" в поле с жалобами :)
...
Рейтинг: 0 / 0
17.02.2022, 18:49
    #40134942
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текстовый блоб и поиск по нему
Док,

Автообрезание текста сделай на клиенте. Один фиг такие длинные жалобы никто читать не будет. А в разе чего - можно и уточнить у дурака, чего хотел-то.
...
Рейтинг: 0 / 0
17.02.2022, 19:34
    #40134949
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текстовый блоб и поиск по нему
DarkMaster
Автообрезание текста сделай на клиенте.

нельзя :)

Тут ведь какое дело: сначала кажется, что хватит, а потом, раз! - и "эх, коротка кольчужка..."

Upd: а вот хэши блобов я на клиенте считаю и пишу в базу.
...
Рейтинг: 0 / 0
17.02.2022, 19:39
    #40134951
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текстовый блоб и поиск по нему
Док> нельзя :)

Почему? Что хранится в этой портянке,
"перечень симптомов/жалоб"?

Док> Upd: а вот хэши блобов я на клиенте считаю и пишу в базу.

А смысл? Сравнивать на равенство ты
не будешь, а для любого иного поиска
они бесполезны.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
17.02.2022, 19:56
    #40134953
pizmon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текстовый блоб и поиск по нему
Файл README.builtin_functions.txt у меня имеет размер 30964 байта. Язык текста - английский. Просто для примера.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
//код иллюстрирует алгоритм подсчета. В жизни НЕ НАДО так работать со строками.
var
  I: Integer;
  S: string;
  LChars1: TStringList;
  LChars2: TStringList;
  LChars3: TStringList;
  LChars4: TStringList;

begin
  with TStringList.Create do
  try
    LoadFromFile('.....README.builtin_functions.txt');
    S := Text;
    S := StringReplace(S, sLineBreak, #32, [rfReplaceAll]);
    S := StringReplace(S, #10, #32, [rfReplaceAll]);
    S := StringReplace(S, #13, #32, [rfReplaceAll]);
    S := StringReplace(S, #9, #32, [rfReplaceAll]);
    while Pos(#32#32, S) > 0 do
      S := StringReplace(S, #32#32, #32, [rfReplaceAll]);

    LChars1 := TStringList.Create;
    LChars2 := TStringList.Create;
    LChars3 := TStringList.Create;
    LChars4 := TStringList.Create;
    try
      LChars1.Sorted := True;
      LChars2.Sorted := True;
      LChars3.Sorted := True;
      LChars4.Sorted := True;

      LChars1.Duplicates := dupIgnore;
      LChars2.Duplicates := dupIgnore;
      LChars3.Duplicates := dupIgnore;
      LChars4.Duplicates := dupIgnore;

      LChars1.CaseSensitive := True;
      LChars2.CaseSensitive := True;
      LChars3.CaseSensitive := True;
      LChars4.CaseSensitive := True;

      for I := 1 to Length(S) do
      begin
        LChars1.Add(Copy(S, I, 1));
        if I >= 2 then
          LChars2.Add(Copy(S, I - 1, 2));
        if I >= 3 then
          LChars3.Add(Copy(S, I - 2, 3));
        if I >= 4 then
          LChars4.Add(Copy(S, I - 3, 4));
      end;

      LChars1.SaveToFile('by1.txt');
      LChars2.SaveToFile('by2.txt');
      LChars3.SaveToFile('by3.txt');
      LChars4.SaveToFile('by4.txt');

    finally
      LChars1.Free;
      LChars2.Free;
      LChars3.Free;
      LChars4.Free;
    end;
  finally
    Free;
  end;



Файл содержит 87 символов, 1221 диграмм, 3992 триграммы, 6921 тетраграмм. Их можно сунуть в отдельные индексированные таблицы и искать по ним пулей. Если есть запись соответствующей триграммы - значит, contains. Если нет - то нет. Для поиска вполне достаточно.

Волшебные Full-Text Search делают, в общем-то, то же самое, но хитрее, умнее, точнее, быстрее и так далее. Если этого всего (ума, хитрости, и т.д.) будет не хватать - можно посмотреть, как сделано "у них", и сделать так же. Ну и перейти на них тоже никогда не поздно.
...
Рейтинг: 0 / 0
18.02.2022, 00:49
    #40134997
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текстовый блоб и поиск по нему
Гаджимурадов Рустам
Почему? Что хранится в этой портянке,
"перечень симптомов/жалоб"?

дофига чего. Конечно, мало вероятно, что более 8000 символов (я правильно помню, при 4-х байтной кодировке это 32000/4 символов?). Но пусть будет...
pizmon
Для поиска вполне достаточно.

боюсь, это очень усложнит структуру базы. И Оккама обидится :)
...
Рейтинг: 0 / 0
18.02.2022, 01:45
    #40135001
pizmon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текстовый блоб и поиск по нему
Док
боюсь, это очень усложнит структуру базы. И Оккама обидится :)


Да блин! У нас же есть целый Firebird SQL сервер! Он умеет в сохранить строки, построить индекс и искать по индексу. Он как раз для этого предназначен (а не чтобы рассылать почту по smtp, как многие думают)!

Код: sql
1.
2.
3.
4.
5.
6.
create table TBL_BLOBTEXT
(ID bigint not null primary key,
 ...
 VHAR_TEXT blob sub_type 1
 ..
)



Добавляем 1 таблицу:

Код: sql
1.
2.
3.
4.
5.
6.
7.
create table TINDEX
(ID bigint not null,
 TETRAGRAM char(4) not null,
 unique (TETRAGRAM, ID) ,
 foreign key (ID) references to TBL_BLOBTEXT(ID));

create index TINDEX_INDEX on TINDEX(TETRAGRAM);



В триггерах на TBL_BLOBTEXT что-то такое:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
  delete from TINDEX where ID = new.ID;
  insert into TINDEX (ID, TETRAGRAM)
    with recursive S as (
      select new.VHAR_TEXT  text
        from rdb$database
      union all
      select substring(text from 2)
        from S
       where char_length(text) > 4
     )
     select substring(text from 1 for 4), new.ID
       from S;



Ползатель хочет искать 'Дыни и арбузы'. Сейчас строится запрос вида

Код: sql
1.
2.
3.
4.
select ...
  from TBL_BLOBTEXT
where 
  VHAR_TEXT  like '%Дыни и арбузы%'



Это полный перебор всех блобов.

Вместо этого
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
with T as (select .... 
  from TBL_BLOBTEXT TB
where 
/*столько, сколько будет оптимально. Находится опытным путем. Обычно больше трех-четырех не нужно*/
      exists (select 1 from TINDEX I where  I.TETRAGRAM = 'Дыни' and I.ID = TB.ID)
and exists (select 1 from TINDEX I where  I.TETRAGRAM = 'ыни ' and I.ID = TB.ID)
and exists (select 1 from TINDEX I where  I.TETRAGRAM = 'ни и' and I.ID = TB.ID)
and exists (select 1 from TINDEX I where  I.TETRAGRAM = 'и и ' and I.ID = TB.ID)
and exists (select 1 from TINDEX I where  I.TETRAGRAM = ' и а' and I.ID = TB.ID)
and exists (select 1 from TINDEX I where  I.TETRAGRAM = 'и ар' and I.ID = TB.ID)
)
select ...
  from T 
/*это без изменений, для верности */
where 
  VHAR_TEXT  like '%Дыни и арбузы%'



Просматриваются только те блобы, которые отобрались на ранних этапах.

Собственно, всё. Прикручивать ЛЮБОЙ FTS-engine на три порядка дольше. А вот эффективнее ли?

PS. Всё писано прямо в браузере, мог ошибиться в синтаксис.
...
Рейтинг: 0 / 0
18.02.2022, 09:10
    #40135054
Дегтярев Евгений
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текстовый блоб и поиск по нему
Мимопроходящий
Док
т.е. для "бытовых" нужд нужно еще UDR прикручивать? И будет работать на win/unix?
зы. наверное еще и за денежку? о_О
есть ещё Sphinx, и его таки успешно прикручивают к FB, но нужно уточнить насчёт win/unix.

про это же подумал
эластик, наверное, перебор, а сфинкс в самый раз
в русский и английский он точно умеет, хз на счет нативной интеграции в фб, но есть апи. да нужны доп шаги при обновлении данных по поддержанию индекса, но если охота именно полнотекстовый то по другому никак
сейчас то что было сфинксом допиливаться в виде форка - https://habr.com/ru/post/541126/

а вот натягивать полнотекстовый поиск на рсубд не вариант
это было актуально, лет 20 назад, когда не было других вариантов
...
Рейтинг: 0 / 0
18.02.2022, 13:18
    #40135128
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Текстовый блоб и поиск по нему
а есть какой-нить getting started со сфинксом?
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Текстовый блоб и поиск по нему / 25 сообщений из 27, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]