Lucene-MoreLikethis

shakesbier

Mitglied
Hallo,

ich komme in Lucene nicht weiter. Grundsätzlich will ich einen Index aufbauen, um anschließend ähnliche Dokumente zu suchen. Dann bin ich auf "MoreLikeThis" gestoßen. Leider finde ich damit nie ähnliche Dokumente. Irgendwie ist die Query nach "mlt.like(1);" immer leer. Kann mir irgendjemand meinen Fehler sagen? Ich habe schon einige Beispiele probiert und nie wurde ein ähnliches Dokument gefunden.

Wäre super, wenn mir jemand helfen könnte. Ich benutzt Lucene 4.0.

Java:
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queries.mlt.MoreLikeThis;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.util.Version;

import java.io.IOException;

public class HelloLucene {
  public static void main(String[] args) throws IOException, ParseException {

   StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_40);
   Directory index = new RAMDirectory();
   IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_40, analyzer);

    IndexWriter w = new IndexWriter(index, config);
    addDoc(w, "Lucene in Action", "193398817");
    addDoc(w, "Lucene for Dummies", "55320055Z");
    addDoc(w, "Managing Gigabytes", "55063554A");
    addDoc(w, "The Art of Computer Science", "9900333X");
    w.close();

    // search
    IndexReader reader = DirectoryReader.open(index);
    IndexSearcher searcher = new IndexSearcher(reader);

    MoreLikeThis mlt = new MoreLikeThis(reader);
    Query query = mlt.like(1);
    System.out.println(searcher.search(query, 5).totalHits);
  }

  private static void addDoc(IndexWriter w, String title, String isbn) throws IOException {
    Document doc = new Document();
    doc.add(new TextField("title", title, Field.Store.YES));

    // use a string field for isbn because we don't want it tokenized
    doc.add(new StringField("isbn", isbn, Field.Store.YES));
    w.addDocument(doc);
  }
}
 

Lumaraf

Bekanntes Mitglied
Schau dir dazu am besten mal MoreLikeThis (Lucene 4.0.0 API) an. In der Standardeinstellung ist minDocFreq auf 5 eingestellt was laut Dokumentation bedeutet das nur mit Termen gesucht wird die in mindestens 5 Dokumenten vorkommen. Mit nur 4 Dokumenten in deinen Testdaten kann da unmöglich ein Term oft genug vorhanden sein.
 

shakesbier

Mitglied
Vielen Dank für die schnelle Antwort!

Ich verstehe es aber trotzdem nicht, da diese ganzen Werte wie mindocfequency standardmäßig auf 0 gestellt sind und daher keinen Einfluss haben. Steht so in der API (woher du das mit minDocFrequ=5)hast, weiß ich nicht). Wenn ich mlt.getMinDocFreq() ausführe, gibt er auch 0 aus.

Hat jemand eine andere Idee? Meine einzige Lösung ist mittlerweile, dass das MoreLikeThis.like falsch implementiert ist, aber das wäre schon heftig.
 

Lumaraf

Bekanntes Mitglied
Ich verstehe es aber trotzdem nicht, da diese ganzen Werte wie mindocfequency standardmäßig auf 0 gestellt sind und daher keinen Einfluss haben. Steht so in der API (woher du das mit minDocFrequ=5)hast, weiß ich nicht). Wenn ich mlt.getMinDocFreq() ausführe, gibt er auch 0 aus.

Im JavaDoc steht zu getMinDocFreq() das der Standardwert DEFAULT_MIN_DOC_FREQ sein soll und laut Constant Field Values (Lucene 4.0.0 API) ist der Wert der Konstante 5.
 

shakesbier

Mitglied
Komisch, dass er mir dann bei der get-Methode "0" ausgibt. Aber ich hatte das Ganze auch mal mit 1000 Dokumenten ausprobiert und trotzdem habe ich keine Ergebnisse bekommen. Auch wenn ich die Default-Werte ändere, kriege ich keine Ergebnisse.
 

Ähnliche Java Themen

Neue Themen


Oben