2010-04-26 10 views
27

Einige Kollegen von mir haben eine große Java-Webanwendung, die ein Suchsystem verwendet, das mit Lucene Java erstellt wurde. Was ich tun möchte, ist eine nette HTTP-basierte API, um auf diese vorhandenen Suchindizes zuzugreifen. Ich habe Nutch schon früher benutzt und mochte es wirklich, wie einfach die OpenSearch-Implementierung es geschafft hat, Ergebnisse als RSS zu erhalten.Kann ein roher Lucene-Index von Solr geladen werden?

Ich habe versucht, solrs dataDir in solrconfig.xml zu setzen, in der Hoffnung, dass es die vorhandenen Indexdateien gerne aufhebt, aber es scheint sie einfach zu ignorieren.

Meine Hauptfrage ist:

Kann Solr Lucene-Indizes verwendet werden, an anderer Stelle erstellt zugreifen? Oder könnte es eine bessere Lösung geben?

+0

möglich Duplikat: http://stackoverflow.com/questions/2195404/very-basic-dude-with-solr-lucene –

+0

Vielen Dank für das Heads-up. Leider hat niemand diesem Ansatz einen Daumen nach oben oder einen Daumen nach unten gegeben ... –

+0

eine Nachfolgefrage, ist es möglich, den Lucene-Index zu laden, der einen nicht standardmäßigen Codec in Solr verwendet, wie SimpleTextCodec? –

Antwort

11

Ich habe dies noch nie versucht, aber Sie müssten die schema.xml so anpassen, dass alle Felder der Dokumente in Ihrem Lucene-Index enthalten sind, da Solr Ihnen nicht erlaubt, nach einem Feld zu suchen ist nicht in schema.xml definiert.

Die Anpassung an schema.xml sollte auch die Definition der Abfragezeitanalysatoren zur korrekten Suche in Ihrem Feld umfassen, insbesondere wenn das Feld mit benutzerdefinierten Analysatoren indexiert wurde.

In solrconfig.xml müssen Sie möglicherweise Einstellungen in den Abschnitten indexDefaults und mainIndex ändern.

Aber ich würde gerne Antworten von Leuten lesen, die es tatsächlich getan haben.

+0

Ich schaue auf den Index mit Luke und es ist nicht so schrecklich komplex. Es gibt 14 Felder, die alle als Zeichenfolgen eingegeben werden. Ich gebe die Konfiguration, die Sie vorgeschlagen haben, und versuchen Sie es erneut. Vielen Dank! –

+0

luke ist dein Freund hier :) –

25

Erfolg! Mit dem Vorschlag von Pascal, Änderungen an schema.xml vorzunehmen, habe ich es in kürzester Zeit installiert. Vielen Dank!

Hier sind meine komplette Schritte für alle Interessierten:

  1. Heruntergeladene Solr und kopiert dist/Apache-Solr-1.4.0.war zu tomcat/webapps
  2. Kopierte Beispiel/Solr/conf/usr/local/Solr/
  3. Kopierte vorbestehenden Lucene Index-Dateien in/usr/local/Solr/data/index
  4. Set solr.home nach/usr/local/solr
  5. In solrconfig.xml änderte dataDir nach/usr/local/solr/data (Solr sucht nach dem Index dir ectory innen)
  6. Loaded meines Lucene-Indizes in Luke für das Surfen (super-Tool)
  7. Im Beispiel schema.xml, entfernt alle Felder und Feldtypen mit Ausnahme von "string"
  8. Im Beispiel schema.xml aufgenommen 14 Felddefinitionen, die den 14 in Lukas gezeigten Feldern entsprechen. Beispiel: <field name="docId" type="string" indexed="true" stored="true"/>
  9. Im Beispiel schema.xml, UniqueKey in meinem Index auf das Feld geändert, das schien ein Dokument-ID
  10. Im Beispiel schema.xml zu sein, verändert defaultSearchField auf das Feld in meinem Index, zu enthalten schien Begriffe
  11. gestartet tomcat, schließlich sah keine Ausnahmen, und lief erfolgreich einige Abfragen in localhost: 8080/Solr/admin

