在AEM中編制索引最佳實務

瞭解如何在Adobe Experience Manager (AEM)中編制索引最佳實務。 Apache Jackrabbit Oak為AEM中的內容搜尋提供支援,以下是關鍵點:

  • AEM提供各種開箱即用的索引,以支援搜尋和查詢功能,例如damAssetLucenecqPageLucene等。
  • 所有索引定義都儲存在/oak:index節點下的儲存庫中。
  • AEM as a Cloud Service僅支援Oak Lucene索引。
  • 索引設定應在AEM專案程式碼庫中管理,並使用Cloud Manager CI/CD管道進行部署。
  • 如果特定查詢有多個索引可供使用,則會使用預估成本最低的​索引
  • 如果指定的查詢沒有可用的索引,則會周遊內容樹以尋找相符的內容。 不過,透過org.apache.jackrabbit.oak.query.QueryEngineSettingsService的預設限制是僅遍歷100,000個節點。
  • 查詢的結果最後​ 篩選為 ​以確保目前的使用者具有讀取存取權。 這表示查詢結果可能小於索引節點的數目。
  • 在索引定義變更之後重新索引存放庫,需要時間,而且取決於存放庫的大小。

若要使用有效率且正確的搜尋功能而不會影響AEM執行個體的效能,請務必瞭解建立索引的最佳實務。

自訂與OOTB索引

