Lucene 4.2 StringField

Ich bin neu in Lucene. Ich habe zwei Dokumente und möchte eine genaue Übereinstimmung für das Dokumentfeld "Schlüsselwort" haben (das Feld kann innerhalb eines Dokuments mehrmals vorkommen).

Das erste Dokument enthält das Schlüsselwort "Annotation is cool". Das zweite Dokument enthält das Schlüsselwort "Annotation is cool too". Wie muss ich die Abfrage so erstellen, dass nur das erste Dokument gefunden wird, wenn ich nach "Annotation is cool" suche?

Ich habe etwas über "StringField" gelesen und festgestellt, dass es nicht mit einem Token versehen ist. Wenn ich das Feld "keyword" in der Methode "addDoc" von "TextField" in "StringField" ändere, wird nichts gefunden.

Hier ist mein Code:

private IndexWriter writer;

public void lucene() throws IOException, ParseException {
    // Build the index
    StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_42);
    Directory index = new RAMDirectory();
    IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_42,
            analyzer);
    this.writer = new IndexWriter(index, config);

    // Add documents to the index
    addDoc("Spring", new String[] { "Java", "JSP",
            "Annotation is cool" });
    addDoc("Java", new String[] { "Oracle", "Annotation is cool too" });

    writer.close();

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

    BooleanQuery qry = new BooleanQuery();

    qry.add(new TermQuery(new Term("keyword", "\"Annotation is cool\"")), BooleanClause.Occur.MUST);

    System.out.println(qry.toString());

    Query q = new QueryParser(Version.LUCENE_42, "title", analyzer).parse(qry.toString());

    int hitsPerPage = 10;
    TopScoreDocCollector collector = TopScoreDocCollector.create(
            hitsPerPage, true);

    searcher.search(q, collector);

    ScoreDoc[] hits = collector.topDocs().scoreDocs;

    for (int i = 0; i < hits.length; ++i) {
        int docId = hits[i].doc;
        Document doc = searcher.doc(docId);
        System.out.println((i + 1) + ". \t" + doc.get("title"));
    }

    reader.close();
}

private void addDoc(String title, String[] keywords) throws IOException {
    // Create new document
    Document doc = new Document();

    // Add title
    doc.add(new TextField("title", title, Field.Store.YES));

    // Add keywords
    for (int i = 0; i < keywords.length; i++) {
        doc.add(new TextField("keyword", keywords[i], Field.Store.YES));
    }

    // Add document to index
    this.writer.addDocument(doc);
}

Antworten auf die Frage(1)

Ihre Antwort auf die Frage