2017-06-06 3 views
0

unsere Solr stürzt von Zeit zu Zeit aufgrund OutOfMemory Fehler ab. Wir sind immer noch auf Version 4.0.0, planen aber nach der Lösung der folgenden Probleme auf die neueste Version zu migrieren.Faceting (Autocomplete) aus dem Speicher

Als ich bei Kater sah lüge ich folgende Fehlermeldung angezeigt:

SEVERE: null:java.lang.RuntimeException: java.lang.OutOfMemoryError: Java heap space 
    at org.apache.solr.servlet.SolrDispatchFilter.sendError(SolrDispatchFilter.java:469) 
    at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:297) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
    at java.lang.Thread.run(Thread.java:744) 
Caused by: java.lang.OutOfMemoryError: Java heap space 
    at org.apache.lucene.search.FieldComparator$TermOrdValComparator.<init>(FieldComparator.java:1124) 
    at org.apache.lucene.search.SortField.getComparator(SortField.java:425) 
    at org.apache.lucene.search.FieldValueHitQueue$MultiComparatorsFieldValueHitQueue.<init>(FieldValueHitQueue.java:110) 
    at org.apache.lucene.search.FieldValueHitQueue.create(FieldValueHitQueue.java:173) 
    at org.apache.lucene.search.TopFieldCollector.create(TopFieldCollector.java:1123) 
    at org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:552) 
    at org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:507) 
    at org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:484) 
    at org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:309) 
    at si.amebis.termania.solr.ExternalSearch.search(ExternalSearch.java:307) 
    at si.amebis.termania.solr.ExternalSearch.handleRequestBody(ExternalSearch.java:235) 
    at org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:129) 
    at org.apache.solr.core.SolrCore.execute(SolrCore.java:1699) 
    at org.apache.solr.servlet.SolrDispatchFilter.execute(SolrDispatchFilter.java:455) 
    at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:276) 
    ... 12 more 

kurz nach dem Antrag auf ein Autocomplete-Feld (vorschlagen, wie Sie schreiben). Anfrage Details sind unten:

q - *:* 
start - 0 
rows - 0 
fq - (Type:1 OR Type:2) 
facet - true 
facet.limit - 20 
facet.mincount - 1 
facet.sort - true 
facet.prefix - "mi" 
facet.field - "Autocomplete" 
-- 
which returns 8105170 hits 

wo die automatische Vervollständigung Feld ist wie folgt definiert:

<field name="Autocomplete" type="grams" indexed="true" stored="false" omitNorms="true" required="False" multiValued="true" /> 
    <fieldtype name="grams" class="solr.TextField" positionIncrementGap="100"> 
     <analyzer type="index"> 
     <tokenizer class="solr.StandardTokenizerFactory" /> 
     <filter class="solr.ShingleFilterFactory" maxShingleSize="10" outputUnigrams="true" /> 
     <filter class="solr.LowerCaseFilterFactory" /> 
     <filter class="solr.TrimFilterFactory" /> 
     </analyzer> 
     <analyzer type="query"> 
     <tokenizer class="solr.StandardTokenizerFactory" /> 
     <filter class="solr.LowerCaseFilterFactory" /> 
     <filter class="solr.TrimFilterFactory" /> 
     </analyzer> 
    </fieldtype> 

Index Details:

Num document: 4338603 
Index size: 10.1 Gb 
Ram: 64Gb (-Xmx45000M) 
Terms count in Autocomplete field: 70.459.723 

Ich gehe davon auf einem Textfeld Facettierung und so viele Begriffe erfordert viel der Erinnerung.

Wie kann ich berechnen, wie viel Speicher benötigt wird, und gibt es eine effizientere Möglichkeit zur automatischen Vervollständigung (mit Phrasen - N-Gramm)?

Vielen Dank im Voraus!

Antwort

0

Können Sie eine Verbindung zur Solr-Instanz herstellen, um zu überprüfen, wohin der Speicher geht? Ich schätze, das ist auf der FieldCache, aber ist immer gut zu überprüfen, um sicher zu sein, Solr Facettierung behandelt jedes Feld separat, so dass Sie in der Lage sein, die Speicherbelegung für dieses bestimmte Feld zu überprüfen. Um die Speichernutzung für eine Facette Abfrage zu schätzen Sie diesen Thread überprüfen konnte (http://lucene.472066.n3.nabble.com/Solr-using-a-ridiculous-amount-of-memory-td4050840.html)

Es gibt etwas, auch auf Ihre Frage, sagte Sie, dass Ihre Abfrage gibt 8105170 Treffer, aber Ihr Index hat nur 4338603 Dokumente. In der Regel ist das Facettieren in einem Textfeld eine Herausforderung, da die Anzahl der Begriffe sehr schnell ansteigen kann, besonders wenn Sie Schindeln/Ngramme verwenden.

Werfen Sie einen Blick auf https://github.com/cominvent/autocomplete ist ein guter Ausgangspunkt für eine Autocomplete-Funktion von Solr (ich habe dies als Ausgangspunkt für ein paar Projekte verwendet).

Je nachdem, wie Sie Ihre Autocomplete-Funktion implementiert haben, können Sie auch versuchen, den Parameter facet.method (https://cwiki.apache.org/confluence/display/solr/Faceting ) zu ändern und prüfen, ob es hilft.

Werfen Sie auch einen Blick auf https://cwiki.apache.org/confluence/display/solr/Suggester.