Приложение A: Файл конфигурации FTS

Файл конфигурации полнотекстового поиска представляет собой XML-файл, как правило, располагающийся в каталоге src модуля core и содержащий описание индексируемых сущностей и их атрибутов.

Файл конфигурации FTS задается в свойстве приложения cuba.ftsConfig.

Рассмотрим структуру файла.

fts-config – корневой элемент.

Элементы fts-config:

  • entities – список сущностей, подлежащих индексированию и поиску.

    Элементы entities:

    • entity – описание индексируемой сущности.

      Атрибуты entity:

      • class – Java класс сущности.

      • show – должна ли данная сущность показываться в результатах поиска самостоятельно. Значение false используется для сущностей-связей, которые не интересны пользователю сами по себе, но нужны, например, для связи загруженных файлов и сущностей предметной области. По умолчанию true.

      Элементы entity:

      • include – включить атрибут или несколько атрибутов сущности в индекс.

        Атрибуты include:

        • re – регулярное выражение для отбора атрибутов по имени.

        • name – имя атрибута. Может быть путем (через точку) по ссылочным атрибутам. Тип не проверяется, однако если имя является путем, то возможны два случая:

          1. Конечный атрибут должен быть сущностью (не embeddable), а не простым типом (атрибут простого типа не имеет здесь смысла, он должен индексироваться в своей сущности).

          2. Конечный атрибут должен быть простым типом встраиваемой (embeddable) сущности. Например, если индексируемая сущность имеет поле address типа Address (embeddable сущность), то имя атрибута в файле конфигурации fts должно быть address.city или address.street, а не просто address.

  • exclude – исключить ранее включенный атрибут. Возможные атрибуты такие же, как в элементе include.

  • searchables – Groovy-скрипт для добавления в очередь на индексирование произвольных сущностей, связанных с измененной.

    Например, когда изменяется (добавляется, удаляется) экземпляр CardAttachment, мы должны также переиндексировать связанный с ним экземпляр Card, так как сам собой Card в очередь не встанет, ибо не менялся.

    При запуске в скрипт передаются следующие переменные:

    • searchables – список сущностей, который нужно пополнять.

    • entity – текущий экземпляр сущности, помещаемый в очередь автоматически.

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

    <entity class="com.haulmont.workflow.core.entity.CardAttachment" show="false">
        ...
        <searchables>
            searchables.add(entity.card)
        </searchables>
    </entity>
  • searchableIf – Groovy-скрипт для ограничения помещения в очередь некоторых экземпляров индексируемой сущности.

    Например, может быть, не нужно индексировать старые версии документов.

    При запуске в скрипт передается переменная entity – текущий экземпляр сущности. Скрипт возвращает булевское значение: true, для того чтобы индексировать текущий экземпляр, false, чтобы игнорировать его.

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

    <entity class="com.haulmont.docflow.core.entity.Contract">
        ...
        <searchableIf>
            entity.versionOf == null
        </searchableIf>
    </entity>

Пример файла конфигурации FTS:

<fts-config>
    <entities>

        <entity class="com.sample.library.entity.Author">
            <include re=".*"/>
        </entity>

        <entity class="com.sample.library.entity.Book">
            <include re=".*"/>
        </entity>

        <entity class="com.sample.library.entity.BookInstance">
            <include re=".*"/>
        </entity>

        <entity class="com.sample.library.entity.BookPublication">
            <include re=".*"/>
        </entity>

        <entity class="com.sample.library.entity.Publisher">
            <include re=".*"/>
        </entity>

        <entity class="com.sample.library.entity.EBook">
            <include name="publication.book"/>
            <include name="attachments.file"/>
        </entity>

        <entity class="com.haulmont.workflow.core.entity.CardAttachment" show="false">
            <include re=".*"/>
            <exclude name="card"/>

            <searchables>
                searchables.add(entity.card)
            </searchables>
        </entity>

    </entities>
</fts-config>