В этом учебном пособии подробно рассказывается о том, как включить индекс Oak Lucene для повышения производительности запросов в AEM (Adobe Experience Manager).

Индекс OAK Lucene

Чтобы запросы выполнялись хорошо, Oak поддерживает индексирование контента, хранящегося в репозитории. Когда выполняется запрос JCR, обычно сначала выполняется поиск в индексе. Если индекса нет, запрос выполняется для всего содержимого. Это отнимает много времени и накладных расходов для AEM. Запрос можно выполнить без индекса, но для больших наборов данных он будет выполняться очень медленно или даже прерываться.

Доступны три типа режима индексирования, которые определяют, как выполняется сравнение и когда обновляется содержимое индекса.

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

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

Индексирование почти в реальном времени (NRT) — этот метод указывает, что индекс является индексом почти в реальном времени.

Для индексирования используются редакторы фиксации. Некоторые редакторы относятся к типу IndexEditor и отвечают за обновление содержимого указателя на основе изменений в основном содержании. В настоящее время в Oak есть следующие встроенные редакторы:

  • PropertyIndexEditor
  • Редактор ссылок
  • LuceneIndexEditor
  • SolrIndexEditor

В AEM доступны 3 основных типа индексов:

  • Lucene — асинхронный (полный текст и свойства) — рекомендуется
  • Свойство — синхронный [Предпочтительно, только когда вам нужны синхронные результаты]
  • Solr — асинхронный

Настройка индекса Lucene в AEM

Oak поддерживает индексы на основе Lucene для поддержки как ограничений свойств, так и полнотекстовых ограничений. В зависимости от конфигурации индекс Lucene может использоваться для оценки ограничений свойств, полнотекстовых ограничений, ограничений пути и сортировки.

Если для запроса доступно несколько индексаторов, каждый доступный индексатор оценивает стоимость выполнения запроса. Затем Oak выбирает индексатор с наименьшей оценочной стоимостью.

У меня есть большие наборы данных (12 КБ) в разделе «/content/sampledata» со свойством id, значение свойства id всех узлов начинается с «1111».

Позвольте мне теперь выполнить запрос, чтобы получить все узлы в «/content/sampledata», значение свойства id которых начинается с «1111».

выберите * из [nt:unstructured], где [jcr:path] например ‘/content/sampledata/%’ и id LIKE ‘%1111%’

Выполнение запроса завершилось неудачно со следующим исключением: «Запрос прочитал или прошел более 100 000 узлов. Чтобы не повлиять на другие задачи, обработка была остановлена».

100000 — это значение queryLimitReads, значение queryLimitReads можно изменить, но после достижения предела запрос снова завершается ошибкой, а также это повлияет на общую производительность системы.

Значение queryLimitReads можно изменить с помощью следующей конфигурации OSGI — http://localhost:4502/system/console/configMgr/org.apache.jackrabbit.oak.query.QueryEngineSettingsService

Поведение выполнения запроса можно просмотреть с помощью инструмента производительности запросов.

Это отобразит медленные запросы и популярные запросы, а также запрос объяснения объясняет детали выполнения запроса.

Для запроса не определен индекс, поэтому он выполняется как полный обход, запрос прошел более 100 000 и прерван, чтобы избежать влияния на другие действия.

Давайте теперь посмотрим, как определить индекс Lucene для повышения производительности запросов.

Создайте узел с именем «testindex» в дубе: индекс со следующими свойствами.

jcr:primaryType — дуб:QueryIndexDefinition
тип — lucene
includePaths — /content/sampledata
fullTextEnabled — false
AssessmentPathRestrictions — true
compatVersion — 2
async — асинхронный, нет

При сохранении будет создан узел с именем indexRules.

По умолчанию узел с именем nt:base создается в соответствии с indexRules. Переименуйте узел в основной тип узлов, которые необходимо проиндексировать, в нашем случае «nt: unstructured»

Там узел по умолчанию с именем prop0, созданный в свойствах, переименуйте prop0 в свойство, которое необходимо проиндексировать, наш случай «id» и включите следующие свойства.

id:
propertyIndex — true
ordered — true
name — id
isRegexp — false

Для создания определений индекса можно использовать утилиту https://oakutils.appspot.com/generate/index.

Давайте теперь переиндексируем данные. Измените свойство переиндексации на true, чтобы инициировать асинхронное индексирование.

Значение свойства переиндексации будет изменено на false после запуска индекса, подождите некоторое время, пока индекс завершится.

Повторно выполните запрос. Теперь запрос работает без проблем и с большей производительностью, запрос выполняется с определенным индексом Lucene.

Всегда рекомендуется проверять медленно выполняющиеся пользовательские запросы и настраивать необходимое индексирование для повышения производительности. Если определено несколько индексов, дуб считает лучший индекс для выполнения запроса.

Первоначально опубликовано на https://www.albinsblog.com.