Dies ist nur Beweis für mich, dass es funktionieren kann. Offensichtlich gibt es viel mehr Konfiguration zu tun.

+0

Dies funktionierte perfekt für mich mit Solr 5.2.0 mit dem Zusatz, den ich in solrconfig.xml angeben musste, dass ich kein verwaltetes Schema verwendete: ' ' Nicht schlecht für eine 5 Jahre alte Antwort! – tgood

1

Drei Schritte am Ende:

  1. ändern schema.xml oder (managed-schema)
  2. ändern < dataDir> in solrconfig.xml
  3. Restart Solr

Ich habe meine Studie notizen here für diejenigen, die neu in Solr sind, wie ich :)
Um etwas Luce zu generieren ne Indizes selbst, können Sie meinen Code here verwenden.

public class LuceneIndex { 
    private static Directory directory; 

    public static void main(String[] args) throws IOException { 
     long startTime = System.currentTimeMillis(); 

     // open 
     Path path = Paths.get("/tmp/myindex/index"); 
     directory = new SimpleFSDirectory(path); 
     IndexWriter writer = getWriter(); 

     // index 
     int documentCount = 10000000; 
     List<String> fieldNames = Arrays.asList("id", "manu"); 

     FieldType myFieldType = new FieldType(); 
     myFieldType.setIndexOptions(IndexOptions.DOCS_AND_FREQS); 
     myFieldType.setOmitNorms(true); 
     myFieldType.setStored(true); 
     myFieldType.setTokenized(true); 
     myFieldType.freeze(); 

     for (int i = 0; i < documentCount; i++) { 
      Document doc = new Document(); 
      for (int j = 0; j < fieldNames.size(); j++) { 
       doc.add(new Field(fieldNames.get(j), fieldNames.get(j) + Integer.toString(i), myFieldType)); 
      } 
      writer.addDocument(doc); 
     } 
     // close 
     writer.close(); 
     System.out.println("Finished Indexing"); 
     long estimatedTime = System.currentTimeMillis() - startTime; 
     System.out.println(estimatedTime); 
    } 
    private static IndexWriter getWriter() throws IOException { 
     return new IndexWriter(directory, new IndexWriterConfig(new WhitespaceAnalyzer())); 
    } 
} 
0
I am trying the same steps with HDF as the home directory and locktype as HDFS but no luck. I see the below error 

labs_shard1_replica1: org.apache.solr.common.SolrException:org.apache.solr.common.SolrException: Index dir 'hdfs://127.0.0.1/user/solr/labs/core_node1/data/index/' of core 'labs_shard1_replica1' is already locked. The most likely cause is another Solr server (or another solr core in this server) also configured to use this directory; other possible causes may be specific to lockType: hdfs 

Solar dir Config

<directoryFactory name="DirectoryFactory" 

class = "$ {solr.directoryFactory: solr.NRTCachingDirectoryFactory}">

aber nicht mit HDFS als unter

<directoryFactory name="DirectoryFactory" class="solr.HdfsDirectoryFactory"> 
       <str name="solr.hdfs.home">hdfs://127.0.0.1/user/solr</str> 
       <bool name="solr.hdfs.blockcache.enabled">true</bool> 
       <int name="solr.hdfs.blockcache.slab.count">1</int> 
       <bool name="solr.hdfs.blockcache.direct.memory.allocation">false</bool> 
       <int name="solr.hdfs.blockcache.blocksperbank">16384</int> 
       <bool name="solr.hdfs.blockcache.read.enabled">true</bool> 
       <bool name="solr.hdfs.blockcache.write.enabled">false</bool> 
       <bool name="solr.hdfs.nrtcachingdirectory.enable">true</bool> 
       <int name="solr.hdfs.nrtcachingdirectory.maxmergesizemb">16</int> 
       <int name="solr.hdfs.nrtcachingdirectory.maxcachedmb">192</int> 
      </directoryFactory> 

Verschlussart hdfs

+1

Wenn Sie ein Problem haben, das durch diese Antworten nicht gelöst wird, bitte [eine neue Frage stellen] (https://stackoverflow.com/questions/ask) –

Verwandte Themen