Дерево страниц

Сравнение версий

Ключ

  • Эта строка добавлена.
  • Эта строка удалена.
  • Изменено форматирование.
Информация
iconfalse
Корневой элемент beans. Пространство имен: <beans lxmlns="http://www.springframework.org/schema/beans">
Информация
iconfalse
titleКраткое описание
<?xml version="1.0" encoding="UTF-8" ?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:c="http://www.springframework.org/schema/c" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- {Модуль} --> <bean id="newModuleSearcher" class="ru.intertrust.cm_sochi.srv.connector.sochi.search.SochiSolrSearcher"> <constructor-arg name="cmAppSystemId" value="{Module}"/> <constructor-arg name="isNamed" value="true"/> <constructor-arg name="searchArea" value="{Module}"/> <constructor-arg name="targetCollectionName" value="(search)"/> <constructor-arg> <bean class="ru.intertrust.cm_sochi.srv.connector.sochi.search.InternalDocsSearchFilterCreator"/> </constructor-arg> <constructor-arg> <bean class="ru.intertrust.cmj.af.search.dp.docinfo.CustomModuleInfoExtractor" c:messageSource-ref="cmj_af_search_messageSource" c:ident="{Module}"/> </constructor-arg> </bean> <!-- Модуль end--> <!-- {Модуль} --> <!-- Иерархия билдеров областей поиска --> <bean id="rootScopeBuilder" class="ru.intertrust.cmj.af.search.ScopeTreeBuilder"> <property name="childs"> <list> <!-- {Модуль} --> <bean class="ru.intertrust.cmj.af.search.dp.CmDocTypesScopeBuilder"> <constructor-arg index="0" value="{module}"/> <constructor-arg index="1" value="{Module}"/> <constructor-arg index="2"> <list> <ref bean="subject"/> </list> </constructor-arg> <constructor-arg index="3"> <set> <ref bean="rkkInternalBundle"/> <ref bean="resolutionBundle"/> <ref bean="reportBundle"/> <ref bean="mainDocBundleForCustom"/> </set> </constructor-arg> <constructor-arg index="4"> <list> <ref bean="{Module}Searcher"/> </list> </constructor-arg> <constructor-arg index="5"> <ref bean="cmSearchScopeCompositExBuilder"/> </constructor-arg> </bean> <!-- {Модуль} end--> </list> </property> </bean> <!-- Иерархия билдеров простого поиска --> <bean id="rootScopeBuilderSimple" class="ru.intertrust.cmj.af.search.ScopeTreeBuilder"> <property name="childs"> <list> <!-- {Модуль} --> <bean class="ru.intertrust.cmj.af.search.dp.CmDocTypesScopeBuilder"> <constructor-arg index="0" value="{module}"/> <constructor-arg index="1" value="{Module}"/> <constructor-arg index="2"> <list> <ref bean="subject"/> </list> </constructor-arg> <constructor-arg index="3"> <set> <ref bean="mainDocBundleSimple"/> </set> </constructor-arg> <constructor-arg index="4"> <list> <ref bean="{Module}Searcher"/> </list> </constructor-arg> <constructor-arg index="5"> <ref bean="cmSearchScopeCompositExBuilder"/> </constructor-arg> </bean> <!-- {Модуль} end--> </list> </property> </bean> <!-- Иерархия билдеров однострочного поиска. Однострочный поиск повторяет структуру расширенного поиска, но урезан по бандлам --> <bean id="oneLineRootScopeBuilder" class="ru.intertrust.cmj.af.search.ScopeTreeBuilder"> <property name="childs"> <list> <!-- {Модуль} --> <bean class="ru.intertrust.cmj.af.search.dp.CmDocTypesScopeBuilder"> <constructor-arg index="0" value="{module}"/> <constructor-arg index="1" value="{Module}"/> <constructor-arg index="2"> <list> <ref bean="subject"/> </list> </constructor-arg> <constructor-arg index="3"> <set> <ref bean="mainDocBundleOneLine"/> </set> </constructor-arg> <constructor-arg index="4"> <list> <ref bean="{Module}Searcher"/> </list> </constructor-arg> <constructor-arg index="5"> <ref bean="cmSearchScopeCompositExBuilder"/> </constructor-arg> </bean> <!-- {Модуль} end--> </list> </property> </bean> <!-- Конфигурация параметров запроса ({Модуль}) --> <bean id="dominoRequestConfig{Module}" parent="dominoRequestConfigSuper"> <!-- Отображение ID параметров запроса на поля notes документа --> <property name="nsFieldsByParamByBundleID"> <map merge="true"> <entry key="rkk#regDate" value="outdate"/> <entry key="rkk#addressees" value="To"/> <entry key="rkk#signer" value="UserFrom"/> <entry key="rkk#executor" value="Mast"/> <entry key="resolution#regDate" value="outdate"/> <entry key="mainDoc#regDate" value="outdate"/> <entry key="mainDoc#signer" value="UserFrom"/> <entry key="mainDoc#docDate" value="outdate"/> <entry key="mainDoc#docDateSimple" value="outdate"/> <entry key="report#regDate" value="outdate"/> </map> </property> <!-- Отображение ID бандла на имя формы notes документа --> <property name="formsByBundleID"> <map merge="true"> <entry key="rkk" value="Input"/> <entry key="mainDoc" value="Input"/> </map> </property> </bean> <!--Параметры сортировки результатов поиска ({Модуль}) --> <bean id="sortingParams{Module}Date" class="ru.intertrust.cmj.af.search.dp.docinfo.SortingParams"> <property name="columnName" value="regDate"/> <property name="sortingFieldType" value="String"/> <property name="default" value="true"/> <property name="defaultSortingDirection" value="descendant"/> <property name="sortingDirections"> <set> <value>descendant</value> <value>ascendant</value> </set> </property> </bean> <!-- Конфигурация отображения результатов поиска ({Модуль}) --> <bean id="moduleExtractorConfig{Module}" parent="moduleExtractorConfigSuper"> <!-- Отображение формы документа на имя корневого типа --> <property name="rootTypesByBundleID"> <map merge="true"> <entry key="rkk" value="rkk-search-result"/> </map> </property> <!-- Отображение имя формы notes документа на ID бандла --> <property name="bundleIDsByForm"> <map merge="true"> <entry key="Input" value="rkk"/> </map> </property> <property name="nsFieldsByClTypeByBundleID"> <map merge="true"> <entry key="rkk#regDate" value="outdate"/> <entry key="rkk#to" value="S"/> <entry key="rkk#from" value="S2"/> <entry key="mainDoc#regDate" value="outdate"/> <entry key="mainDoc#signer" value="S2"/> </map> </property> <property name="formulasByClTypeByBundleID"> <map merge="true"> <entry key="rkk#hasAttachments" value="doc.getItemValueString('IsHasContent').trim() == '1'"/> <entry key="rkk#id" value="ctx.getString('Links_DocReplID').trim() == '' ? '' : (ctx.getString('Links_DocReplID').trim() + ':' + ctx.getString('Links_DocUNID').trim())"/> </map> </property> </bean> </beans>

