Oak查詢與索引 oak-queries-and-indexing

NOTE
本文會介紹如何在AEM 6中設定索引。 如需最佳化查詢和索引效能的最佳實務,請參閱查詢和索引的最佳實務

簡介 introduction

與Jackrabbit 2不同,Oak預設不會索引內容。 必要時必須建立自訂索引,就像傳統關聯式資料庫一樣。 如果特定查詢沒有索引,則可能會遍歷許多節點。 查詢可能仍然有效,但速度可能很慢。

如果Oak遇到沒有索引的查詢,則會列印WARN層級的記錄訊息:

*WARN* Traversed 1000 nodes with filter Filter(query=select ...) consider creating an index or changing the query

支援的查詢語言 supported-query-languages

Oak查詢引擎支援下列語言:

  • XPath (建議)
  • SQL-2
  • SQL (已棄用)
  • JQOM

索引子型態與成本計算 indexer-types-and-cost-calculation

以Apache Oak為基礎的後端可將不同的索引器插入存放庫。

一個索引子是​ 屬性索引,其索引定義儲存在存放庫本身中。

Apache Lucene ​和​ Solr ​的實作預設也可供使用,兩者都支援全文檢索索引。

如果沒有其他索引器可用,則會使用​ 周遊索引。 這表示內容未編制索引,系統會周遊內容節點以尋找與查詢相符的內容。

如果查詢有多個可用的索引器,則每個可用的索引器都會估計執行查詢的成本。 Oak接著會選擇預估成本最低的索引器。

chlimage_1-148

上圖是Apache Oak查詢執行機制的高層級表示。

首先,查詢會剖析為抽象語法樹狀結構。 然後,會檢查查詢並轉換為SQL-2 (Oak查詢的原生語言)。

接著,會參考每個索引來估計查詢的成本。 完成後,會擷取最便宜索引的結果。 最後,會篩選結果,以確保目前使用者具有結果的讀取許可權,以及結果符合完整查詢。

設定索引 configuring-the-indexes

NOTE
對於大型存放庫而言,建立索引是一項耗時的作業。 這適用於初始建立索引和重新建立索引(在變更定義後重建索引)。 另請參閱疑難排解Oak索引防止緩慢重新索引

如果大型存放庫需要重新索引,尤其是使用MongoDB和針對全文檢索索引時,請考慮文字預先擷取,並使用Oak-run建立初始索引和重新索引。

索引在​ Oak:index ​節點下的儲存庫中設定為節點。

索引節點的型別必須是​ oak:QueryIndexDefinition。 ​每個索引器都有數個組態選項作為節點屬性使用。 如需詳細資訊,請參閱以下每個索引器型別的設定詳細資料。

屬性索引 the-property-index

對於具有屬性限制但不是全文檢索的查詢,屬性索引非常有用。 可依下列程式進行設定:

  1. 前往http://localhost:4502/crx/de/index.jsp開啟CRXDE

  2. 在​ oak:index ​下建立節點

  3. 為節點​ PropertyIndex ​命名,並將節點型別設定為​ oak:QueryIndexDefinition

  4. 為新節點設定下列屬性:

    • 型別: property (型別為String)
    • propertyNames: jcr:uuid (型別為Name)

    此特定範例會索引jcr:uuid屬性,其工作為公開其附加之節點的通用唯一識別碼(UUID)。

  5. 儲存變更。

「屬性索引」有以下組態選項:

  • type ​屬性指定索引的型別,在此情況下,它必須設定為​ 屬性

  • propertyNames ​屬性指出儲存在索引中的屬性清單。 如果遺失該節點,則會使用節點名稱作為屬性名稱參考值。 在此範例中,工作為公開其節點唯一識別碼(UUID)的​ jcr:uuid ​屬性會新增至索引。

  • 唯一 ​旗標,如果設為​ true,會在屬性索引上新增唯一性限制。

  • declaringNodeTypes ​屬性可讓您指定只套用索引的特定節點型別。

  • 重新索引 ​旗標,若設為​ true,會觸發完整的內容重新索引。

有序索引 the-ordered-index

Ordered索引是Property索引的延伸。 但是,它已被取代。 必須以Lucene屬性索引取代此型別的索引。

Lucene全文索引 the-lucene-full-text-index

AEM 6提供以Apache Lucene為基礎的全文檢索器。

