Добавление поисковой функции OmniFind в приложения Notes

Вызов SIAPI из LotusScript

Теперь можно добавлять функцию поиска IBM® OmniFind™ к традиционному приложению базы данных Lotus® Notes®, доступ к которому осуществляется через клиента Notes. В частности, из этой статьи вы узнаете, как вызывать IBM Java™ Search и Indexing API (SIAPI) непосредственно из LotusScript. Помимо демонстрации отображения результатов поиска в виде стандартных текстовых полей, в статье также показано, как можно отобразить результаты поиска в HTML из клиента Notes, что в значительной степени улучшает внешний вид и удобство пользования поисковым интерфейсом.

Тодд Лейба, архитектор поисковых систем, IBM

В настоящий момент Тодд Лейба - популяризатор Discovery and Search Analytics в подразделении IBM Information Management. Он является ведущим представителем, отвечающим за установление контактов с клиентами, партнерами, разработчиками и за разъяснение им стратегии IBM Discovery and Search. В его обязанности также входит учет последних рыночных тенденций, а также откликов заказчиков и разработчиков при планировании новых направлений в разработке продуктов IBM. В компетенцию Тодда Лейба входит архитектура полнотекстового поиска, информационно-поисковые системы и их применение в бизнесе. Ранее Тодд Лейба принимал участие в различных проектах, связанных с поисковыми функциями. В частности, он работал над продуктом IBM WebSphere Enterprise Search (OmniFind), обеспечивающим отличную производительность, масштабируемость и качественные результаты поиска и поддерживающим широкий спектр источников данных.



06.02.2008

Введение

IBM OmniFind Enterprise Edition - это полнотекстовый корпоративный поисковый продукт, обеспечивающий отличную производительность, масштабируемость и качественные результаты поиска и поддерживающий широкий спектр источников данных. Из продуктов Lotus функция индексации и поиска OmniFind поддерживается в Lotus QuickPlace® и Lotus Domino® Document Manager, а также в базах данных Lotus Notes.

OmniFind расширяет поисковые возможности приложения по сравнению с имеющейся на сегодняшний день функциональностью Domino в нескольких важных направлениях. Во-первых, OmniFind может осуществлять поиск за пределами Domino - в Интернете, по файловым системам, реляционным базам данных, а также по почтовым системам и системам управления документами других производителей. Удобство работы пользователя с поисковой системой можно улучшить за счет передовых поисковых возможностей OmniFind, например, при помощи средств проверки орфографии, функций автореферата, быстрых ссылок, показа структуры сайта и многого другого. OmniFind может улучшить производительность серверов Domino, взяв на себя полнотекстовое индексирование и выполнение поисковых операций. OmniFind - это настоящий продукт уровня предприятия, поддерживающий до 20 миллионов документов.

Возможно, вы уже приобрели OmniFind и обнаружили, как быстро и легко можно создать индекс и начать поиск. Вы также могли обнаружить, что клиентские поисковые приложения, предоставляемые OmniFind, основаны на J2EE и предназначены для запуска в среде сервера приложений J2EE, например IBM WebSphere®. Это удобно, если доступ осуществляется через Web-браузер, однако возможно, что конечные пользователи для доступа к Domino используют исключительно клиент Notes. В этом случае читайте статью далее и узнайте, как добавить поисковую функциональность к стандартным приложениям Lotus Notes.

Архитектура примера поискового приложения OmniFind

Важным аспектом такого решения является взаимосвязь OmniFind и Domino. Процессы OmniFind работают отдельно от Domino. Поэтому желательно, а чаще всего - рекомендуется запускать OmniFind на собственном выделенном сервере. Это гарантирует возможность работы с потенциально большим количеством подлежащих индексированию корпоративных документов, а также снимает с Domino нагрузку на полнотекстовое индексирование и поиск. Топография серверов и клиентов Notes проиллюстрирована на рисунке 1.

Рисунок 1. Топография приложения OmniFind Notes
Топография приложения OmniFind Notes