В настройках поиска указывается конфигурация, в которой задаются атрибуты поиска, алгоритм обработки результатов их вывод

Блок кода
languagexml
titleСтруктура XML
collapsetrue

applicationContext-config-search.xml задаются параметры поиска, конфигация формы поиска, алгоритм обработки результатов и их вывод

Свойства страницы
Разбить на подстраницы
Статус

Статус
colourYellowGreen
titleВ РАБОТЕГОТОВО

Комментарий



Описание взаимодействия конфигураций в настройке поиска

Image Added

панель

Оглавление

Варианты поиска

Простой поиск
Блок кода
languagexml
<bean id="dpQueryFormSimple_custom" class="ru.intertrust.cmj.af.search.dp.CmQueryForm" c:scopeBuilder-ref="rootScopeBuilderSimple"/>
Расширенный поиск
Блок кода
languagexml
<bean id="dpQueryForm_custom" class="ru.intertrust.cmj.af.search.dp.CmQueryForm" c:scopeBuilder-ref="rootScopeBuilder"/>
Однострочный поиск
Блок кода
languagexml
<bean id="dpQueryFormOneLine_custom" class="ru.intertrust.cmj.af.search.dp.CmQueryForm" c:scopeBuilder-ref="oneLineRootScopeBuilder"/>
Расширенный поиск по связям
Блок кода
languagexml
<bean id="dpQueryFormAdvansedForLinks_custom" class="ru.intertrust.cmj.af.search.dp.CmQueryForm" c:scopeBuilder-ref="rootScopeBuilderLinks"/>
Простой поиск по связям
Блок кода
languagexml
<bean id="dpQueryFormSimpleForLinks_custom" class="ru.intertrust.cmj.af.search.dp.CmQueryForm" c:scopeBuilder-ref="rootScopeBuilderSimple"/>
Блок кода
languagexml
    <bean id="singleLineSearchSettings" class="ru.intertrust.cmj.rest.search.SingleLineSearchSettings">
        <constructor-arg name="queryFormId" value="dpQueryFormOneLine_custom"/>
        <constructor-arg name="regNumParameter" value="regNumberExact"/>
        <constructor-arg name="searchOnEverywhereParameter" value="searchOnEverywhere"/>
        <constructor-arg name="resultParamMapping">
            <map>
                <entry key="regNumberExact" value="regFullNumber"/>
            </map>
        </constructor-arg>
    </bean>

    <bean id="ddpQueryFormSimpleominoDocumentSearchResultItemFactory" class="ru.intertrust.cmj.af.search.dp.DocumentSearchResultItemFactory" />
    <!-- Контекстный поиск -->
    <bean id="dpQueryFormContextual_custom" class="ru.intertrust.cmj.af.search.dp.CmQueryFormTunable"
          c:scopeBuilder-ref="contextualSearchRootScopeBuilder">
        <description>Потребители поискового механизма должны получать из
            спринг-контекста данный бин, а остальные бины через его св-ва
        </description>
    </bean>