有時候,您必須建立自訂索引以支援您的搜尋需求。 但在建立自訂索引之前,請遵循以下准則:

  • 瞭解搜尋需求,並檢查OOTB索引是否可支援搜尋需求。 透過Developer Console或​ 使用 ​查詢效能工具​ (位於本機SDKhttps://author-pXXXX-eYYYY.adobeaemcloud.com/ui#/aem/libs/granite/operations/content/diagnosistools/queryPerformance.html?appId=aemshell和AEMCS)。

  • 定義最佳查詢,使用最佳化查詢流程圖和JCR查詢速查表以作參考。

  • 如果OOTB索引不支援搜尋需求,您有兩個選擇。 但是,檢閱建立有效索引的提示

    • 自訂OOTB索引:方便維護和升級的偏好選項。
    • 完全自訂索引:前提是上述選項無法運作。

自訂OOTB索引

  • 在​ AEMCS ​中,自訂OOTB索引時,使用​ <OOTBIndexName>-<productVersion>-custom-<customVersion> ​命名慣例。 例如,cqPageLucene-custom-1damAssetLucene-8-custom-1。 這有助於在OOTB索引更新時合併自訂索引定義。 如需詳細資訊,請參閱對現成可用索引的變更

  • 在​ AEM 6.X ​中,上述命名​無法運作,不過只需在indexRules節點中以'b6'7d要屬性更新OOTB索引即可。

  • 一律使用CRX DE封裝管理員(https://experienceleague.adobe.com/crx/packmgr/?lang=zh-Hant)從AEM執行個體複製最新的OOTB索引定義,重新命名並在XML檔案中新增自訂。

  • 將索引定義儲存在ui.apps/src/main/content/jcr_root/_oak_index的AEM專案中,並使用Cloud Manager CI/CD管道進行部署。 如需詳細資訊,請參閱部署自訂索引定義

完全自訂索引

建立完全自訂索引必須是您的最後一個選項,而且前提是上述選項無法運作。

  • 建立完全自訂的索引時,請使用​ <prefix>。<customIndexName>-<version>-custom-<customVersion> ​命名慣例。 例如 wknd.adventures-1-custom-1。這有助於避免命名衝突。 在這裡,wknd是前置詞,adventures是自訂索引名稱。 此慣例適用於AEM 6.X和AEMCS,並有助於為未來移轉至AEMCS做好準備。

  • AEMCS僅支援Lucene索引,因此為了準備未來移轉至AEMCS,請一律使用Lucene索引。 如需詳細資訊,請參閱Lucene索引與屬性索引

  • 避免在與OOTB索引相同的節點型別上建立自訂索引。 請改為使用indexRules節點中的必要屬性自訂OOTB索引。 例如,請勿在dam:Asset節點型別上建立自訂索引,而是自訂OOTB damAssetLucene索引。 這是效能和功能問題的常見根本原因

  • 同時,請避免在索引規則(cq:Page)節點下新增多個節點型別,例如cq:TagindexRules。 請改為為每個節點型別建立個別的索引。

  • 如上節所述,將索引定義儲存在ui.apps/src/main/content/jcr_root/_oak_index的AEM專案中,並使用Cloud Manager CI/CD管道進行部署。 如需詳細資訊,請參閱部署自訂索引定義

  • 索引定義准則為:

    • 節點型別(jcr:primaryType)應為oak:QueryIndexDefinition
    • 索引型別(type)應為lucene
    • 非同步屬性(async)應為async,nrt
    • 使用includedPaths並避免excludedPaths屬性。 一律將queryPaths值設定為與includedPaths值相同的值。
    • 若要強制執行路徑限制,請使用evaluatePathRestrictions屬性並將其設定為true
    • 使用tags屬性標籤索引,並在查詢時指定此標籤值以使用索引。 一般查詢語法為<query> option(index tag <tagName>)
    code language-xml
    /oak:index/wknd.adventures-1-custom-1
        - jcr:primaryType = "oak:QueryIndexDefinition"
        - type = "lucene"
        - compatVersion = 2
        - async = ["async", "nrt"]
        - includedPaths = ["/content/wknd"]
        - queryPaths = ["/content/wknd"]
        - evaluatePathRestrictions = true
        - tags = ["customAdvSearch"]
    ...
    

範例

為了瞭解最佳實務,讓我們檢閱幾個範例。

不當使用標籤屬性

下圖顯示自訂和OOTB索引定義,反白顯示tags屬性,兩個索引都使用相同的visualSimilaritySearch值。

不正確使用標籤屬性

分析

這是不正確使用自訂索引上的tags屬性。 Oak查詢引擎會在OOTB索引原因上挑選自訂索引,造成最低的估計成本。

正確的方法是自訂OOTB索引並在indexRules節點中新增必要的屬性。 如需詳細資訊,請參閱自訂OOTB索引

dam:Asset節點型別上的索引

下圖顯示dam:Asset節點型別的自訂索引,其中includedPaths屬性設定為特定路徑。

dam nodetype:Asset上的 索引

分析

如果您在Assets上執行Omnisearch,則會傳回錯誤結果,因為自訂索引的估計成本較低。

請勿在dam:Asset節點型別上建立自訂索引,但請使用damAssetLucene節點中的必要屬性自訂OOTB indexRules索引。

索引規則下的多個節點型別

下圖顯示indexRules節點下具有多個節點型別的自訂索引。

索引規則下的多個節點型別

分析

不建議在單一索引中新增多個節點型別,但是,如果節點型別緊密相關,例如cq:Pagecq:PageContent,則可以在相同索引中索引節點型別。

有效的解決方案是自訂OOTB cqPageLucenedamAssetLucene索引,在現有indexRules節點下新增必要的屬性。

缺少queryPaths屬性

下圖顯示沒有queryPaths屬性的自訂索引(也不遵循命名慣例)。

Absense的queryPaths屬性

分析

一律將queryPaths值設定為與includedPaths值相同的值。 此外,若要強制執行路徑限制,請將evaluatePathRestrictions屬性設定為true

使用索引標籤進行查詢

下圖顯示具有tags屬性的自訂索引,以及查詢時如何使用它。

使用索引標籤進行查詢

/jcr:root/content/dam//element(*,dam:Asset)[(jcr:content/@contentFragment = 'true' and jcr:contains(., '/content/sitebuilder/test/mysite/live/ja-jp/mypage'))]order by @jcr:created descending option (index tag assetPrefixNodeNameSearch)
分析

示範如何在索引上設定非衝突並修正tags屬性值,並在查詢時使用它。 一般查詢語法為<query> option(index tag <tagName>)。 另請參閱查詢選項索引標籤

自訂索引

下圖顯示具有suggestion個節點的自訂索引,用以實現進階搜尋功能。

自訂索引

分析

進階搜尋功能建立自訂索引是有效的使用案例。 但是,索引名稱應接在​ &lt;prefix>之後。&lt;customIndexName>-&lt;version>-custom-&lt;customVersion> ​命名慣例。

停用Apache Tika以最佳化索引

AEM使用Apache Tika從檔案​型別(如PDF、Word、Excel等)擷取中繼資料和文字內容。 擷取的內容會儲存在存放庫中,並由Oak Lucene索引編制索引。

有時使用者不需要在檔案/資產的內容中搜尋的能力,在這種情況下,您可以透過停用Apache Tika來改善索引效能。 優點包括:

  • 更快的索引
  • 索引大小縮減
  • 減少硬體使用量
CAUTION
在停用Apache Tika之前,請確定搜尋需求不需要在資產內容中搜尋的能力。

依MIME型別停用

若要依mime型別停用Apache Tika,請執行以下步驟:

  • 在自訂或OOBT索引定義下新增tika型別的nt:unstructured節點。 在下列範例中,已針對OOTB damAssetLucene索引停用PDF MIME型別。
/oak:index/damAssetLucene
    - jcr:primaryType = "oak:QueryIndexDefinition"
    - type = "lucene"
    ...
    <tika jcr:primaryType="nt:unstructured">
        <config.xml/>
    </tika>
  • config.xml節點下新增包含以下詳細資料的tika
<properties>
  <parsers>
    <parser class="org.apache.tika.parser.EmptyParser">
      <mime>application/pdf</mime>
      <!-- Add more mime types to disable -->
  </parsers>
</properties>
  • 若要重新整理已儲存的索引,請在索引定義節點下將refresh屬性設定為true,如需詳細資訊,請參閱索引定義屬性

下圖顯示具有damAssetLucene節點和tika檔案的OOTB config.xml索引,該索引會停用PDF和其他mime型別。

具有tika節點的 OOTB damAssetLucene索引

完全停用

若要完全停用Apache Tika,請遵循以下步驟:

  • includePropertyTypes新增/oak:index/<INDEX-NAME>/indexRules/<NODE-TYPE>屬性並將值設定為String。 例如,在下圖中,已為OOBT includePropertyTypes索引的dam:Asset節點型別新增damAssetLucene屬性。

IncludePropertyTypes屬性

  • data節點底下新增具有下列屬性的properties,確定它是屬性定義上方的第一個節點。 例如,請參閱以下影像:
/oak:index/<INDEX-NAME>/indexRules/<NODE-TYPE>/properties/data
    - jcr:primaryType = "nt:unstructured"
    - type = "String"
    - name = "jcr:data"
    - nodeScopeIndex = false
    - propertyIndex = false
    - analyze = false

資料屬性

  • 透過在索引定義節點底下將reindex屬性設定為true,重新索引更新的索引定義。

實用工具

讓我們來看看有助於您定義、分析和最佳化索引的幾項工具。

索引建立工具和Oak工具

Oak Index Definition Generator工具可協助​根據輸入查詢產生索引定義。 這是建立自訂索引的良好起點。

Oak工具也包含其他
和索引和查詢相關的公用程式,例如在JSON和XML格式之間轉換索引,
將XPath查詢轉換為SQL-2並比較索引。

查詢效能工具

可透過Developer Console或​ ​本機SDK和AEMCS取得的OOTB ​查詢效能工具https://author-pXXXX-eYYYY.adobeaemcloud.com/ui#/aem/libs/granite/operations/content/diagnosistools/queryPerformance.html?appId=aemshell可協助​ 分析查詢效能 ​和JCR查詢速查表以定義最佳查詢。

疑難排解工具和提示

以下大部分適用於AEM 6.X和本機疑難排解。

  • 索引管理員可在http://host:port/libs/granite/operations/content/diagnosistools/indexManager.html取得,以取得型別、上次更新時間、大小等索引資訊。

  • 透過org.apache.jackrabbit.oak.plugins.index詳細記錄Oak查詢和索引相關的Java™套件(例如org.apache.jackrabbit.oak.querycom.day.cq.searchhttp://host:port/system/console/slinglog)以進行疑難排解。

  • IndexStats​型別的JMX MBean可在http://host:port/system/console/jmx取得,以取得與非同步索引相關的索引資訊,例如狀態、進度或統計資料。 它還提供​FailingIndexStats,如果此處沒有結果,則表示沒有索引損毀。 AsyncIndexerService會將任何在30分鐘內無法更新的索引(可設定)標籤為已損毀,並停止對其進行索引。 如果查詢沒有提供預期的結果,開發人員在繼續重新索引之前檢視此內容會很有幫助,因為重新索引的計算成本高昂且耗時。

  • LuceneIndex​型別的JMX MBean可在http://host:port/system/console/jmx用於Lucene索引統計資料,例如大小、每個索引定義的檔案數。

  • 在​可用於Oak查詢統計資料的 QueryStathttp://host:port/system/console/jmx型別的JMX MBean,包含具有查詢、執行時間等詳細資訊的緩慢和常見查詢。

其他資源

如需詳細資訊,請參閱下列檔案:

recommendation-more-help
c92bdb17-1e49-4e76-bcdd-89e4f85f45e6