Oak查詢與索引 oak-queries-and-indexing
簡介 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接著會選擇預估成本最低的索引器。
上圖是Apache Oak查詢執行機制的高層級表示。
首先,查詢會剖析為抽象語法樹狀結構。 然後,會檢查查詢並轉換為SQL-2 (Oak查詢的原生語言)。
接著,會參考每個索引來估計查詢的成本。 完成後,會擷取最便宜索引的結果。 最後,會篩選結果,以確保目前使用者具有結果的讀取許可權,以及結果符合完整查詢。
設定索引 configuring-the-indexes
如果大型存放庫需要重新索引,尤其是使用MongoDB和針對全文檢索索引時,請考慮文字預先擷取,並使用Oak-run建立初始索引和重新索引。
索引在 Oak:index 節點下的儲存庫中設定為節點。
索引節點的型別必須是 oak:QueryIndexDefinition。 每個索引器都有數個組態選項作為節點屬性使用。 如需詳細資訊,請參閱以下每個索引器型別的設定詳細資料。
屬性索引 the-property-index
對於具有屬性限制但不是全文檢索的查詢,屬性索引非常有用。 可依下列程式進行設定:
-
前往
http://localhost:4502/crx/de/index.jsp
開啟CRXDE -
在 oak:index 下建立節點
-
為節點 PropertyIndex 命名,並將節點型別設定為 oak:QueryIndexDefinition
-
為新節點設定下列屬性:
- 型別:
property
(型別為String) - propertyNames:
jcr:uuid
(型別為Name)
此特定範例會索引
jcr:uuid
屬性,其工作為公開其附加之節點的通用唯一識別碼(UUID)。 - 型別:
-
儲存變更。
「屬性索引」有以下組態選項:
-
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全文索引:
-
開啟CRXDE並在 oak:index 下建立節點。
-
為節點 LuceneIndex 命名,並將節點型別設定為 oak:QueryIndexDefinition
-
將下列屬性新增至節點:
- 型別:
lucene
(型別為String) - 非同步處理:
async
(字串型別)
- 型別:
-
儲存變更。
Lucene索引有下列設定選項:
- 指定索引型別的 type 屬性必須設定為 lucene
- 非同步 屬性必須設定為 非同步。 這會將索引更新程式傳送到背景執行緒。
- includePropertyTypes 屬性定義索引中包含的屬性型別子集。
- 定義屬性名稱清單的 excludePropertyNames 屬性 — 應從索引中排除的屬性。
- 設定為 true 時,會觸發完整內容重新索引的 重新索引 旗標。
瞭解全文搜尋 understanding-fulltext-search
例如,本節中的檔案適用於PostgreSQL、SQLite和MySQL的Apache Lucene、Elasticsearch和全文索引。 以下範例適用於AEM / Oak / Lucene。
要編制索引的資料
起點是必須編制索引的資料。 以下列檔案為例:
反轉索引
索引機制會將全文分割成名為「Token」的字詞,並建置名為「inverted index」的索引。 此索引包含檔案清單,其中會針對每個單字顯示該索引。
簡短的一般字詞(也稱為「停用詞」)不會編制索引。 所有代號都會轉換為小寫,並套用字乾處理。
特殊字元(例如 "-")未編制索引。
檔案清單已排序。 這在查詢時很方便。
正在搜尋
以下是查詢的範例。 請注意,所有特殊字元(例如 ')都已取代為空格:
/jcr:root/content//element(\*; cq:Page)`[` jcr:contains('Rubik s Cube')`]`
這些字詞的標籤化和篩選方式與編制索引時的方式相同(例如,會移除單一字元字詞)。 因此在此案例中,搜尋的目標為:
+:fulltext:rubik +:fulltext:cube
索引會參考這些字的檔案清單。 如果檔案很多,清單可能會很大。 例如,假設它們包含下列內容:
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,如下例所示:
找到多個專案時,會依分數排序。
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)
Lucene分析器 lucene-analyzers
自1.2.0版開始,Oak支援Lucene分析器。
分析器在檔案編制索引時和查詢時都使用。 分析器會檢查欄位文字並產生權杖資料流。 Lucene分析器由一系列Tokenizer和篩選類別組成。
分析器可透過oak:index
定義內的analyzers
節點(型別為nt:unstructured
)進行設定。
索引的預設分析器設定於分析器節點的default
子系中。
直接指定分析器類別 specifying-the-analyzer-class-directly
如果您要使用任何現成可用的分析器,可以依照下列程式進行設定:
-
在
oak:index
節點下,找出您要與分析器搭配使用的索引。 -
在索引下,建立名稱為
default
且型別為nt:unstructured
的子節點。 -
將屬性新增至具有下列屬性的預設節點:
- 名稱:
class
- 型別:
String
- 值:
org.apache.lucene.analysis.standard.StandardAnalyzer
值是您要使用的分析器類別名稱。
您也可以使用選擇性的
luceneMatchVersion
字串屬性,將分析器設定為與特定lucene版本搭配使用。 搭配Lucene 4.7使用的有效語法為:- 名稱:
luceneMatchVersion
- 型別:
String
- 值:
LUCENE_47
如果未提供
luceneMatchVersion
,Oak會使用隨附的Lucene版本。 - 名稱:
-
如果您想要將stopwords檔案新增至分析器設定,可以在
default
節點下建立具有以下屬性的節點:- 名稱:
stopwords
- 型別:
nt:file
- 名稱:
透過構成建立分析器 creating-analyzers-via-composition
分析器也可以根據Tokenizers
、TokenFilters
和CharFilters
組成。 您可以指定分析器並建立其選擇性代碼化工具的子節點,以及依列出的順序套用的篩選器,以達成此目的。 另請參閱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伺服器執行處理搭配使用:
-
下載並解壓縮最新版的Solr。 如需如何執行此動作的詳細資訊,請參閱Apache Solr安裝檔案。
-
現在,建立兩個Solr分片。 您可以透過在解壓縮Solr的資料夾中為每個分割槽建立資料夾來執行此操作:
- 針對第一個分片,建立資料夾:
<solrunpackdirectory>\aemsolr1\node1
- 針對第二個分片,建立資料夾:
<solrunpackdirectory>\aemsolr2\node2
-
找到Solr套裝程式中的範例執行個體。 它位於封裝根目錄中名為"
example
"的資料夾中。 -
將下列資料夾從範例執行個體複製到兩個分片資料夾(
aemsolr1\node1
和aemsolr2\node2
):contexts
etc
lib
resources
scripts
solr-webapp
webapps
start.jar
-
在兩個分片資料夾的每個中建立名為「
cfg
」的資料夾。 -
將您的Solr和Zookeeper設定檔案放入新建立的
cfg
資料夾中。note note NOTE 如需Solr和ZooKeeper組態的詳細資訊,請參閱Solr組態檔案和ZooKeeper快速入門手冊。 -
移至
aemsolr1\node1
並執行下列命令,開始支援ZooKeeper的第一個分割:code language-xml java -Xmx2g -Dbootstrap_confdir=./cfg/oak/conf -Dcollection.configName=myconf -DzkRun -DnumShards=2 -jar start.jar
-
移至
aemsolr2\node2
並執行下列命令以啟動第二個分片:code language-xml java -Xmx2g -Djetty.port=7574 -DzkHost=localhost:9983 -jar start.jar
-
兩個分片啟動後,透過連線至
http://localhost:8983/solr/#/
的Solr介面,測試一切是否正常運作 -
啟動AEM並前往位於
http://localhost:4502/system/console/configMgr
的網頁主控台 -
在 Oak Solr遠端伺服器組態 下設定下列組態:
- Solr HTTP URL:
http://localhost:8983/solr/
- Solr HTTP URL:
-
在 Oak Solr 伺服器提供者下方的下拉式清單中選擇 遠端Solr。
-
前往CRXDE並以管理員身分登入。
-
在 oak:index 下建立名為 solrIndex 的節點,並設定下列屬性:
- 型別: solr (型別為String)
- 非同步處理: 非同步處理(字串型別)
- 重新索引: true (屬於布林型別)
-
儲存變更。
Solr的建議設定 recommended-configuration-for-solr
以下是可搭配本文所述所有三個Solr部署使用的基本設定範例。 它可容納已存在於AEM中的專用屬性索引;請勿與其他應用程式一起使用。
若要正確使用它,您必須將歸檔的內容直接置於Solr主目錄中。 如果有多節點部署,應直接放置在每個節點的根資料夾下。
建議的Solr組態檔
AEM索引工具 aem-indexing-tools
AEM 6.1也整合了AEM 6.0中存在的兩個索引工具,作為Adobe Consulting Services Commons工具集的一部分:
- 說明Query,此工具旨在協助管理員瞭解查詢的執行方式;
- Oak索引管理員,維護現有索引的Web使用者介面。
您現在可以從AEM歡迎畫面前往 工具 — 作業 — 儀表板 — 診斷 來聯絡他們。
如需如何使用它們的詳細資訊,請參閱操作儀表板檔案。
透過OSGi建立屬性索引 creating-property-indexes-via-osgi
ACS Commons套件也會公開可用於建立屬性索引的OSGi設定。
您可以搜尋"確定Oak屬性索引",從Web主控台存取它。
疑難排解索引問題 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公用程式。
您可以依照下列程式來啟用記錄功能:
- 將瀏覽器指向
https://serveraddress:port/system/console/slinglog
- 按一下主控台下方的 新增記錄器 按鈕。
- 在新建立的列中,新增上述類別。 您可以使用 + 符號將多個類別新增至單一記錄器。
- 從 記錄層級 下拉式清單中選擇 DEBUG。
- 將輸出檔案設定為
logs/queryDebug.log
。 這會將所有DEBUG事件關聯至單一記錄檔。 - 執行查詢或轉譯正在使用您想要偵錯的查詢的頁面。
- 執行查詢後,請返回記錄主控台,並將新建立的記錄器的記錄層級變更為 INFO。
索引設定 index-configuration
查詢的評估方式很大程度上受索引設定影響。 重要的是,要分析索引設定或將其傳送給支援人員。 您可以以內容封裝的形式取得設定,或取得JSON轉譯。
索引設定通常儲存在CRXDE中的/oak:index
節點下,您可在以下位置取得JSON版本:
https://serveraddress:port/oak:index.tidy.-1.json
如果索引設定在不同的位置,請相應地變更路徑。
MBean輸出 mbean-output
有時候,提供索引相關MBean的輸出以進行偵錯會很有幫助。 您可以透過以下方式進行:
-
前往位於的JMX主控台:
https://serveraddress:port/system/console/jmx
-
搜尋下列MBean:
- Lucene索引統計資料
- CopyOnRead支援統計資料
- Oak查詢統計資料
- 索引統計資料
-
按一下每個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
您可以收集其他詳細資料來協助疑難排解問題,例如:
- 執行個體所在的Oak版本。 您可以透過開啟CRXDE並檢視歡迎頁面右下角的版本來檢視此內容,或透過檢查
org.apache.jackrabbit.oak-core
套件組合版本來檢視。 - 疑難查詢的QueryBuilder Debugger輸出。 可以存取偵錯工具:
https://serveraddress:port/libs/cq/search/content/querydebug.html