Иерархия билдеров областей поиска

Иерархия билдеров задается в бине rootScopeBuilder в свойстве childs.
Пример, настройка области поиска «Договоры»:

Блок кода
languagexml
<bean class="ru.intertrust.cmj.af.search.dp.CmDocTypesScopeBuilder">
	<constructor-arg name="idPrefix" value="contracts" />
	<constructor-arg name="systemId" value="ContractsLite" />
	<constructor-arg name="params">
		<list>
			<ref local="subject" />
		</list>
	</constructor-arg>
	<constructor-arg name="bundles">
		<set>
			<ref local="rkkContractsBundle" />
			<ref local="addAgrBundle" />
			<ref local="docToContractBundle" />
			<ref local="financeBundle" />
			<ref local="resolutionBundle" />
			<ref local="reportBundle" />
			<ref local="mainDocBundle" />
		</set>
	</constructor-arg>
	<constructor-arg name="searchers">
		<list>
			<ref local="contractsSearcher" /> 
			<ref local="contractsArc" /> 
		</list>
	</constructor-arg>
	<constructor-arg name="builder">
		<ref local="cmSearchScopeCompositExBuilder" />
	</constructor-arg>
</bean> 
Пример
Для формирования скоупа в класс билдера передаются парамтеры:
  1. Уникальный префикс для идентификатора области. Должен быть уникальным в рамках иерархии областей одной;
    <constructor-arg name="idPrefix" value="contracts" />
  2. Идентификатор БД;
    <constructor-arg name="systemId" value="ContractsLite"
  3. Параметры дефолтного бандла. Обычно указывается один параметр – subject.
    <ref local="subject" />
  4. Набор бандлов
    <constructor-arg name="bundles"> …
  5. Набор поисковиков
    <constructor-arg name="searchers"> … 
Настройка соответствия «поисковый параметр - > поле/формула/форма документа»

Данная настройка используется при формировании полнотекстового запроса к Domino БД. Настройка задается в бинах наследниках класса ru.intertrust.cmj.af.search.dp.request.DominoRequestConfig. id бина задается по правилу: «dominoRequestConfig»+ключ модуля (см. 3) в 3.2.4). Например, dominoRequestConfigInputDocs :