OmniFind установлен на отдельном сервере и настроен на просмотр и индексирование одной или нескольких баз данных Notes в конкретном домене Domino. Эти базы данных доступны для поиска через поисковый индекс OmniFind. Это показано в нижнем левом углу рисунка 1. Важно отметить, что пользователь осуществляет поиск не по первоначальным данным Notes, а по поисковому индексу OmniFind, в котором может содержаться другая информация, собранная на предприятии (например, из Интернета, файловых систем и т. д.)

Наше поисковое приложение OmniFind спроектировано как стандартная база данных Notes с именем OmniFind.nsf. Это показано в верхнем левом углу рисунка 1. OmniFind.nsf состоит из двух форм:

  • Первая форма позволяет определить, какая система OmniFind должна использоваться для поиска (подробнее это будет описано позже).
  • Вторая форма представляет собой собственно поисковую форму, используемую для передачи запросов и отображения результатов поиска. Дополняющий поисковую форму LotusScript отвечает за вызов SIAPI. SIAPI взаимодействует с OmniFind, используя параметры настройки, заданные в первой конфигурационной форме

На рисунке 2 представлена экранная копия поискового приложения OmniFind. На панели содержания слева имеются 3 опции. Опция OmniFind Settings отсылает к конфигурационной форме, показанной на рисунке 3. Здесь мы вводим имя хоста и номер порта сервера OmniFind, а также идентификатор пользователя и пароль, если на сервере OmniFind включены функции безопасности. Также необходимы идентификаторы приложения и коллекции (Application Id и Collection Id). Для простоты данное конкретное решение выполняет поиск только по одной коллекции OmniFind, в соответствии с назначенным идентификатором коллекции. В одной коллекции OmniFind могут содержаться документы из многих баз данных Notes и других источников. Естественным усовершенствованием такого решения была бы реализация, позволяющая пользователю выбирать из списка коллекций ту, поиск по которой он хочет выполнить. Кнопка Test Connection позволяет связываться с сервером OmniFind с использованием введенных параметров. При этом выводится сообщение об успешном или неуспешном соединении.

Figure 2. Приложение OmniFind Notes
Приложение OmniFind Notes

Опция Saved Searches предоставляет список ранее выполненных запросов и их результатов. Это высоко востребованная в стандартном поисковом приложении функция, которая с легкостью обеспечивается внутренним устройством Notes. Поскольку поисковая форма - это всего лишь форма Lotus Notes, пользователь получает возможность сохранить ее экземпляр как документ внутри базы данных OmniFind.nsf. В представлении базы данных этих поисковых форм могут указываться автор запроса, время и дата его выполнения, а также использованные в запросе ключевые слова. Если база данных OmniFind.nsf размещена на сервере Domino, то возможно совместное использование сохраненных запросов, что потенциально исключает необходимость вообще обращаться к поиску.

Опция Start Searching на панели содержания вызывает поисковую форму. На рисунке 2 в нижнем правом углу показан экземпляр поисковой формы. Форма состоит из двух частей. Верхняя часть представляет собой поле редактирования, в которое пользователи вводят критерии поиска, а рядом расположена кнопка Search, выполняющая поиск. Результаты отображаются в нижней части формы под горизонтальной полосой. На каждой странице выводится по десять результатов, поэтому на странице имеются также кнопки "назад" и "вперед" для перемещения по разным страницам с результатами.

Figure 3. Форма параметров OmniFind
Форма параметров OmniFind

Установка примера приложения Notes OmniFind

Предполагается, что продукт OmniFind уже установлен на отдельном сервере и сконфигурирован при помощи коллекции для поиска (индекса). Такая коллекция может содержать документы, извлеченные из любого поддерживаемого источника. Однако в настоящее время наш пример приложения OmniFind может отображать только значки, представляющие результаты поиска по Lotus Notes и документам файловой системы. Это ограничение касается лишь визуального отображения типа результатов поиска. При желании можете добавить другие значки, представляющие те или другие источники данных.

