Реализация полнотекстового поиска с SoftInform Search SDK
В прошлом номере "Компьютерных вестей" мы с вами начали знакомство с весьма полезным SDK, позволяющим реализовывать в создаваемых приложениях функции полнотекстового поиска по документам. Сегодня, продолжая это знакомство, посмотрим на SoftInform Search SDK, если можно так выразиться, в действии.
Ещё немного о возможностях
Итак, в прошлый раз мы с вами уже успели узнать о том, что SoftInform Search SDK поддерживает большое количество разных источников данных, а также интегрируется в приложения благодаря достаточно удобной и привычной для многих программистов технологии COM. Но это, пожалуй, далеко не главное, что стоит упомянуть, говоря об этом программном продукте. Потому что все-таки главное его предназначение - именно поиск, и в плане поиска SoftInform Search SDK находится однозначно на высоте. Одна из наиболее интересных его возможностей - это запатентованная технология поиска похожих документов SoftInform Search Technology.
Что означает "технология поиска похожих документов"? По большому счету, это уже в некотором роде семантический поиск, поскольку благодаря этому виду поиска действительно можно находить документы, не содержащие ни единого слова из поискового запроса, но при этом полностью соответствующие ему по содержанию. Поиск похожих по содержанию документов осуществляется не по отдельным словам и фразам, а по целому тексту, то есть поисковый запрос представляет собой текст определенного размера, а не обычные два-три слова. Как пишут сами разработчики SoftInform Search SDK, "поиск похожих является много большим, чем простое сравнение слов из строки запроса со словами в тексте. При поиске похожих по содержанию документов с помощью поисковой платформы Softinform задействовано все множество слов, встречающихся в документе с учетом всех словоформ". Так что, используя SoftInform Search SDK для реализации поисковых возможностей в своём приложении, вы не только предложите пользователям обычный полнотекстовый поиск, но ещё и сможете дополнить функциональность удобным поиском похожих документов.
Что весьма приятно, SoftInform Search SDK отличается весьма приличной скоростью индексации данных - от 15 до 30 Гб/час, в зависимости от формата, в котором находятся данные. Более подробную информацию о скорости индексации и результатах тестов можно найти на официальном сайте компании-разработчика данного SDK по адресу www.softinform.ru/main/full-text-search-products-searchinform-client-features-speed-tests.html.
Стоит также отметить, что в SoftInform Search SDK реализована функция поддержки нестандартных источников данных. Такими источниками могут являться файлы различных пока ещё не известных поисковому "движку" форматов, базы данных и так далее. Как пишут создатели SDK, "при необходимости мы можем сделать доступными для индексации нашей программой данные, хранящиеся в любом формате, подключив их как дополнительный источник данных. Эта технология позволяет постоянно расширять список поддерживаемых форматов данных".
Впрочем, пожалуй, достаточно уже рассказов о том, какой замечательный продукт SoftInform Search SDK. Лучше перейдем к практике - то есть, к применению этого продукта непосредственно для поиска данных с его помощью в вашем приложении.
Хочу сразу предупредить, что все примеры будут идти на Delphi, поскольку этот язык знают практически все ещё со школьной или институтской скамьи. Но, хочу ещё раз подчеркнуть, что вы можете использовать для работы с SoftInform Search SDK и любой другой язык программирования, поддерживающий COM.
Практика: начало
Пожалуй, самый большой минус SoftInform Search SDK - это некоторый напряг с документацией. Поскольку документация по SoftInform Search SDK практически полностью исчерпывается ёмкими фразами вроде "The Count property specify count of elements in the array", большей частью постигать SDK придется по примерам и по разговорам со специалистами компании-разработчика. Впрочем, те готовы взаимодействовать с потребителями их детища: как написано на сайте SoftInform, "наши технические специалисты качественно и своевременно готовы ответить на все Ваши вопросы, которые могут возникнуть при интеграции или использовании Softinform API".
Итак, будем считать, что вы уже зашли на сайт и получили ссылку на скачивание пробной версии SoftInform Search SDK, зарегистрировавшись там. После установки SDK на вашем компьютере имеет смысл заново сгенерировать модули из поставляемых в комплекте SDK библиотек типов, поскольку те, которые лежат в папке с самим SDK, видимо, просто давно не обновлялись. Впрочем, это мелочь, потому что сделать новые модули - дело пары минут.
Поскольку мы имеем дело с COM, то работать нужно будет с интерфейсами - думаю, это было вполне понятно и с самого начала, так что ничего нового я сейчас не сказал. Основной интерфейс, который обеспечивает доступ ко всему API SoftInform Search SDK, называется ISearchInformAPI. Давайте рассмотрим применение основных интерфейсов SoftInform Search SDK на примере кода, который позволит нам подключиться к серверу и посмотреть, какие индексы и базы синонимов нам доступны. Вы можете увидеть данный код в листинге, а мы сейчас будем разбирать, что именно там написано.
procedure ConnectToSIServer; var SiAPI: ISearchInformAPI; SiSrv: ISIServer2; SiReqGen: ISISearchRequestGenerator3; SiIndex: ISIIndex4; SiSynDb: ISISynonymDatabases; SiDBs: ISIStrings; Msg1, Msg2: string; i: integer; begin // Создаём экземпляр коннектора для SoftInform // Search SDK API SiAPI := CoSearchInformAPI.Create; // Открываем удалённый сервер - естественно, // вместо localhost'а может быть remote-адрес. // Локальный сервер можно также открыть методом // OpenLocalServer SiSrv := SiAPI.OpenRemoteServer('localhost') as ISIServer2; // Создаём генератор запросов SiReqGen := API.SearchRequestGenerator as ISISearchRequestGenerator3; // Получаем список доступных индексов, чтобы // потом показать его в сообщении Msg := ''; for i:= 0 to SiSrv.Indexes.Count - 1 do begin Msg1 := Msg1 + SiSrv.Indexes.IndexName[i] + #13#10; end; // Загружаем первый попавшийся индекс Randomize; SiIndex := SiSrv.OpenIndex (SiSrv.Indexes.IndexName[Random(SiSrv.Indexes.Count)]) as ISIIndex4; // Получаем список доступных баз синонимов // (тоже потом его показываем) SiSynDb := srv.SynonymDatabases; Msg2 := ''; SiDBs := SiSynDb.GetDatabaseList; for i := 0 to SiDBs.Count - 1 do begin Msg2 := Msg2 + SiDBs.Items[I] + #13#10; end; ShowMessage('Индексы:'#13#10 + Msg1 + 'Базы синонимов:'#13#10 + Msg2); end;
Собственно говоря, смысл приведенного в листинге фрагмента кода более-менее ясен из комментариев, которые в нем периодически встречаются. Но, на всякий случай, дополнительно поясню ещё раз, что же именно там написано.
Для начала мы создаем экземпляр специальной переменной - коннектора к библиотеке SoftInform Search SDK. Особой нагрузки этот коннектор на себе не несет, но нужен для того, чтобы потом пользоваться возможностями SDK при поиске данных. Собственно говоря, буквально в следующей строчке мы им и пользуемся для того, чтобы соединиться с удаленным поисковым сервером (в комментариях написано, каким образом можно соединиться с сервером локальным). После того, как соединились с серверами, создаем особый объект - генератор запросов, который дает нам возможность создавать на стороне клиента поисковые запросы и затем транслировать их серверу. После этого получаем список доступных поисковых индексов - в отличие от многих других поисковых "движков", SoftInform Search SDK умеет работать с множеством поисковых индексов, и программист может выбрать нужный. Таким образом, можно организовать отдельные поисковые индексы для каждого источника данных в тех случаях, когда таких источников несколько, и все они разнородные. После загрузки списка индексов мы генерируем случайным образом номер индекса, к которому затем подключаемся. После того, как подключение к индексу будет завершено, загружаем аналогичный списку индексов список баз данных с синонимами, который затем показываем пользователю в окне с сообщением. В этом же сообщении мы показываем, кстати говоря, и список доступных индексов - впрочем, наверное, это достаточно неплохо видно и просто по самому тексту программы. Собственно говоря, процесс подключения к серверу, как видите, не слишком сложен - SoftInform Search SDK действительно достаточно прост в использовании.
Конечно, приведенный в листинге код не идеален. В реальных приложениях, конечно, лучше это всё обернуть блоком try...except; переменные, отвечающие за взаимодействие с сервером, лучше сделать глобальными, а ещё лучше написать для взаимодействия с сервером отдельный класс. Но это все вы уже при желании можете проделать самостоятельно: все-таки основная задача этого куска кода - просто проиллюстрировать работу с SoftInform Search SDK.
Что ж, пожалуй, на сегодня достаточно. В следующих номерах "КВ" продолжим разговор о SoftInform Search SDK и посмотрим новые примеры работы с этим программным продуктом.
Вадим СТАНКЕВИЧ,
dreamdrusch@tut.by