Блок кода
languagexml
<!-- Конфигурация параметров запроса (ВхД) -->
<bean id="dominoRequestConfigInputDocs" parent="dominoRequestConfigSuper">
	<!-- Отображение ID параметров запроса на поля notes документа -->
	<property name="nsFieldsByParamByBundleID">
		<map merge="true">
			<entry key="rkk#regDate" value="rdate" />
			<entry key="rkk#docDate" value="outdate" />
			<entry key="rkk#correspondent" value="UserFrom#From" />
			<entry key="rkk#docNumber" value="OutNumber" />
			<entry key="rkk#corrExecutor" value="Mast" /> 
		</map>
	</property>
	<!-- Отображение ID бандла на имя формы notes документа -->
	<property name="formsByBundleID">
		<map merge="true">
			<entry key="rkk" value="Input" />
			<entry key="mainDoc" value="Input" />
		</map>
	</property>
</bean>
В конструктор бина передаются параметры:
  1. <property name="nsFieldsByParamByBundleID"> - карта соответствий «параметр-> notes-поле». Ключ элемента карты имеет формат: id бандла# id параметра. Например, key="rkk#regDate". Значение элемента карты в простом случае представляет собой имя соотв. Notes-поля, которое участвует в формировании строки поиска в Domino. Например, value="rdate". Далее рассмотрим следующие случаи:
    1. Параметр с типом vcard (сотрудник) и в Domino идет поиск не только по открытому имени сотрудника, но и по названию организации сотрудника. В этом случае в поисковом запросе нужно указать два поля – поле, в котором хранится имя сотрудника, и поле с названием организации. Оба поля передаются в формате: поле сотрудника # поле организации. Например, value="UserFrom#From". Запрос по параметру будет выглядеть следующим образом:
      ([UserFrom]="Петров В. А." AND [From]="Руднев-Шиляев")).
    2. Случай, когда для одного параметра необходимо выполнить поиск по двум полям. В данном случае в поисковом запросе используется оператор ИЛИ. Оба поля передаются в формате: поле1% поле2. Например,
      value="Executor%execpeoples#ORGANISATIONNAME".
      Запрос по параметру будет выглядеть следующим образом:
      (([Executor]=" Петров В. А." OR ([execpeoples]=" Петров В. А." AND [ORGANISATIONNAME]="Руднев-Шиляев"))).
  2. property name="nsFieldsByParamByBundleID"> - карта соответствий «параметр-> формула». Ключ элемента карты имеет такой же формат, который описан в п. 1). Значение элемента карты представляет собой выражение для FT-запроса. Например, <entry key="rkk#isControl" value="[ExtContr_Flag]="1"" />. К общему запросу данное выражение добавляется через оператор AND.
  3. <property name="formsByBundleID">- карта соответствий «id бандла-> имя notes-формы, соответствующей бандлу». Например, <entry key="rkk" value="Input" />.

Конфигурация отображения результатов поиска

Результат поиска отображается в формате коллекции (см. Рис.2). Перечень атрибутов (колонки на рис.2) объектов в результирующей коллекции настраивается в xml-файле поиска и в БД Каталог через настройку области поиска CMJ в БД Портал. Для каждого модуля в xml-файле поиска представлен свой бин, наследник класса ru.intertrust.cmj.af.search.dp.docinfo ModuleExtractorConfig. В данном бине задаются настройки соответствий, необходимые для формирования результирующей коллекции. id бина задается по правилу: «moduleExtractorConfig»+ключ модуля (см. 3) в 3.2.4). Например, moduleExtractorConfigRequests:

Блок кода
languagexml
<!-- Конфигурация отображения результатов поиска (ОГ) -->
<bean id="moduleExtractorConfigRequests" parent="moduleExtractorConfigSuper">
	<!-- Отображение формы документа на имя корневого типа -->
	<property name="rootTypesByBundleID">
		<map merge="true">
			<entry key="rkk" value="rkk-search-result" />
		</map>
	</property>
	<!-- Отображение имя формы документа на ID бандла -->
	<property name="bundleIDsByForm">
		<map merge="true">
			<entry key="Input" value="rkk" />
		</map>
	</property>
 	<!-- Настройка соответствий «элемент коллекции - системное поле» -->
	<property name="nsFieldsByClTypeByBundleID">
		<map merge="true">
			<entry key="rkk#regDate" value="RDate" />
			<entry key="rkk#to" value="S" />
			<entry key="rkk#from" value="CorrBeard%LNameCorp" />
			<entry key="mainDoc#regDate" value="RDate" />
			<entry key="mainDoc#signer" value="CorrBeard%LNameCorp" />
		</map>
	</property>
 	<!-- Сортировка -->
	<property name="sortingsByFields">
		<set>
			<ref bean="sortingParamsMainDocDate" />
		</set>
 	<property name="sortingsByFields">
</bean> 
Настройка соответствий «форма – id бандла»

Данное соответствие передается в свойство bundleIDsByForm бина и связывает форму Notes-документа с id бандлом. Формат соответствия - <entry key=Форма документа value=id бандла />.
Например, 
<entry key="Input" value="rkk" />
Здесь форма Input -Ркк ОГ, rkk - id бандла Ркк.

Настройка соответствий «id бандла – представление типа объекта»

Данное соответствие передается в свойство rootTypesByBundleID бина и связывает бандл c представлением типа объекта.
Представлением типа объекта – это настройка в Палитра XML, определяющая состав атрибутов-колонок для документа коллекции. 
Формат соответствия - <entry keyid бандла value=представление типа объекта />.
Например, 

Блок кода
languagexml
<property name="rootTypesByBundleID">
	<map merge="true">
		<entry key="rkk" value="rkk-search-result" />
	</map>
</property> 
Настройка соответствий «элемент коллекции - системное поле»

Данное соответствие передается в свойство nsFieldsByClTypeByBundleID бина и задает правило получения атрибута документа коллекции из notes-документа. Формат соответствия - <entry keyid бандла#тип элемента коллекции value=поле документа/>.
Например,
<entry key="rkk#regDate" value="RDate" /> , здесь для получения атрибута regDate считывается значение из поля RDate notes-документа. 
Тип элемента коллекции - это настройка в БД Каталог, описывающая атрибут-колонку для документа коллекции.

Настройка соответствий «элемент коллекции - вычисляемое поле»

Данное соответствие передается в свойство formulasByClTypeByBundleID бина и задает правило получения атрибута документа коллекции из notes-документа путем использования @формулы. Формат соответствия - <entry keyid бандла#тип элемента коллекции value=JS-формула />.
Например,

Блок кода
languagexml
<property name="formulasByClTypeByBundleID">
	<map merge="true"> 
		<entry key="decisionProject#created" value="Created)" />
	</map>
</property> 
Параметры сортировки поиска
Блок кода
languagexml
<property name="sortingsByFields">
	<set>
		<ref bean="sortingParamsMainDocDate" />
	</set>
<property name="sortingsByFields">

Список параметров, которые используются при создании бинов SortingParams:

  • columnName - имя колонки, при клике на которую будет происходить сортировка
  • sortingFieldName - имя поля в Notes, по значению которого будет идти сортировка nodes из ресурса. Если sortingFieldName = null, то сортировка будет идти по значению поля columnName в ресурсе.
  • sortingFieldType - тип значения в сравниваемом поле. Если sortingFieldType = Integer, то при сортировке значения сравниваются как числа, иначе - как строки. Предполагается, что тип DateTime не нужен, т.к. маловероятно, что при клике на колонку, в которой отображается дата/время, будет идти сортировка по какому-то значению, отличному непосредственно от дата/время, а в JSON дата/время всегда будут в формате yyyy-mm-ddThh:mm:ssZ (такие значения можно сортировать, сравнивая как строки).
  • default - указывает будет ли совершена эта сортировка по умолчанию (может быть только одна сортировка по умолчанию для бандла, для добавления другой необходимо разнести по бандлам сортировки)
  • defaultSortingDirection - Указывает направление сортировки по умолчанию (descendant/ascendant)
  • bundleId - указывает id бандла для которого применяется сортировка, для каждого бандла надо делать свою, так как поля у объектов и имена колонок могут отличаться. id бандлов: rkk-search-result, mainDoc-search-result и др. По умолчанию rkk-search-result
  • sortingDirections - выбранное направление сортировки (по убыванию/по возрастанию) - принимает <set> -->
