powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Текстовый блоб и поиск по нему
25 сообщений из 27, страница 1 из 2
Текстовый блоб и поиск по нему
    #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
Текстовый блоб и поиск по нему
    #40134841
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ты опять оптимизируешь сильно ЗАРАНЕЕ.
не парься.
...
Рейтинг: 0 / 0
Текстовый блоб и поиск по нему
    #40134842
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,

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

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


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

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

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

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

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

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

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

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

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

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

нельзя :)

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

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

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

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

А смысл? Сравнивать на равенство ты
не будешь, а для любого иного поиска
они бесполезны.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Текстовый блоб и поиск по нему
    #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
Текстовый блоб и поиск по нему
    #40134997
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам
Почему? Что хранится в этой портянке,
"перечень симптомов/жалоб"?

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

боюсь, это очень усложнит структуру базы. И Оккама обидится :)
...
Рейтинг: 0 / 0
Текстовый блоб и поиск по нему
    #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
Текстовый блоб и поиск по нему
    #40135054
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий
Док
т.е. для "бытовых" нужд нужно еще UDR прикручивать? И будет работать на win/unix?
зы. наверное еще и за денежку? о_О
есть ещё Sphinx, и его таки успешно прикручивают к FB, но нужно уточнить насчёт win/unix.

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

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


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