[Java] Grundlegende Frage

Helios co.

Lt. Commander
Registriert
März 2005
Beiträge
1.863
Hallo @ all,

ich bin gerade an einem Projekt dran und bin auf ein Problem gestoßen, dessen Ursache mir so nicht ohne weiteres einleuchten will.

In der Literatur habe ich folgenden Code gefunden:
Code:
public class SimpleSearcher {
public static void main(String[] args) throws Exception {
String indexPath = args[0];
String queryString = args[1];
Query query = QueryParser.parse(queryString, "body",
new GermanAnalyzer());
Searcher searcher = new IndexSearcher(indexPath);
Hits hits = searcher.search(query);
for (int i = 0; i < hits.length(); i++) {
System.out.println(hits.doc(i).get("path")
+ " (score: " + hits.score(i) + ")");
};
}
}

Wenn ich das nachprogrammiere (sprich abtippe :) ), so kriege ich bei
Query query = QueryParser.parse... bereits ein Problem.
Und zwar wir die prase Methode garnicht gefunden.

Kann das am Classpath liegen? (sprich ist der falsch gesetzt)?
Das würde mich jedoch selbst wundern, da ja eine Instanziierung von Query und auch QueryParser durchaus möglich ist.

Ich vermute, dass es ein triviales Verständnisproblem ist.
ABer wäre schön wenn mir das jemand erklären könnte.

Thx
 
Hi,

die Klasse Query kann in mehreren Bibliotheken vorkommen, da in der Literatur die Kurzschreibweise ohne package-Pfad angegeben ist.

Die erste Sache wäre, zu verstehen, in welche Query gemeint ist. Dann sicherstellen, dass java.exe diese Klasse/Interface im cp hat.
 
Zunächst einmal vielen Dank für die schnelle Antwort!

Bei dem Query welches ich brauche, handelt es sich um das von Lucene.
Das ganze Paket, sprich die komplette .jar (die u.A. auch die Query Klasse enthält) ist bereits im cp.

Auch habe ich das Ding importiert und es scheint (ich nutze Eclipse und da werden ja nicht verwendete import´s gelb unterstrichen) auch verwendet zu werden (daher gehe ich davon aus, dass eigentlich die richtige Query Klasse genutzt wird).

Gibt es eine Möglichkeit eine Instanz zu erzeugen mit direkter Paketangabe?
Falls dem so wäre, müsste es doch eigentlich klar sein, welches Query gemeint ist,oder?
 
Klar ist nichts. Du nutzt Eclipse, gut.
Hovere über "Query" (vermute das das ein Interfase ist). Dann müsstest Du den vollen Namen finden. Also Wenn Du über JLabel (der in der source mit import drin ist) hoverst, müsstest du "javax.swing.JLabel" sehen.

Wenn du sicher bist, dass Query im cp ist, und in dieser lib QueryParser eine Methode parse hat, dann importierst du das Falsche.

Gib doch dann mal den vollen Namen an, also: (angenommen...)
org.hibernate.Query query = org.x.y.QueryParser.parse(queryString, "body", new GermanAnalyzer());

schau mal was dann passiert. Wenn es nict im cp ist, dann fliegt die ClassNotFoundException


... halt mich auf dem Laufenden :)
 
Zuletzt bearbeitet:
OK, hovern hat für den QueryParser folgendes geliefert: org.apache.lucene.queryParser
QueryParser

Decompilieren der jar (bzw. der QueryParser Klasse) zeigt folgendes:
Code:
package org.apache.lucene.queryParser;

import java.io.*;
import java.text.DateFormat;
import java.util.*;
import org.apache.lucene.analysis.*;
import org.apache.lucene.document.DateField;
import org.apache.lucene.document.DateTools;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.*;

// Referenced classes of package org.apache.lucene.queryParser:
//            FastCharStream, ParseException, TokenMgrError, QueryParserTokenManager, 
//            Token, QueryParserConstants, CharStream

public class QueryParser
    implements QueryParserConstants
{
    /* member class not found */
    class JJCalls {}

    /* member class not found */
    class LookaheadSuccess {}

    /* member class not found */
    class Operator {}


    public QueryParser(String f, Analyzer a)
    {
        this(((CharStream) (new FastCharStream(new StringReader("")))));
        analyzer = a;
        field = f;
    }

    public Query parse(String query)
        throws ParseException
    {
        ReInit(new FastCharStream(new StringReader(query)));
        Query res = TopLevelQuery(field);
        return ((Query) (res == null ? new BooleanQuery() : res));
        ParseException tme;
        tme;
        throw new ParseException("Cannot parse '" + query + "': " + tme.getMessage());
        tme;
        throw new ParseException("Cannot parse '" + query + "': " + tme.getMessage());
        org.apache.lucene.search.BooleanQuery.TooManyClauses tmc;
        tmc;
        throw new ParseException("Cannot parse '" + query + "': too many boolean clauses");
    }
...

d.h. wenn ich das richtig verstehe ist die Methode parse zwar vorhanden, aber nur mit dem Parameter String query.
Die parse Methode aus dem Beispiel hat jedoch 2 bzw. 3 Parameter.


Nachtrag:
Wenn ich folgendes versuche:
Query query = QueryParser.
und dann hoovere, dann wird die parse Methode nicht gefunden!
 
Zuletzt bearbeitet:
Die statische parse-Methode gibt es schon lange nicht mehr. Du musst eine Instanz vom QueryParser anlegen und dann die parse-Methode der Instanz verwenden.
 
Ja richtig. Sie gibt es nicht mehr. Deine Literatur ist schon veraltet :rolleyes:
Du siehst ja z.B. das der Analyzer im Konstruktor übergeben wird.
Was sagt die doku von Apache zu der bib?
 
Jap, jetzt fällt esmir Schuppen von den Augen.

Lucene ist nur leider unglaublich schlecht dokumnetiert, und die Literatur die ich habe ist auch die einzige die ich überhaupt dazu gefunden habe.

Kennt einer von euch sich damit etwas besser aus?

Und nochmals einen Dank!
 
Zurück
Oben