Блок кода
 <bean id="sortingParamsMainDocDate"
      class="ru.intertrust.cmj.af.search.dp.docinfo.SortingParams">
    <property name="columnName" value="regDate" />
    <property name="sortingFieldName" value="regDate" />
    <property name="sortingFieldType" value="String" />
    <property name="default" value="true" />
    <property name="defaultSortingDirection" value="descendant" />
    <property name="bundleId" value="<Cell-View>" />
    <property name="sortingDirections">
        <set>
            <value>descendant</value>
            <value>ascendant</value>
        </set>
    </property>
</bean>

Хардкод

К сожалению, не для всех параметров поисковой формы можно задать соответствия из п.3.2.6 в xml-файле поиска. К таким параметрам относится, например, параметр Тематика Ркк ОГ (fullQuestion), значение которого представляет собой элемент многоуровневого тематического классификатора. В таких случаях необходимо реализовать специальную обработку параметра. Например, см. класс ru.intertrust.cmj.af.search.dp.request.DominoRequestBuilderImpl, функция String getFormulaSearchFullQuestion(Map<?, ?> mapObject).
Также допускается хардкод для задачи формирования атрибутов результирующей коллекции. Например, см. классы наследники класса ModuleExtractorImpl. 

Актуализация xml-файл поиска из настройки

Для кастомизации настроек поиска была разработана альтернативная загрузка настроек поиска из внешнего файла. Файл хранится в клиенте Системного администратора\Структура системы\Настройка web-поиска.

Переиндексация модуля

Блок кода
languagesql
select fdr.id from F_DP_IntRkk natural join f_dp_rkkbase fdr join ss_module ss_module on fdr.module = ss_module.id and ss_module.id_type = fdr.module_type join ss_moduletype ss_moduletype on ss_module.type = ss_moduletype.id and ss_moduletype.alias ='{Module}'

Тип параметра

Список типов параметра

Видимость параметра

Свойство, позволяющее настраивать видимость поля в зависимости от значения другого поля

Классификаторы

Настройка «Классификатор параметра» позволяет задать для параметра на форме расширенного поиска возможность выбора значений из справочника. Классификатор определяется в xml-файле поиска. Связь параметра с классификатором задается в в настройке бина параметра.

Параметр поиска

Конфигурация параметров запроса

Бандл

Для каждой области поиска свой набор искомых объектов иначе бандлов (определение бандла см. ниже), для каждого бандла определен свой набор параметров. Один бандл может входить в несколько областей поиска. Один параметр может входить в несколько бандлов. При выборе более одной областей поиска система формирует пересечение бандлов этих областей для отображения в разделе «Искомый объект», т.е. используются общие бандлы. Набор параметров также формируется как пересечение параметров бандлов различных областей поиска. Например, в областях поиска соответствующих БД "ОРД" и "Поручения", может быть общий набор параметров, характерных бандлу "резолюция", входящего в обе эти области поиска. Пользователь имеет возможность выбрать такой набор, и в результаты должны попасть только объекты соответствующего класса из всех выбранных областей, исключив при этом объекты других классов.

ID-бандла

Список id-бандла

Иерархия билдеров областей поиска

Организует билдеры неиерархических областей поиска в иерархию для создания иерархии областей поиска.

Поисковик

Поисковик выполняет поиск по приложению средствами Solr

Параметры сортировки

Настройка параметров сортировки

Форма поиска

Подключение форм поиск к иерархии билдеров областей поиска

Настройка поиска формы

Настройка однострочного поиска в шапке

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

Настройка отображения результатов поиска