SQLRU.net
Разработка приложений баз данных

Начало » Использование СУБД » Firebird, HQbird, InterBase » Полнотекстовый поиск для Firebird (Обсуждение UDR FTS Lucene)
Полнотекстовый поиск для Firebird [сообщение #96] Mon, 27 June 2022 09:39 Переход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 332
Зарегистрирован: June 2022
Senior Member
Хочу представить OpenSource UDR для полнотекстового поиска на основе Lucene++.

https://github.com/IBSurgeon/lucene_udr

Документация на русском языке README_RUS.md

UDR FTS Lucene написана на языке C++, обладает высокой производительностью. Может быть использована в Firebird 3.0 и 4.0.

Пожелания по функционалу (адекватные) и сообщения об ошибках приветствуются.

[Обновления: Tue, 28 June 2022 13:51]

Известить модератора

Re: Полнотекстовый поиск для Firebird [сообщение #104 является ответом на сообщение #96] Tue, 28 June 2022 23:48 Переход к предыдущему сообщениюПереход к следующему сообщению
Док в настоящее время не в онлайне  Док
Сообщений: 101
Зарегистрирован: June 2022
Senior Member
В тележном чате FirebirdSQL вопрос поднимался в комментах, есть ли возможность сделать в виде встроенной функции на перспективу. Ы?

FPC/Lazarus (trunk) | Win10 x64 Ultim/Debian 11 amd64/Darwin x86_64 Monterey | Firebird 3.0.10 x64 | IBX by TonyWhyman

https://zoltanleo.blogspot.com/
Re: Полнотекстовый поиск для Firebird [сообщение #108 является ответом на сообщение #104] Wed, 29 June 2022 14:34 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 332
Зарегистрирован: June 2022
Senior Member
В теории есть. Но если это кто и будет делать, то не я.
С самим Lucene++ есть проблемы в плане совместимости лицензий.
Re: Полнотекстовый поиск для Firebird [сообщение #273 является ответом на сообщение #104] Fri, 05 August 2022 18:54 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 889
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
Док писал(а) Tue, 28 June 2022 23:48
В тележном чате FirebirdSQL
это где?

Re: Полнотекстовый поиск для Firebird [сообщение #280 является ответом на сообщение #273] Mon, 08 August 2022 13:42 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 332
Зарегистрирован: June 2022
Senior Member
https://t.me/fb_friday - пятница в телеге

Re: Полнотекстовый поиск для Firebird [сообщение #287 является ответом на сообщение #280] Tue, 09 August 2022 12:38 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 332
Зарегистрирован: June 2022
Senior Member
Вышла новая версия IBSurgeon Full Text Search UDR 1.1

Что нового:

- отдельный анализатор для английского языка со стемминогом (PorterStemming), ранее анализатор полностью совпадал с StandardAnalyzer;
- добавлены Snowball анализаторы;
- добавлена хранимая процедура FTS$ANALYZE для разбиения текста на термы согласно заданному анализатору.

https://github.com/IBSurgeon/lucene_udr
https://github.com/IBSurgeon/lucene_udr/releases/tag/1.1
Re: Полнотекстовый поиск для Firebird [сообщение #423 является ответом на сообщение #287] Thu, 01 September 2022 10:25 Переход к предыдущему сообщениюПереход к следующему сообщению
RusMikle в настоящее время не в онлайне  RusMikle
Сообщений: 18
Зарегистрирован: June 2022
Junior Member
Вопрос по поводу IBSurgeon Full Text Search UDR 1.1:
Как у него с немецким?
Спасибо.
Re: Полнотекстовый поиск для Firebird [сообщение #424 является ответом на сообщение #423] Thu, 01 September 2022 12:46 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 332
Зарегистрирован: June 2022
Senior Member
Анализатор для немецкого есть. Можно скачать и попробовать.

Но я пока рекомендую не ставить в продакшн. Там очень неприятный баг с многопоточностью вышел наружу. Сейчас правлю. Надеюсь за пару дней разберусь и выпущу новую версию.
Re: Полнотекстовый поиск для Firebird [сообщение #429 является ответом на сообщение #424] Thu, 01 September 2022 16:55 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 332
Зарегистрирован: June 2022
Senior Member
Исправил
Re: Полнотекстовый поиск для Firebird [сообщение #1208 является ответом на сообщение #96] Tue, 27 December 2022 20:21 Переход к предыдущему сообщениюПереход к следующему сообщению
afgm в настоящее время не в онлайне  afgm
Сообщений: 1
Зарегистрирован: December 2022
Junior Member
В lucene++ trigram analyzer нет, как понимаю?
Для поиска по исходникам в блобах (точные совпадения) лучше тогда использовать SIMPLE или WHITESPACE, и с дополнительной проверкой на содержимое?
Мне нужно именно точное совпадение. Идеальным примером является триграммный индекс в PostgreSQL.
Re: Полнотекстовый поиск для Firebird [сообщение #1209 является ответом на сообщение #1208] Tue, 27 December 2022 20:33 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 332
Зарегистрирован: June 2022
Senior Member
Скорее всего WHITESPACE, но я бы лучше провёл эксперимент.

Посмотреть список анализаторов

select *
from FTS$MANAGEMENT.FTS$ANALYZERS
А дальше вызывать

select *
from FTS$ANALYZE(blob, analyzer)
с разными анализаторами. Эта процедура разбивает текст на индексируемые термы. Вот тут можно посмотреть как какой анализатор работает.

Потом на основе наиболее подходящего можно создать свой анализатор со своим списком стоп слов
Re: Полнотекстовый поиск для Firebird [сообщение #4502 является ответом на сообщение #1209] Mon, 19 February 2024 12:39 Переход к предыдущему сообщениюПереход к следующему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 150
Зарегистрирован: August 2022
Senior Member
Перевожу свою систему и прилагаемый к ней FTS на боевые рельсы. Новый сервер с внушительным числом ядер и невообразимым количеством физической памяти. В качестве накопителей NVM SSD диски. Скорость последовательного чтения с такого диска, судя по тесту, 3,5 Gb/s. Firebird 5.0.

В качестве объекта FTS выступает одна таблица с 30 млн. записей и 8 индексируемыми полями размером от 10 до 200 символов. Соответственно построен 1 FTS индекс из 8 сегментов. На диске он занимает 4 Gb.

Так вот, время поиска по этому индексу составляет 3,5 сек., причем оно практически не зависит от сложности запроса. Время поиска я считаю как длительность исполнения процедуры FTS$SEARCH без дополнительных обвязок.

Задача в том, чтобы сократить время поиска, 3,5 сек. - это многовато. Пробовал перенести весь индекс FTS в физическую память (RAMDisk) - эффект нулевой. (Это даже при том, что скорость последовательного чтения с RAMDisk оказалась ниже, чем с NVM раза в 2).

Из данного наблюдения я делаю вывод, что время поиска в данных условиях определяется не скоростью чтения с накопителя, а скоростью исполнения алгоритма поиска, потребным процессорным временем. Наблюдая за процессом Firebird до, во время и после поиска, вижу, что число рабочих потоков не меняется, всю поисковую работу исполняет один-единственный поток того коннекта, который поиск и вызвал. Что обидно, потому что при этом вхолостую простаивают десятки свободных потоков.

В связи с этим следует вопрос. А нельзя ли ввести (включить, добавить) многопоточность в поиск? По смыслу задачи поиска она вроде как подлежит распараллеливанию.

Вопрос в первую голову автору, понятно. Но, может, у кого еще появятся соображения.

Спасибо!

[Обновления: Mon, 19 February 2024 12:40]

Известить модератора

Re: Полнотекстовый поиск для Firebird [сообщение #4503 является ответом на сообщение #4502] Mon, 19 February 2024 12:59 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 332
Зарегистрирован: June 2022
Senior Member
Алгоритмы полнотекстового поиска писал не я. Я лишь адаптировал библиотеку lucene++ для работы в UDR.
В чужую библиотеку я вмешиваться опасаюсь как минимум. Добавить многопточность вряд ли возможно.

Хотелось бы уточнить: время поиска по индексу постоянно или первый поиск (внутри сессии) дольше?

ЗЫ. По идее скорость могла быть намного больше, если бы использовался не поисковый движок внутри UDR, а поисковый сервер, к которому бы обращалась UDR.
Тогда бы кешированием и другой лабудой вроде распараллеливания уже занимался поисковый сервер.
Re: Полнотекстовый поиск для Firebird [сообщение #4504 является ответом на сообщение #4503] Mon, 19 February 2024 13:12 Переход к предыдущему сообщениюПереход к следующему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 150
Зарегистрирован: August 2022
Senior Member
sim_84 писал(а) Mon, 19 February 2024 12:59
Я лишь адаптировал библиотеку.
Я знаю. Но я подумал, может, там в библиотеке есть какой-нибудь волшебный флажок "Включить многопоточность". А что, а вдруг?

sim_84 писал(а) Mon, 19 February 2024 12:59

Хотелось бы уточнить: время поиска по индексу постоянно или первый поиск (внутри сессии) дольше?
Постоянно. Стабильно, почти как швейцарские часы. Все необходимое уже в памяти, быстрее никак.

sim_84 писал(а) Mon, 19 February 2024 12:59

ЗЫ. По идее скорость могла быть намного больше, если бы использовался не поисковый движок внутри UDR, а поисковый сервер, к которому бы обращалась UDR. Тогда бы кешированием и другой лабудой вроде распараллеливания уже занимался поисковый сервер.
Не собираетесь этим заняться? Так, на всякий случай спрашиваю. При наличии сервера можно было бы и напрямую с клиента к нему обращаться, тогда и UDR не нужна была бы.
Re: Полнотекстовый поиск для Firebird [сообщение #4505 является ответом на сообщение #4504] Mon, 19 February 2024 13:30 Переход к предыдущему сообщениюПереход к следующему сообщению
basid в настоящее время не в онлайне  basid
Сообщений: 167
Зарегистрирован: June 2022
Географическое положение: Asia/Irkutsk
Senior Member
UDR нужна в любом случае: работать с API внешнего сервиса без UDR - так себе идея.
Re: Полнотекстовый поиск для Firebird [сообщение #4506 является ответом на сообщение #4505] Mon, 19 February 2024 13:56 Переход к предыдущему сообщениюПереход к следующему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 150
Зарегистрирован: August 2022
Senior Member
Кстати, на https://github.com/luceneplusplus/LucenePlusPlus наблюдается активность - последнее изменение 16 часов назад.
Re: Полнотекстовый поиск для Firebird [сообщение #4507 является ответом на сообщение #4506] Mon, 19 February 2024 14:14 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 332
Зарегистрирован: June 2022
Senior Member
Ага 3.0.9 вышел. Обновлю как будет время.
Хотя судя по логу ничего существенного там не сделали. Некоторые баги и компиляцию в CMake поправили.
Re: Полнотекстовый поиск для Firebird [сообщение #4508 является ответом на сообщение #4504] Mon, 19 February 2024 14:22 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 332
Зарегистрирован: June 2022
Senior Member
Данная реализация всегда читает индекс с диска, не кешируя его. По идее файловый кеш должен помогать.
Возможно можно сделать кеш на уровне UDR, но он будет per-connection, и это не так просто.
Была ещё идея хранить индекс прямо в BLOB поле. Но я чёт подумал, что вряд ли оно будет быстрее, чем читать его с диска.

З.Ы. Lucene это именно что поисковый движок, а не поисковый сервер.

Можно рассмотреть другие реализации, где UDR обращается к поисковому серверу, но это не быстро.
Re: Полнотекстовый поиск для Firebird [сообщение #4509 является ответом на сообщение #4508] Mon, 19 February 2024 14:35 Переход к предыдущему сообщениюПереход к следующему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 150
Зарегистрирован: August 2022
Senior Member
sim_84 писал(а) Mon, 19 February 2024 14:22
Данная реализация всегда читает индекс с диска, не кешируя его. По идее файловый кеш должен помогать.
Клал индекс на RAMDisk, там файловый кеш скорее мешать будет, чем помогать. Но в моих условиях это вообще не имеет эффекта, узкое место не в доступе к данным, а в процессорном времени. Даже только по физической памяти алгоритму много бегать приходится.

sim_84 писал(а) Mon, 19 February 2024 14:22

Можно рассмотреть другие реализации, где UDR обращается к поисковому серверу, но это не быстро.
Если реализуете, и скорость вырастет, будет классно. Спасибо!
Re: Полнотекстовый поиск для Firebird [сообщение #4510 является ответом на сообщение #4509] Mon, 19 February 2024 14:39 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 889
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
а Сфинкс не подходит вместо данного монстра?
Re: Полнотекстовый поиск для Firebird [сообщение #4511 является ответом на сообщение #4510] Mon, 19 February 2024 15:08 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 332
Зарегистрирован: June 2022
Senior Member
Можно и под Sphinx, Manticore, Solr сделать UDR интерфейс

[Обновления: Mon, 19 February 2024 15:08]

Известить модератора

Re: Полнотекстовый поиск для Firebird [сообщение #4512 является ответом на сообщение #4511] Mon, 19 February 2024 15:27 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 889
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
sim_84 писал(а) Mon, 19 February 2024 15:08
Можно и под Sphinx, Manticore, Solr сделать UDR интерфейс
UDR - непременное условие?
Re: Полнотекстовый поиск для Firebird [сообщение #4513 является ответом на сообщение #4512] Mon, 19 February 2024 16:24 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 332
Зарегистрирован: June 2022
Senior Member
Без неё не удобно список найденных записей возвращать. Нет конечно можно и без, но тогда операцию соединения с таблицей будешь на клиенте проводить.

Смысл UDR в чём. Чтобы удобно было делать

SELECT
  DOC.*
FROM 
  FTS.FIND('однажды в студёную зимнюю пору') F
  JOIN DOC ON DOC.ID = F.FTS_KEY
Re: Полнотекстовый поиск для Firebird [сообщение #4514 является ответом на сообщение #4513] Mon, 19 February 2024 16:29 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 889
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
не вижу препятствий ©
Re: Полнотекстовый поиск для Firebird [сообщение #4515 является ответом на сообщение #4514] Tue, 20 February 2024 15:23 Переход к предыдущему сообщениюПереход к следующему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 150
Зарегистрирован: August 2022
Senior Member
В коде LucenePlusPlus увидел интересный класс ParallelMultiSearcher, который внутри себя использует ThreadPool, что наводит на определенные мысли и дарит надежду.

Денис, может, все-таки где-то есть волшебный флажок, который надо только вовремя и правильно установить? Это же существенно усилит великолепие всего модуля.
Re: Полнотекстовый поиск для Firebird [сообщение #4516 является ответом на сообщение #4515] Tue, 20 February 2024 20:03 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 332
Зарегистрирован: June 2022
Senior Member
Как появится время посмотрю. Хотя лично моё мнение, что многопоточка в UDR не самая лучшая идея
Re: Полнотекстовый поиск для Firebird [сообщение #4532 является ответом на сообщение #4516] Sun, 25 February 2024 17:46 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 332
Зарегистрирован: June 2022
Senior Member
Почитал комментарии в коде. ParallelMultiSearcher предназначен для параллельного поиска в нескольких индексах, а не в одном
Re: Полнотекстовый поиск для Firebird [сообщение #4533 является ответом на сообщение #4507] Sun, 25 February 2024 20:48 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 332
Зарегистрирован: June 2022
Senior Member
sim_84 писал(а) Mon, 19 February 2024 14:14
Ага 3.0.9 вышел. Обновлю как будет время.
Хотя судя по логу ничего существенного там не сделали. Некоторые баги и компиляцию в CMake поправили.
Обновил сборку. Теперь билды под Windows. выложены с версией 3.0.9
Re: Полнотекстовый поиск для Firebird [сообщение #4549 является ответом на сообщение #4533] Mon, 26 February 2024 15:57 Переход к предыдущему сообщениюПереход к следующему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 150
Зарегистрирован: August 2022
Senior Member
sim_84 писал(а) Sun, 25 February 2024 17:46
Почитал комментарии в коде. ParallelMultiSearcher предназначен для параллельного поиска в нескольких индексах, а не в одном
Понятно. Буду думать, нельзя ли это как-нибудь приспособить для ускорения. Параллельный поиск по нескольким индексам в рамках одного поискового запроса? Пока непонятно, как это соорудить.

sim_84 писал(а) Sun, 25 February 2024 20:48

Обновил сборку. Теперь билды под Windows. выложены с версией 3.0.9
И то хорошо. Спасибо!
Re: Полнотекстовый поиск для Firebird [сообщение #4552 является ответом на сообщение #4549] Mon, 26 February 2024 22:08 Переход к предыдущему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 332
Зарегистрирован: June 2022
Senior Member
На уровне udr я параллельный поиск по нескольким индексам не делал. Чисто теоретически можно секционировать индекс и тогда по всем секция искать параллельно.
Предыдущая тема: mon$attachments
Следующая тема: Вступите в Firebird Foundation. Уже пора!
Переход к форуму:
  


Текущее время: Sun Dec 22 14:51:59 GMT+3 2024

Общее время, затраченное на создание страницы: 0.01140 секунд