Установка поискового приложения OmniFind представляет собой двухступенчатый процесс.

  1. Загрузите базу данных OmniFind.nsf из раздела Загрузка данной статьи и скопируйте ее в каталог данных вашего каталога Domino.
  2. Скопируйте файлы esapi.jar и siapi.jar из каталога OmniFind <каталог установки>/lib в <каталог установки Domino>/jvm/ext

В примере приложения OmniFind для вызова IBM Search и Index API (SIAPI) используется LotusScript. Файлы esapi.jar и siapi.jar должны находиться в каталоге jvm/ext, чтобы Domino мог получить к ним доступ.

Для проверки правильности установки нужно просто подключиться к базе данных OmniFind.nsf с помощью клиента Notes, заполнить форму параметров OmniFind, а затем выполнить несколько поисковых запросов с помощью поисковой формы. Полезно нажать кнопку Test Connection в форме параметров для проверки правильности настроек. Типичная ошибка - не указать правильные идентификатор коллекции, имя хоста или номер порта. Идентификатор приложения по умолчанию должен иметь значение Default.

Простой пример SIAPI на Java

Прежде чем перейти к ознакомлению с процессом вызова SIAPI непосредственно из LotusScript, стоит проанализировать простой пример поиска с использованием SIAPI только на Java. Таким образом, можно увидеть, что необходимо для выполнения поиска посредством SIAPI. После ознакомления с этими требованиям остается всего лишь выполнить аналогичные вызовы на LotusScript с помощью интерфейса LotusScript-to-Java. В листинге 1 показан сокращенный пример кода поиска SIAPI.

Листинг 1. Примеры SIAPI на Java
// создаем допустимый Application ID, который будет использоваться
// Search Node для авторизации доступа к коллекции
ApplicationInfo appinfo = factory.createApplicationInfo(applicationName);
appinfo.setPassword(applicationPassword);

// создаем новый объект Properties.
Properties config = new Properties();
config.setProperty("hostname", "OmniFindHostName");
config.setProperty("port", "80");
config.setProperty("timeout", "60");
config.setProperty("username", "websphereUser");
config.setProperty("password", "webspherePassword");

// получаем специфическую для OmniFind реализацию SIAPI Search factory
SearchFactory factory = (SearchFactory) 	
	Class.forName("com.ibm.es.api.search.RemoteSearchFactory").newInstance();

// получаем реализацию Search Service 
SearchService searchService = factory.getSearchService(config);

// помещаем объект Searchable в заданный ID коллекции
Searchable searchable = null;
try { searchable = searchService.getSearchable(appinfo, collectionId);
} catch (SiapiException e) {return;}

// создаем новый объект Query с помощью заданной строки запроса
Query q = factory.createQuery("search terms go here");

// выполняем поиск. Будет возвращен объект ResultSet
ResultSet rset = null;
try { rset = searchable.search(q);
} catch (SiapiException e) { return; }

Result r[] = rset.getResults();
for (int k = 0; k < r.length; k++) {
     System.out.println("Result " + k + ": " + r[k].getDocumentID());
}

Сначала мы создаем объект ApplicationInfo, который используется для распознавания программы в OmniFind. Администратор OmniFind может разрешить программе осуществлять поиск либо по всем коллекциям, либо по определенному их набору.

Затем создается объект Properties с информацией о соединении с сервером OmniFind. Этот объект Properties используется для вызова getSearchService, чтобы установить реальное соединение с сервером OmniFind. Обратите внимание, что для получения реализации OmniFind сначала надо создать экземпляр search factory.

Получив объект SearchService, можно получить один или несколько поисковых объектов, каждый из которых ассоциируется с авторизованной коллекцией, по которой может осуществляться поиск. В этом случае мы получаем единственный поисковый объект.

Затем мы создаем объект запроса для фразы, которую мы ищем. Ваша формулировка запроса создаётся именно с помощью вызова createQuery.