如果設定了全文檢索索引,則無論是否有其他條件已編制索引,也無論是否有路徑限制,所有具有全文檢索條件的查詢都會使用全文檢索索引。

如果未設定全文檢索索引,則具有全文檢索條件的查詢將無法如預期運作。

由於索引是以非同步背景執行緒的方式更新,因此在背景處理完成之前,某些全文檢索搜尋無法在很短的時間內完成。

您可以依照以下程式設定Lucene全文索引:

  1. 開啟CRXDE並在​ oak:index ​下建立節點。

  2. 為節點​ LuceneIndex ​命名,並將節點型別設定為​ oak:QueryIndexDefinition

  3. 將下列屬性新增至節點:

    • 型別: lucene (型別為String)
    • 非同步處理: async (字串型別)
  4. 儲存變更。

Lucene索引有下列設定選項:

  • 指定索引型別的​ type ​屬性必須設定為​ lucene
  • 非同步 ​屬性必須設定為​ 非同步。 這會將索引更新程式傳送到背景執行緒。
  • includePropertyTypes ​屬性定義索引中包含的屬性型別子集。
  • 定義屬性名稱清單的​ excludePropertyNames ​屬性 — 應從索引中排除的屬性。
  • 設定為​ true ​時,會觸發完整內容重新索引的​ 重新索引 ​旗標。

例如,本節中的檔案適用於PostgreSQL、SQLite和MySQL的Apache Lucene、Elasticsearch和全文索引。 以下範例適用於AEM / Oak / Lucene。

要編制索引的資料

起點是必須編制索引的資料。 以下列檔案為例:

檔案識別碼
路徑
全文
100
/content/rubik
「Rubik是芬蘭品牌。」
200
/content/rubiksCube
「魔方是在1974年發明的。」
300
/content/cube
「立方體是3維物件。」

反轉索引

索引機制會將全文分割成名為「Token」的字詞,並建置名為「inverted index」的索引。 此索引包含檔案清單,其中會針對每個單字顯示該索引。

簡短的一般字詞(也稱為「停用詞」)不會編制索引。 所有代號都會轉換為小寫,並套用字乾處理。

特殊字元(例如​ "-")未編制索引。

Token
檔案識別碼
194
…, 200,…
品牌
…, 100,…
立方體
…、200、300、…
維度
300
完成
…, 100,…
invent
200
物件
…, 300,…
rubik
…、100、200、…

檔案清單已排序。 這在查詢時很方便。

正在搜尋

