Oak-query's en indexering oak-queries-and-indexing
Inleiding introduction
In tegenstelling tot Jackrabbit 2 indexeert Oak inhoud niet standaard. Aangepaste indexen moeten zo nodig worden gemaakt, net als bij traditionele relationele databases. Als er geen index voor een specifieke vraag is, worden vele knopen misschien overgestoken. De query werkt mogelijk nog wel, maar het is waarschijnlijk traag.
Als Oak een query zonder index tegenkomt, wordt een logbericht op WARN-niveau afgedrukt:
*WARN* Traversed 1000 nodes with filter Filter(query=select ...) consider creating an index or changing the query
Ondersteunde querytalen supported-query-languages
De Oak-query-engine ondersteunt de volgende talen:
- XPath (aanbevolen)
- SQL-2
- SQL (vervangen)
- JQOM
Indexeertypen en kostenberekening indexer-types-and-cost-calculation
Met de op Apache Oak gebaseerde backend kunnen verschillende indexen op de repository worden aangesloten.
Één indexeerder is de Index van het Bezit, waarvoor de indexdefinitie in de bewaarplaats zelf wordt opgeslagen.
De uitvoeringen voor Lucene van Apache en zonne zijn ook beschikbaar door gebrek, die allebei fullText indexeren steunen.
De Traversal Index wordt gebruikt als geen andere indexeerder beschikbaar is. Dit betekent dat de inhoud niet wordt geïndexeerd en de inhoudsknopen worden getransformeerd om gelijken aan de vraag te vinden.
Als de veelvoudige indexeerders voor een vraag beschikbaar zijn, schat elke beschikbare indexeerder de kosten om de vraag uit te voeren. Oak kiest vervolgens de index met de laagste geschatte kosten.
Het bovenstaande diagram is een weergave op hoog niveau van het mechanisme voor het uitvoeren van query's van Apache Oak.
Eerst, wordt de vraag ontleed in een Abstracte Boom van de Syntaxis. Dan, wordt de vraag gecontroleerd en in SQL-2 omgezet die de inheemse taal voor de vragen van Oak is.
Daarna, wordt elke index geraadpleegd om de kosten voor de vraag te schatten. Zodra dat wordt voltooid, worden de resultaten van de goedkoopste index teruggewonnen. Tot slot worden de resultaten gefilterd, zowel om ervoor te zorgen dat de huidige gebruiker toegang tot het resultaat heeft gelezen en dat het resultaat de volledige vraag aanpast.
De indexen configureren configuring-the-indexes
Als herindexering nodig is in grote opslagruimten, met name bij gebruik van MongoDB en voor full-text indexen, kunt u de tekst vooraf extraheren en eekuitvoering gebruiken om de eerste index te genereren en opnieuw te indexeren.
De indexen worden gevormd als knopen in de bewaarplaats onder Oak:index knoop.
Het type van de indexknoop moet zijn:QueryIndexDefinition. Voor elke index zijn diverse configuratieopties beschikbaar als knoopeigenschappen. Voor meer informatie, zie de configuratiedetails voor elk hieronder indexeertype.
De eigenschappenindex the-property-index
De index van het Bezit is nuttig voor vragen die bezitsbeperkingen hebben maar niet full-text zijn. Het kan worden gevormd door de hieronder procedure te volgen:
-
CRXDE openen via
http://localhost:4502/crx/de/index.jsp
-
Creeer een knoop onder eik:index
-
Noem de knoop PropertyIndex, en plaats het knooptype aan eak:QueryIndexDefinition
-
Stel de volgende eigenschappen in voor het nieuwe knooppunt:
- type:
property
(van typeKoord) - propertyNames:
jcr:uuid
(van typeNaam)
In dit voorbeeld wordt de eigenschap
jcr:uuid
geïndexeerd. De functie hiervan is om de universeel unieke id (UUID) weer te geven van het knooppunt waaraan de eigenschap is gekoppeld. - type:
-
Sla de wijzigingen op.
De index van het Bezit heeft de volgende configuratieopties:
-
Het type bezit specificeert het type van index, en in dit geval moet het aan bezit worden geplaatst
-
Het propertyNames bezit wijst op de lijst van de eigenschappen die in de index worden opgeslagen. Als de naam van het knooppunt ontbreekt, wordt deze gebruikt als een verwijzingswaarde voor de eigenschapnaam. In dit voorbeeld, wordt het jcr:uuid bezit de waarvan baan het unieke herkenningsteken (UUID) van zijn knoop moet blootstellen toegevoegd aan de index.
-
De unieke vlag die, als reeks aan waar een uniqueness beperking op de bezitsindex toevoegt.
-
Het declaringNodeTypes bezit laat u een bepaald knooptype specificeren dat de index slechts op van toepassing is.
-
De herdex vlag die als reeks aan waar, een volledige inhoudsherdex teweegbrengt.
De geordende index the-ordered-index
De geordende index is een uitbreiding van de index van het Bezit. Het is echter afgekeurd. De indexen van dit type moeten met de Index van het Bezit van Luceneworden vervangen.
De index van volledige tekst met Lucene the-lucene-full-text-index
Een volledige tekstindexeerfunctie op basis van Apache Lucene is beschikbaar in AEM 6.
Als een full-text index wordt gevormd, gebruiken alle vragen die een full-text voorwaarde hebben de full-text index, geen kwestie als er andere voorwaarden zijn die worden geïndexeerd, en geen kwestie als er een wegbeperking is.
Als geen full-text index wordt gevormd, dan werken de vragen met full-text voorwaarden niet zoals verwacht.
Omdat de index wordt bijgewerkt door middel van een asynchrone achtergrondthread, zijn sommige full-text onderzoeken niet beschikbaar voor een klein venster van tijd tot de achtergrondprocessen worden gebeëindigd.
U kunt een volledig-tekstindex van Lucene vormen door de hieronder procedure te volgen:
-
Open CRXDE en creeer een knoop onder eiken:index.
-
Noem de knoop LuceneIndex en plaats het knooptype aan eak:QueryIndexDefinition
-
Voeg de volgende eigenschappen toe aan het knooppunt:
- type:
lucene
(van typeKoord) - async:
async
(van typeKoord)
- type:
-
Sla de wijzigingen op.
De index van Lucene heeft de volgende configuratieopties:
- Het type bezit dat het type van index specificeert moet aan lucene worden geplaatst
- Het async bezit dat aan async moet worden geplaatst. Hiermee wordt het indexupdateproces naar een achtergrondthread verzonden.
- Het includePropertyTypes bezit, dat bepaalt welke ondergroep van bezitstypes inbegrepen in de index zijn.
- Het excludePropertyNames bezit dat een lijst van bezitsnamen - eigenschappen bepaalt die van de index zouden moeten worden uitgesloten.
- De herdex vlag die wanneer geplaatst aan waar, een volledige inhoudsherdex teweegbrengt.
Volledige tekst zoeken understanding-fulltext-search
De documentatie in deze sectie is op Apache Lucene, Elasticsearch, en fullText indexen van PostSQL, SQLite, en MySQL, bijvoorbeeld van toepassing. Het volgende voorbeeld is voor AEM / Oak / Lucene.
Te indexeren Gegevens
Het uitgangspunt is de gegevens die moeten worden geïndexeerd. Neem bijvoorbeeld de volgende documenten:
Omgekeerde index
Het indexeringsmechanisme verdeelt de volledige tekst in woorden genoemd "tokens", en bouwt een index genoemd "omgekeerde index". Deze index bevat de lijst met documenten waarin deze voor elk woord wordt weergegeven.
Korte, algemene woorden (ook wel "stopwords" genoemd) worden niet geïndexeerd. Alle tokens worden omgezet in kleine letters en stammen wordt toegepast.
Speciale karakters zoals "-" worden niet geïndexeerd.
De lijst met documenten wordt gesorteerd. Dit is handig wanneer je vraagt.
zoekend
Hieronder ziet u een voorbeeld van een query. Merk op dat alle speciale karakters (zoals ") met een ruimte werden vervangen:
/jcr:root/content//element(\*; cq:Page)`[` jcr:contains('Rubik s Cube')`]`
De woorden worden op dezelfde manier verdeeld en gefilterd als bij het indexeren (woorden van één teken worden bijvoorbeeld verwijderd). In dit geval wordt gezocht naar:
+:fulltext:rubik +:fulltext:cube
De index raadpleegt de lijst met documenten voor die woorden. Als er veel documenten zijn, kan de lijst groot zijn. Stel bijvoorbeeld dat ze het volgende bevatten:
Luceen draait heen en weer tussen de twee lijsten (of ronde-robin n
lijsten, wanneer het zoeken naar n
woorden):
- Lees in de "rubik" krijgt de eerste vermelding: er zijn er 10.
- Lees in de 'kubus' krijgt de eerste vermelding
>
= 10. 10 is niet gevonden, de volgende is 30. - Lees in het "rubik" krijgt de eerste vermelding
>
= 30: 100. - Lees in de 'kubus' krijgt de eerste vermelding
>
= 100: er wordt 200 gevonden. - Lees in het rubik krijgt de eerste vermelding
>
= 200. 200 is gevonden. Document 200 is dus een overeenkomst voor beide termen. Dit wordt onthouden. - Lees in het "rubik" krijgt de volgende vermelding: 1000.
- Lees in de "kubus" krijgt de eerste vermelding
>
= 1000: vindt 2000. - Lees in het rubik krijgt de eerste vermelding
>
= 2000: einde van de lijst. - Tot slot kunt u ophouden met zoeken.
Het enige gevonden document dat beide termen bevat, is 200, zoals in het onderstaande voorbeeld:
Wanneer meerdere items worden gevonden, worden deze op score gesorteerd.
De index van de eigenschap Lucene the-lucene-property-index
Sinds Oak 1.0.8, kan Lucene worden gebruikt om indexen tot stand te brengen die bezitsbeperkingen impliceren die niet full-text zijn.
Om een Index van het Bezit van Lucene te bereiken, moet het fulltextEnabled bezit altijd aan vals worden geplaatst.
Neem de volgende voorbeeldvraag:
select * from [nt:base] where [alias] = '/admin'
Om een Index van het Bezit van Lucene voor de bovengenoemde vraag te bepalen, kunt u de volgende definitie toevoegen door een knoop onder oak:index
te creëren:
- Naam:
LucenePropertyIndex
- Type:
oak:QueryIndexDefinition
Voeg de volgende eigenschappen toe wanneer het knooppunt is gemaakt:
-
type:
code language-xml lucene (of type String)
-
async:
code language-xml async (of type String)
-
fulltextEnabled:
code language-xml false (of type Boolean)
-
includePropertyNames:
["alias"] (of type String)
Luceenanalysatoren lucene-analyzers
Sinds versie 1.2.0 ondersteunt Oak Lucene-analysatoren.
Analyzers worden zowel gebruikt wanneer een document, als bij vraagtijd wordt geïndexeerd. Een analysator controleert de tekst van gebieden en produceert een symbolische stroom. Luceenanalysatoren bestaan uit een reeks tokenizer- en filterklassen.
De analysatoren kunnen worden geconfigureerd via het knooppunt analyzers
(van het type nt:unstructured
) binnen de definitie oak:index
.
De standaardanalysator voor een index wordt gevormd in het default
kind van de analysetknoop.
De klasse Analyzer rechtstreeks opgeven specifying-the-analyzer-class-directly
Als u een analysator in de doos wilt gebruiken, kunt u deze configureren volgens de onderstaande procedure:
-
Zoek de index waarmee u de analysator wilt gebruiken onder het knooppunt
oak:index
. -
Maak onder de index een onderliggend knooppunt met de naam
default
van het typent:unstructured
. -
Voeg een eigenschap toe aan het standaardknooppunt met de volgende eigenschappen:
- Naam:
class
- Type:
String
- Waarde:
org.apache.lucene.analysis.standard.StandardAnalyzer
De waarde is de naam van de klasse analyzer die u wilt gebruiken.
U kunt de analysator ook instellen voor gebruik met een specifieke lucene versie door de optionele eigenschap
luceneMatchVersion
string te gebruiken. Een geldige syntaxis voor het gebruiken van het met Lucene 4.7 zou zijn:- Naam:
luceneMatchVersion
- Type:
String
- Waarde:
LUCENE_47
Als
luceneMatchVersion
niet wordt verstrekt, gebruikt Oak de versie van Lucene het met wordt verscheept. - Naam:
-
Als u een stopwoordenbestand wilt toevoegen aan de analysatorconfiguraties, kunt u onder
default
een knooppunt maken met de volgende eigenschappen:- Naam:
stopwords
- Type:
nt:file
- Naam:
Analysatoren maken door middel van compositie creating-analyzers-via-composition
Analyzers kunnen ook worden samengesteld op basis van Tokenizers
, TokenFilters
en CharFilters
. U kunt dit doen door een analysator te specificeren en kindknopen van zijn facultatieve tokenizers en filters te creëren die in vermelde orde worden toegepast. Zie ook https://cwiki.apache.org/confluence/display/solr/AnalyzersTokenizersTokenFilters#Specifying_an_Analyzer_in_the_schema
Bekijk deze knooppuntstructuur als voorbeeld:
-
Naam:
analyzers
-
Naam:
default
-
Naam:
charFilters
-
Type:
nt:unstructured
- Naam:
HTMLStrip
- Naam:
Mapping
- Naam:
-
Naam:
tokenizer
-
de Naam van het Bezit:
name
- Type:
String
- Waarde:
Standard
- Type:
-
-
Naam:
filters
-
Type:
nt:unstructured
-
Naam:
LowerCase
-
Naam:
Stop
-
naam van het Bezit:
words
- Type:
String
- Waarde:
stop1.txt, stop2.txt
- Type:
-
Naam:
stop1.txt
- Type:
nt:file
- Type:
-
Naam:
stop2.txt
- Type:
nt:file
- Type:
-
-
-
-
De naam van de filters, charFilters, en tokenizers wordt gevormd door de fabrieksachtervoegsels te verwijderen. Aldus:
-
org.apache.lucene.analysis.standard.StandardTokenizerFactory
wordtstandard
-
org.apache.lucene.analysis.charfilter.MappingCharFilterFactory
wordtMapping
-
org.apache.lucene.analysis.core.StopFilterFactory
wordtStop
Om het even welke configuratieparameter die voor de fabriek wordt vereist wordt gespecificeerd als bezit van de knoop in kwestie.
Voor gevallen zoals het laden van stopwoorden waarbij inhoud van externe bestanden moet worden geladen, kan de inhoud worden opgegeven door een onderliggend knooppunt van het type nt:file
voor het desbetreffende bestand te maken.
De zonne-index the-solr-index
Het doel van de index Solr is full-text onderzoek maar het kan ook worden gebruikt om onderzoek door weg, bezitsbeperkingen, en primaire typebeperkingen te indexeren. Dit betekent dat de Solr-index in Oak kan worden gebruikt voor elk type JCR-query.
De integratie in AEM gebeurt op het niveau van de opslagplaats zodat Solr één van de mogelijke indexen is die in Oak kunnen worden gebruikt, de nieuwe opbergingsimplementatie die met AEM wordt verscheept.
Het kan worden gevormd om als verre server met de AEM instantie te werken.
AEM configureren met één externe Solr-server configuring-aem-with-a-single-remote-solr-server
AEM kan ook worden geconfigureerd om te werken met een externe Solr-serverinstantie:
-
Download en extraheer de nieuwste versie van Solr. Voor meer informatie over hoe te om dit te doen, zie de documentatie van de Installatie van Apache Solr.
-
Maak nu twee Solr-planken. U kunt dit doen door mappen te maken voor elk segment in de map waarin Solr is uitgepakt:
- Voor de eerste gedeelde map maakt u de map:
<solrunpackdirectory>\aemsolr1\node1
- Voor de tweede schijf maakt u de map:
<solrunpackdirectory>\aemsolr2\node2
-
Zoek de voorbeeldinstantie in het Solr-pakket. Deze bevindt zich in de map "
example
" in de hoofdmap van het pakket. -
Kopieer de volgende mappen van de voorbeeldinstantie naar de twee gedeelde mappen (
aemsolr1\node1
enaemsolr2\node2
):contexts
etc
lib
resources
scripts
solr-webapp
webapps
start.jar
-
Maak in elk van de twee gedeelde mappen een map met de naam "
cfg
". -
Plaats uw Solr en Zookeeper configuratiedossiers in de pas gecreëerde
cfg
omslagen.note note NOTE Voor meer info over de configuratie van Solr en ZooKeeper, raadpleeg de documentatie van de Configuratie van Solren ZooKeeper die Begonnen Gidsworden. -
Begin eerste shard met steun ZooKeeper door naar
aemsolr1\node1
te gaan en het volgende bevel in werking te stellen:code language-xml java -Xmx2g -Dbootstrap_confdir=./cfg/oak/conf -Dcollection.configName=myconf -DzkRun -DnumShards=2 -jar start.jar
-
Start de tweede delen door naar
aemsolr2\node2
te gaan en de volgende opdracht uit te voeren:code language-xml java -Xmx2g -Djetty.port=7574 -DzkHost=localhost:9983 -jar start.jar
-
Nadat beide kaarten zijn gestart, test u of alles in gebruik is door verbinding te maken met de Solr-interface op
http://localhost:8983/solr/#/
-
AEM starten en naar de webconsole gaan op
http://localhost:4502/system/console/configMgr
-
Plaats de volgende configuratie onder de verre serverconfiguratie van Oak Solr:
- Kies HTTP-URL:
http://localhost:8983/solr/
- Kies HTTP-URL:
-
Kies Verre Solr in de drop-down lijst onder Oak Solr serverleverancier.
-
Ga naar CRXDE en login als Admin.
-
Creeer een knoop genoemd solrIndex onder eik:index, en plaats de volgende eigenschappen:
- type: solr (van typeKoord)
- async: async (van typeKoord)
- herdex: waar (van type Boolean)
-
Sla de wijzigingen op.
Aanbevolen configuratie voor Solr recommended-configuration-for-solr
Hieronder is een voorbeeld van een basisconfiguratie die met alle drie plaatsingen kan worden gebruikt Solr die in dit artikel worden beschreven. Het past de specifieke bezitsindexen aan die reeds in AEM aanwezig zijn; gebruik niet met andere toepassingen.
Om het behoorlijk te gebruiken, moet u de inhoud van het archief in de Solr Folder van het Huis direct plaatsen. Als er multi-knoopplaatsingen zijn, zou het direct onder de wortelomslag van elke knoop moeten gaan.
Aanbevolen Solr-configuratiebestanden
Gereedschappen voor AEM indexeren aem-indexing-tools
AEM 6.1 integreert ook twee indexerende hulpmiddelen aanwezig in AEM 6.0 als deel van Adobe Consulting Services Commons toolset:
- verklaar Vraag, een hulpmiddel dat wordt ontworpen om beheerders te helpen begrijpen hoe de vragen worden uitgevoerd;
- de Manager van de Index van Oak, een Gebruikersinterface van het Web voor het handhaven van bestaande indexen.
U kunt hen nu bereiken door naar Hulpmiddelen te gaan - Verrichtingen - Dashboard - Diagnose van het AEM Welkomstscherm.
Voor meer informatie over hoe te om hen te gebruiken, zie de documentatie van het Dashboard van Verrichtingen.
Eigenschapindexen maken met OSGi creating-property-indexes-via-osgi
Het ACS-gemeenschappelijke pakket stelt ook configuraties OSGi bloot die kunnen worden gebruikt om bezitsindexen tot stand te brengen.
U kunt tot het van de Console van het Web toegang hebben door naar "te zoeken verzeker de Index van het Bezit van Oak".
Problemen met indexering oplossen troubleshooting-indexing-issues
Er kunnen zich situaties voordoen waarbij het uitvoeren van query's veel tijd in beslag neemt en de algemene responstijd van het systeem veel tijd in beslag neemt.
In dit deel wordt een aantal aanbevelingen gedaan over wat er moet gebeuren om de oorzaak van dergelijke problemen op te sporen en wordt advies gegeven over hoe deze problemen kunnen worden opgelost.
Foutopsporingsinfo voorbereiden voor analyse preparing-debugging-info-for-analysis
De gemakkelijkste manier om de vereiste informatie voor de vraag te krijgen die in werking wordt gesteld is als verklaart het hulpmiddel van de Vraag. Dit laat u de nauwkeurige informatie verzamelen die nodig is om een langzame vraag te zuiveren zonder de behoefte om de informatie van het logboekniveau te raadplegen. Dit is wenselijk als u de vraag kent die wordt gezuiverd.
Als dit om welke reden dan ook niet mogelijk is, kunt u de indexerende logboeken in één enkel dossier verzamelen en het gebruiken om uw bepaald probleem problemen op te lossen.
Logboekregistratie inschakelen enable-logging
Om registreren toe te laten, moet u DEBUG niveaulogboeken voor de categorieën toelaten die betrekking hebben op Oak indexeren en vragen. Deze categorieën zijn:
- org.apache.jackrabbit.oak.plugins.index
- org.apache.jackrabbit.oak.query
- com.day.cq.search
De com.day.cq.search categorie is slechts van toepassing als u het AEM verstrekte nut QueryBuilder gebruikt.
U kunt registreren toelaten door deze procedure te volgen:
- De browser naar
https://serveraddress:port/system/console/slinglog
verwijzen - Klik toevoegen nieuwe Logger knoop in het lagere deel van de console.
- Voeg de bovenstaande categorieën toe aan de zojuist gemaakte rij. U kunt het + teken gebruiken om meer dan één categorie aan één enkel registreerapparaat toe te voegen.
- Kies DEBUG van het niveau van het Logboek drop-down lijst.
- Stel het uitvoerbestand in op
logs/queryDebug.log
. Hiermee worden alle DEBUG-gebeurtenissen samengevoegd in één logbestand. - Voer de query uit of geef de pagina weer die de query gebruikt die u wilt debuggen.
- Zodra u de vraag hebt uitgevoerd, ga terug naar de registrerenconsole en verander het logboekniveau van pas gecreëerde registreerapparaat in INFO.
Indexconfiguratie index-configuration
De manier de vraag wordt geëvalueerd wordt grotendeels beïnvloed door de indexconfiguratie. Het is belangrijk dat de indexconfiguratie wordt geanalyseerd of naar ondersteuning wordt gestuurd. U kunt de configuratie ophalen als een inhoudspakket of een JSON-uitvoering ophalen.
Gewoonlijk, wordt de het indexeren configuratie opgeslagen onder de /oak:index
knoop in CRXDE, kunt u de versie JSON bij krijgen:
https://serveraddress:port/oak:index.tidy.-1.json
Als de index op een andere plaats wordt gevormd, verander dienovereenkomstig de weg.
MBean-uitvoer mbean-output
Soms is het nuttig om de output van op index betrekking hebbende MBans voor het zuiveren te verstrekken. U kunt dit doen door:
-
Ga naar de JMX-console op:
https://serveraddress:port/system/console/jmx
-
Zoek naar de volgende MBans:
- Lucene Index statistische gegevens
- CopyOnRead-ondersteuningsstatistieken
- Oak Query Statistics
- IndexStats
-
Klik elk van de MBans zodat kunt u prestatiesstatistieken krijgen. Maak een schermafbeelding of noteer deze voor het geval dat een supportverzending nodig is.
U kunt de variant JSON van deze statistieken bij volgende URLs ook krijgen:
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
U kunt ook geconsolideerde JMX-uitvoer leveren via https://serveraddress:port/system/sling/monitoring/mbeans/org/apache/jackrabbit/oak.tidy.3.json
. Dit omvat alle Oak-gerelateerde MBean-gegevens in JSON-indeling.
Overige details other-details
U kunt extra details verzamelen helpen het probleem oplossen, zoals:
- De Oak-versie waarop uw exemplaar wordt uitgevoerd. U kunt dit zien door CRXDE te openen en de versie in de rechterbenedenhoek van de welkomstpagina te bekijken, of door de versie van de
org.apache.jackrabbit.oak-core
-bundel te controleren. - De Foutopsporingsoutput QueryBuilder van de lastige vraag. De foutopsporing is toegankelijk via:
https://serveraddress:port/libs/cq/search/content/querydebug.html