Теперь мы готовы запустить поиск с помощью поискового метода поискового объекта, передавая ему ранее созданный объект запроса. Вызов выполняет поиск и возвращает объект набора результатов SIAPI. Отдельные результаты возвращаются в виде массива результатов с помощью вызова getResults. Существует множество методов доступа для различных атрибутов отдельного результата, например получение идентификатора документа, заголовка и/или URL-адреса.

В оставшейся части статьи детально описывается использование LotusScript в OmniFind.nsf. После изучения основ вызова SIAPI из LotusScript вы сможете самостоятельно написать продвинутое поисковое приложение OmniFind Notes.

Вызов SIAPI из LotusScript

Когда пользователь вводит в поисковую форму запрос и нажимает на кнопку поиска, управление переходит к библиотеке RunSearch LotusScript. Функция RunSearch отвечает за вызов SIAPI для выполнения поиска и обработки результатов.

Рисунок 4. Редактирование LotusScript с помощью Domino Designer
Редактирование LotusScript с помощью Domino Designer

Предполагается, что читатель уже знаком с LotusScript и знает, как использовать Domino Designer для изменения LotusScript. На рисунке 4 показан проект OmniFind.nsf, открытый в Domino Designer. Если развернуть элемент Forms, вы увидите две наших формы с названиями search и settings. Элемент Shared Code/Script Libraries также разворачивается, показывая две функции, а именно ReplaceSubstring и RunSearch. Функция ReplaceSubstring представляет собой сервисную программу, но в этой статье мы ее не рассматриваем, с ней можно ознакомиться в свободное время. Гораздо большую ценность представляет функция RunSearch, расположенная в правом окне. Ниже мы рассмотрим её более подробно:

Функция RunSearch LotusScript

Большинство переменных, используемых в RunSearch, описываются в самом начале функции.

За исключением SiapiResults, описываемой как Variant, следующие объекты SIAPI описываются либо как JavaClass, либо как JavaMethod, либо как JavaObjects, в соответствии с интерфейсом LotusScript-to-Java.

Листинг 2. Описания объектов SIAPI
	Dim SiapiImplClass As JavaClass 
	Dim SiapiFactoryObject As JavaObject  
	Dim SiapiImplMethod As JavaMethod  
	Dim SiapiAppInfoObject As JavaObject 
	Dim SiapiSearchServiceObject As JavaObject 
	Dim SiapiSearchableObject As JavaObject 
	Dim SiapiQueryObject As JavaObject 
	Dim SiapiResultSetObject As JavaObject 
	Dim SiapiResultObject As JavaObject 
	Dim SiapiResults As Variant

Ниже перечислены несколько необходимых собственных объектов Java:

Листинг 3. Описания объектов Java
	Dim JavaPropertiesClass As JavaClass 
	Dim JavaPropertiesObject As JavaObject 
	Dim JavaPropertiesMethod As JavaMethod 
	Dim JavaDate As JavaObject

Остальные описания переменных служат для поддержки операций с документами Notes и общих строковых переменных.

С точки зрения процедуры, первый шаг состоит в чтении документа параметров для получения информации по текущему соединению OmniFind. Позже эта информация будет использоваться для создания объекта Java Properties. Обратите внимание, что эту процедуру можно выполнять всего один раз во время инициализации.

Листинг 4. Извлечение параметров OmniFind
	Set curdb = notesSession.CurrentDatabase
	Set view=curdb.GetView("Settings")
	Set doc = view.GetDocumentByKey("Settings", True) 
	ApplicationID = doc.GetItemValue("ApplicationID") (0)
	User = doc.GetItemValue("User") (0)
	Password = doc.GetItemValue("Password") (0)	
	Host = doc.GetItemValue("Host") (0)
	Port = doc.GetItemValue("Port") (0)
	CollectionID = doc.GetItemValue("CollectionID") (0)

Следующее выражение очень важно, оно отвечает за установление сеанса Java между LotusScript и JVM.

Листинг 5. Установление сеанса Java
	Set javaSession = New JavaSession()