以下是查詢的範例。 請注意,所有特殊字元(例如​ ')都已取代為空格:

/jcr:root/content//element(\*; cq:Page)`[` jcr:contains('Rubik s Cube')`]`

這些字詞的標籤化和篩選方式與編制索引時的方式相同(例如,會移除單一字元字詞)。 因此在此案例中,搜尋的目標為:

+:fulltext:rubik +:fulltext:cube

索引會參考這些字的檔案清單。 如果檔案很多,清單可能會很大。 例如,假設它們包含下列內容:

Token
檔案識別碼
rubik
10, 100, 200, 1000
立方體
30、200、300、2000

Lucene在兩個清單(或循環配置資源n清單,搜尋n個字時)之間來回切換:

  • 在「rubik」中讀取會取得第一個專案:它找到10
  • 在「Cube」中讀取會取得第一個專案> = 10。 找不到10,則下一個是30。
  • 在「rubik」中讀取會取得第一個專案> = 30:它找到100。
  • 在「Cube」中讀取會取得第一個專案> = 100:它找到200。
  • 在「rubik」中讀取會取得第一個專案> = 200。 找到200。 因此,檔案200符合兩個詞語。 記住這一點。
  • 在「rubik」中讀取會取得下一個專案: 1000。
  • 在「Cube」中讀取會取得第一個專案> = 1000:它找到2000。
  • 在「rubik」中讀取會取得第一個專案> = 2000:清單結尾。
  • 最後,您可以停止搜尋。

唯一包含這兩個詞的檔案是200,如下例所示:

200
/content/rubiksCube
「魔方是在1974年發明的。」

找到多個專案時,會依分數排序。

Lucene屬性索引 the-lucene-property-index

由於​ Oak 1.0.8,因此Lucene可用來建立包含非全文檢索之屬性限制的索引。

若要取得Lucene屬性索引,fulltextEnabled ​屬性必須一律設定為false。

以下列範例查詢為例:

select * from [nt:base] where [alias] = '/admin'

若要為上述查詢定義Lucene屬性索引,您可以在​ oak:index下建立節點,以新增下列定義:

  • 名稱: LucenePropertyIndex
  • 型別: oak:QueryIndexDefinition

建立節點後,請新增下列屬性:

  • 型別:

    code language-xml
    lucene (of type String)
    
  • 非同步處理:

    code language-xml
    async (of type String)
    
  • 全文檢索已啟用:

    code language-xml
    false (of type Boolean)
    
  • includePropertyNames: ["alias"] (of type String)

NOTE
相較於一般屬性索引,Lucene屬性索引一律設定為非同步模式。 因此,索引傳回的結果不一定能反映存放庫的最新狀態。
NOTE
如需Lucene屬性索引的詳細資訊,請參閱Apache Jackrabbit Oak Lucene檔案頁面

Lucene分析器 lucene-analyzers

自1.2.0版開始,Oak支援Lucene分析器。

分析器在檔案編制索引時和查詢時都使用。 分析器會檢查欄位文字並產生權杖資料流。 Lucene分析器由一系列Tokenizer和篩選類別組成。

分析器可透過oak:index定義內的analyzers節點(型別為nt:unstructured)進行設定。

索引的預設分析器設定於分析器節點的default子系中。

chlimage_1-149

NOTE
如需可用分析器的清單,請參閱您使用的Lucene版本的API檔案。

直接指定分析器類別 specifying-the-analyzer-class-directly

如果您要使用任何現成可用的分析器,可以依照下列程式進行設定:

  1. oak:index節點下,找出您要與分析器搭配使用的索引。

  2. 在索引下,建立名稱為default且型別為nt:unstructured的子節點。

  3. 將屬性新增至具有下列屬性的預設節點:

    • 名稱: class
    • 型別: String
    • 值: org.apache.lucene.analysis.standard.StandardAnalyzer

    值是您要使用的分析器類別名稱。

    您也可以使用選擇性的luceneMatchVersion字串屬性,將分析器設定為與特定lucene版本搭配使用。 搭配Lucene 4.7使用的有效語法為:

    • 名稱: luceneMatchVersion
    • 型別: String
    • 值: LUCENE_47

    如果未提供luceneMatchVersion,Oak會使用隨附的Lucene版本。

  4. 如果您想要將stopwords檔案新增至分析器設定,可以在default節點下建立具有以下屬性的節點:

    • 名稱: stopwords
    • 型別: nt:file

透過構成建立分析器 creating-analyzers-via-composition

分析器也可以根據TokenizersTokenFiltersCharFilters組成。 您可以指定分析器並建立其選擇性代碼化工具的子節點,以及依列出的順序套用的篩選器,以達成此目的。 另請參閱https://cwiki.apache.org/confluence/display/solr/AnalyzersTokenizersTokenFilters#Specifying_an_Analyzer_in_the_schema

以這個節點結構為例:

  • 名稱: analyzers

    • 名稱: default

      • 名稱: charFilters

      • 型別: nt:unstructured

        • 名稱: HTMLStrip
        • 名稱: Mapping
      • 名稱: tokenizer

        • 屬性名稱: name

          • 型別: String
          • 值: Standard
      • 名稱: filters

      • 型別: nt:unstructured

        • 名稱: LowerCase

        • 名稱: Stop

          • 屬性名稱: words

            • 型別: String
            • 值: stop1.txt, stop2.txt
          • 名稱: stop1.txt

            • 型別: nt:file
          • 名稱: stop2.txt

            • 型別: nt:file

濾鏡、charFilters和tokenizers的名稱是透過移除原廠尾碼所組成。 因此:

  • org.apache.lucene.analysis.standard.StandardTokenizerFactory變成standard

  • org.apache.lucene.analysis.charfilter.MappingCharFilterFactory變成Mapping

  • org.apache.lucene.analysis.core.StopFilterFactory變成Stop

工廠所需的任何組態引數都會指定為相關節點的屬性。

對於必須載入外部檔案內容的載入停用字詞等情況,可透過為相關檔案建立nt:file型別的子節點來提供內容。

Solr索引 the-solr-index

Solr索引的用途是全文檢索搜尋,但也可以用來依路徑、屬性限制及主要型別限制來索引搜尋。 這表示Oak中的Solr索引可用於任何型別的JCR查詢。

AEM中的整合會在存放庫層級進行,因此Solr是AEM隨附的新存放庫實作Oak中可能使用的索引之一。

它可以設定為搭配AEM執行個體作為遠端伺服器使用。

使用單一遠端Solr伺服器設定AEM configuring-aem-with-a-single-remote-solr-server

AEM也可以設定為與遠端Solr伺服器執行處理搭配使用:

  1. 下載並解壓縮最新版的Solr。 如需如何執行此動作的詳細資訊,請參閱Apache Solr安裝檔案

  2. 現在,建立兩個Solr分片。 您可以透過在解壓縮Solr的資料夾中為每個分割槽建立資料夾來執行此操作:

    • 針對第一個分片,建立資料夾:

    <solrunpackdirectory>\aemsolr1\node1

    • 針對第二個分片,建立資料夾:

    <solrunpackdirectory>\aemsolr2\node2

  3. 找到Solr套裝程式中的範例執行個體。 它位於封裝根目錄中名為" example"的資料夾中。

  4. 將下列資料夾從範例執行個體複製到兩個分片資料夾( aemsolr1\node1aemsolr2\node2):

    • contexts
    • etc
    • lib
    • resources
    • scripts
    • solr-webapp
    • webapps
    • start.jar
  5. 在兩個分片資料夾的每個中建立名為「cfg」的資料夾。

  6. 將您的Solr和Zookeeper設定檔案放入新建立的cfg資料夾中。

    note note
    NOTE
    如需Solr和ZooKeeper組態的詳細資訊,請參閱Solr組態檔案ZooKeeper快速入門手冊
  7. 移至aemsolr1\node1並執行下列命令,開始支援ZooKeeper的第一個分割:

    code language-xml
    java -Xmx2g -Dbootstrap_confdir=./cfg/oak/conf -Dcollection.configName=myconf -DzkRun -DnumShards=2 -jar start.jar
    
  8. 移至aemsolr2\node2並執行下列命令以啟動第二個分片:

    code language-xml
    java -Xmx2g -Djetty.port=7574 -DzkHost=localhost:9983 -jar start.jar
    
  9. 兩個分片啟動後,透過連線至http://localhost:8983/solr/#/的Solr介面,測試一切是否正常運作

  10. 啟動AEM並前往位於http://localhost:4502/system/console/configMgr的網頁主控台

  11. 在​ Oak Solr遠端伺服器組態 ​下設定下列組態:

    • Solr HTTP URL: http://localhost:8983/solr/
  12. 在​ Oak Solr ​伺服器提供者下方的下拉式清單中選擇​ 遠端Solr

  13. 前往CRXDE並以管理員身分登入。

  14. 在​ oak:index ​下建立名為​ solrIndex ​的節點,並設定下列屬性:

    • 型別: solr (型別為String)
    • 非同步處理: ​非同步處理(字串型別)
    • 重新索引: true (屬於布林型別)
  15. 儲存變更。

Solr的建議設定 recommended-configuration-for-solr

以下是可搭配本文所述所有三個Solr部署使用的基本設定範例。 它可容納已存在於AEM中的專用屬性索引;請勿與其他應用程式一起使用。

若要正確使用它,您必須將歸檔的內容直接置於Solr主目錄中。 如果有多節點部署,應直接放置在每個節點的根資料夾下。

建議的Solr組態檔

取得檔案

AEM索引工具 aem-indexing-tools

AEM 6.1也整合了AEM 6.0中存在的兩個索引工具,作為Adobe Consulting Services Commons工具集的一部分:

  1. 說明Query,此工具旨在協助管理員瞭解查詢的執行方式;
  2. Oak索引管理員,維護現有索引的Web使用者介面。

您現在可以從AEM歡迎畫面前往​ 工具 — 作業 — 儀表板 — 診斷 ​來聯絡他們。

如需如何使用它們的詳細資訊,請參閱操作儀表板檔案

透過OSGi建立屬性索引 creating-property-indexes-via-osgi

ACS Commons套件也會公開可用於建立屬性索引的OSGi設定。

您可以搜尋"確定Oak屬性索引",從Web主控台存取它。

chlimage_1-150

疑難排解索引問題 troubleshooting-indexing-issues

可能會出現查詢執行時間很長,且一般系統回應時間很慢的情況。

本節提供一組必須執行哪些操作以追蹤這類問題原因的建議,以及解決這些問題的建議。

正在準備偵錯資訊以供分析 preparing-debugging-info-for-analysis

取得正在執行之查詢所需資訊的最簡單方式,是透過說明查詢工具。 這可讓您收集對緩慢查詢進行偵錯所需的精確資訊,而無需查閱記錄層級資訊。 如果您知道正在偵錯的查詢,這是您想要的。

如果由於任何原因而無法執行此操作,您可以將索引記錄收集到單一檔案中,並使用它來疑難排解您的特定問題。

啟用記錄 enable-logging

若要啟用記錄,您必須針對與Oak索引和查詢相關的類別啟用​ DEBUG ​層級記錄。 這些類別包括:

  • org.apache.jackrabbit.oak.plugins.index
  • org.apache.jackrabbit.oak.query
  • com.day.cq.search

com.day.cq.search ​類別僅適用於使用AEM提供的QueryBuilder公用程式。

NOTE
請務必僅在您要進行疑難排解的查詢執行期間,將記錄檔設為DEBUG。 否則,許多事件會隨著時間在記錄中產生。 因此,在收集到所需的記錄後,請切換回上述類別的INFO層級記錄。

您可以依照下列程式來啟用記錄功能:

  1. 將瀏覽器指向https://serveraddress:port/system/console/slinglog
  2. 按一下主控台下方的​ 新增記錄器 ​按鈕。
  3. 在新建立的列中,新增上述類別。 您可以使用​ + ​符號將多個類別新增至單一記錄器。
  4. 從​ 記錄層級 ​下拉式清單中選擇​ DEBUG
  5. 將輸出檔案設定為logs/queryDebug.log。 這會將所有DEBUG事件關聯至單一記錄檔。
  6. 執行查詢或轉譯正在使用您想要偵錯的查詢的頁面。
  7. 執行查詢後,請返回記錄主控台,並將新建立的記錄器的記錄層級變更為​ INFO

索引設定 index-configuration

查詢的評估方式很大程度上受索引設定影響。 重要的是,要分析索引設定或將其傳送給支援人員。 您可以以內容封裝的形式取得設定,或取得JSON轉譯。

索引設定通常儲存在CRXDE中的/oak:index節點下,您可在以下位置取得JSON版本:

https://serveraddress:port/oak:index.tidy.-1.json

如果索引設定在不同的位置,請相應地變更路徑。

MBean輸出 mbean-output

有時候,提供索引相關MBean的輸出以進行偵錯會很有幫助。 您可以透過以下方式進行:

  1. 前往位於的JMX主控台:
    https://serveraddress:port/system/console/jmx

  2. 搜尋下列MBean:

    • Lucene索引統計資料
    • CopyOnRead支援統計資料
    • Oak查詢統計資料
    • 索引統計資料
  3. 按一下每個MBean,即可取得效能統計資料。 建立熒幕擷圖或記下它們,以備需要提交支援時使用。

您也可以在下列URL取得這些統計資料的JSON變體:

  • https://serveraddress:port/system/sling/monitoring/mbeans/org/apache/jackrabbit/oak/%2522LuceneIndex%2522.tidy.-1.json
  • https://serveraddress:port/system/sling/monitoring/mbeans/org/apache/jackrabbit/oak/%2522LuceneIndex%2522.tidy.-1.json
  • https://serveraddress:port/system/sling/monitoring/mbeans/org/apache/jackrabbit/oak/%2522LuceneIndex%2522.tidy.-1.json
  • https://serveraddress:port/system/sling/monitoring/mbeans/org/apache/jackrabbit/oak/%2522LuceneIndex%2522.tidy.-1.json

您也可以透過https://serveraddress:port/system/sling/monitoring/mbeans/org/apache/jackrabbit/oak.tidy.3.json提供合併的JMX輸出。 這會包括JSON格式的所有與Oak相關的MBean詳細資料。

其他詳細資料 other-details

您可以收集其他詳細資料來協助疑難排解問題,例如:

  1. 執行個體所在的Oak版本。 您可以透過開啟CRXDE並檢視歡迎頁面右下角的版本來檢視此內容,或透過檢查org.apache.jackrabbit.oak-core套件組合版本來檢視。
  2. 疑難查詢的QueryBuilder Debugger輸出。 可以存取偵錯工具: https://serveraddress:port/libs/cq/search/content/querydebug.html
recommendation-more-help
19ffd973-7af2-44d0-84b5-d547b0dffee2