Как и в примере SIAPI Java, первым шагом для SIAPI является получение factory-объекта для реализации OmniFind. Для этого необходимо сначала получить класс SiapiSearchImpl из сеанса Java, далее получить метод SearchFactory из этого класса, а затем вызвать этот метод для получения реального factory-объекта, как показано ниже:

Листинг 6. Получение factory-объекта OmniFind
Set SiapiImplClass = 	javaSession.GetClass("com/ibm/siapi/search/SiapiSearchImpl") 
Set SiapiImplMethod = 	SiapiImplClass.GetMethod
	("createSearchFactory","(Ljava/lang/String	;)
	Lcom/ibm/siapi/search/SearchFactory;")  
Set SiapiFactoryObject = 	SiapiImplMethod.invoke
	(,"com.ibm.es.api.search.RemoteSearchFactory")

Получив factory-объект, можно создать объект OmniFind Application Info, который будет управлять теми коллекциями, по которым приложение сможет проводить поиск. Вам необходимо получить соответствующий идентификатор приложения у администратора OmniFind. Значение по умолчанию - "Default".

Листинг 7. Получение объекта идентификатора приложения
Set SiapiAppInfoObject = 	SiapiFactoryObject.createApplicationInfo(ApplicationID)

Далее необходимо создать объект Java Properties и инициализировать его, используя соответствующую информацию о соединении OmniFind, полученную из документа параметров. Как и при получении factory-объекта нужно запросить класс в сеансе Java и извлечь из него метод setProperty. Свойства имени пользователя и пароля необходимы лишь в том случае, если включена функция безопасности OmniFind. Ниже представлены необходимые вызовы:

Листинг 8. Создание объекта свойств Java
Set JavaPropertiesClass = javaSession.GetClass("java/util/Properties")
Set JavaPropertiesObject = JavaPropertiesClass.CreateObject()
Set JavaPropertiesMethod = 	JavaPropertiesClass.GetMethod
	("setProperty","(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object;")
Call JavaPropertiesMethod.invoke(JavaPropertiesObject,"hostname",Host)
Call JavaPropertiesMethod.invoke(JavaPropertiesObject,"port",Port)
Call JavaPropertiesMethod.invoke(JavaPropertiesObject,"timeout","60")
Call JavaPropertiesMethod.invoke(JavaPropertiesObject,"username",User)
Call JavaPropertiesMethod.invoke(JavaPropertiesObject,"password",Password)

Теперь извлеките поисковую службу на сервер OmniFind при помощи определенных ранее свойств соединения, а также получите поисковый объект для конкретной коллекции, по которой будет осуществляться поиск в соответствии с заданным идентификатором приложения.

Листинг 9. Извлечение поискового объекта OmniFind
Set SiapiSearchServiceObject = 	SiapiFactoryObject.getSearchService(JavaPropertiesObject)
Set SiapiSearchableObject = 	SiapiSearchServiceObject.getSearchable
	(SiapiAppInfoObject,CollectionID)

Мы практически готовы запустить поиск. Но прежде необходимо создать объект SIAPI Query, состоящий из поисковой строки и других параметров, введённых пользователем. Для получения этой информации из текущей поисковой формы я использую стандартные методы документов Notes. Ниже показан процесс создания объекта запроса SIAPI и установки их параметров.

Листинг 10. Создание объекта запроса SIAPI
Set SiapiQueryObject = SiapiFactoryObject.createQuery(searchExpression)
Call SiapiQueryObject.setQueryLanguage("en_US")
resultStart = (pgSize * pageNum) - pgSize
Call SiapiQueryObject.setRequestedResultRange(resultStart,pgSize)

OmniFind позволяет выводить результаты по одной странице за раз. Размер страницы определяете вы сами. Нужная вам страница обозначена начальным номером результата. Например, если размер страницы равен десяти, можно запросить третью страницу, начинающуюся с результата под номером 20 (0 - 9 = первая страница, 10 - 19 = вторая страница, 20 - 29 = третья страница и т. д.)

Поисковый метод поискового объекта выполняет поиск и возвращает объект набора результатов SIAPI, как показано ниже:

Листинг 11. Запуск поиска
Set SiapiResultSetObject = 	SiapiSearchableObject.search(SiapiQueryObject)

Обработка результатов поиска

Приведённый ниже код находится в функции RunSearch, но показан вне контекста, чтобы продемонстрировать, как можно просмотреть результаты поиска и извлечь соответствующую информацию о каждом конкретном результате с помощью SIAPI. После извлечения полученной информации в стандартные строковые переменные LotusScript вы сможете отформатировать и отобразить результаты поиска, используя уже знакомые вам стандартные функциональные возможности Notes.

Листинг 12. Обработка результатов поиска
numResults = SiapiResultSetObject.getAvailableNumberOfResults()	

SiapiResults = SiapiResultSetObject.getResults()
		
Forall vResult  In SiapiResults
			
	Set SiapiResultObject = vResult
			
	resultScore = SiapiResultObject.getScore()
	resultTitle = SiapiResultObject.getTitle()
	resultDesc = SiapiResultObject.getDescription()
	resultURL = SiapiResultObject.getDocumentID()
	resultSource = SiapiResultObject.getDocumentSource()
	Set JavaDate = SiapiResultObject.getDate()
	resultDate = JavaDate.toLocaleString()	

End Forall

Для получения дополнительной информации о доступных методах для объекта SIAPI Result обратитесь к Руководству по программированию OmniFind.

Отображение результатов в виде HTML

В последней части статьи вкратце описываются приемы, используемые функцией RunSearch для отображения результатов поиска в виде HTML. Результаты в формате HTML не зависят от SIAPI или OmniFind, скорее это выбор в пользу более удобной визуализации. В этом плане HTML обладает большей гибкостью в презентации материала (например, возможно выделение маркером отдельных терминов из запроса в авторефератах), а также больше похож на пример Web-приложения на основе OmniFind.

Этот подход состоит в основном в создании строки, содержащей весь HTML для отображения. После создания строки она записывается как поток Notes в поле "results" поисковой формы. Сам поток записывается как MIME-документ из нескольких частей, причём тип MIME устанавливается как text, а кодировка не указывается.

В первой части MIME-документа содержится сама строка HTML, а в двух следующих - изображения иконок в формате GIF, на которые ссылается HTML. Сами рисунки GIF определяются в разделе Initialize функции RunSearch.

Заключение

В данной статье продемонстрирован порядок добавления поисковой функции OmniFind к традиционным приложениям Notes с доступом из клиента Notes. В частности, я показал, как вызывать IBM Java Search and Indexing API (SIAPI) непосредственно из LotusScript. Кроме того, в статье показан процесс отображения результатов поиска в виде стандартных текстовых полей, а также как можно отобразить результаты поиска в HTML из клиента Notes, что в значительной степени улучшает внешний вид и удобство пользования поисковым интерфейсом.

С полученными базовыми знаниями вы можете улучшить свои приложения Notes, добавив в них функциональность OmniFind, превосходящую на сегодняшний день возможности Domino. Использование OmniFind даёт следующие преимущества:

  • OmniFind может осуществлять поиск за пределами Domino - в Интернете, по файловым системам, реляционным базам данных, а также по почтовым системам и системам управления документами других производителей.
  • Расширенные поисковые возможности OmniFind позволяют повысить удобство работы пользователя.
  • OmniFind может улучшить производительность серверов Domino, взяв на себя нагрузку по полнотекстовому индексированию и выполнению поисковых операций.
  • Наконец, OmniFind - это продукт уровня предприятия, поддерживающий до 20 миллионов документов.

Загрузка

ОписаниеИмяРазмер
Sample OmniFind Notes ApplicationOmniFind.nsf1.42MB

Ресурсы

Научиться

Получить продукты и технологии

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Information Management, Lotus, Технология Java
ArticleID=287155
ArticleTitle=Добавление поисковой функции OmniFind в приложения Notes
publish-date=02062008