Lucene Wildcard am Anfang realisieren?

Fulk

Mitglied
Hallo,

ich arbeite derzeit mit Java und Apache Lucene.
Nun möchte ich für eine Suchanfrage gerne Wildcards(* und ?) zulassen.
Doch leider gibt es dabei das Problem, dass keine führenden Wildcards in Lucene zugelassen sind.

Habt Ihr eine Idee/Trick, um dies doch zu realisieren? Hab schon überlegt, ein Leerzeichen an das Pattern anzuhängen und dann wieder wegzuschneiden, aber so richtig gut klingt das auch nicht.

Danke für Vorschläge!
 
Da sich das Problem erneut stellte, habe ich nochmals im Netz geschaut - und es geht doch.

Einfach folgenden Codeschnipsel einfügen:
Code:
QueryParser.setAllowLeadingWildcard( true );

Ich habe es konkret so gemacht:
Code:
parser = new MultiFieldQueryParser(new String[]{"text", "pfad", "owner"}, new StandardAnalyzer());
parser.setAllowLeadingWildcard(true);

Man sollte dieses Funktion jedoch mit Bedacht verwenden, da schnell der Geschwindigkeitsgewinn des effektiven indizierens verloren gehen kann.

Hier mal zwei Webseiten dazu:
http://wiki.apache.org/lucene-java/...head-4d62118417eaef0dcb87f4370583f809848ea695

und

http://dev-answers.blogspot.com/2008/02/why-can-you-not-use-wildcard-as-first.html

Viele Grüße,
Fulk.
 
hi Fulk,
Ich habe gesehen dass du Lucene dazu bekommen hast, Wildcarts zu beginn einer suche zuzulassen...

ich weiß zwar nun, dass ich :
QueryParser.setAllowLeadingWildcard( true );
einfügen muss, weiß aber leider nicht wo ich es einfügen muss.

könntest du da noch was genauere Auführungen Machen?
z.B. welche datei, unsw...

würde mich wirklich freuen..

Jörg
 
Hallo,

schau aml hier:
Java:
package de.tutorials;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriter.MaxFieldLength;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.Searcher;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.FSDirectory;

public class LuceneExample {

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        String indexFilePath = "c:/temp/search.index";
        FSDirectory index = FSDirectory.getDirectory(indexFilePath);

        IndexWriter indexWriter = new IndexWriter(index,
                new StandardAnalyzer(), true, MaxFieldLength.UNLIMITED);
        indexWriter.addDocument(createDocument("test0",
                "Bubushampoo Babashampoo"));
        indexWriter.addDocument(createDocument("test1",
                "Salamiwurst Schinkenwurst"));
        indexWriter.addDocument(createDocument("test2",
                "Erdberrmarmelade Brombermarmelade"));
        indexWriter.addDocument(createDocument("test3",
                "Fischstäbchen Backfisch"));
        indexWriter.optimize();

        indexWriter.close();

        IndexReader indexReader = IndexReader.open(index);
        Searcher searcher = new IndexSearcher(indexReader);
        Analyzer analyzer = new StandardAnalyzer();

        QueryParser queryParser = new QueryParser("contents", analyzer);
        queryParser.setAllowLeadingWildcard(true);
        Query query = queryParser.parse("*marmelade");

        TopDocs topDocs = searcher.search(query, null, 100);
        for (ScoreDoc sd : topDocs.scoreDocs) {
            Document resultDoc = searcher.doc(sd.doc);
            System.out.println(resultDoc.get("title") + " -> "
                    + resultDoc.get("contents"));
        }

        indexReader.close();
        index.close();

    }

    private static Document createDocument(String title, String contents) {
        Document document = new Document();
        document.add(new Field("title", title, Field.Store.YES,
                Field.Index.NOT_ANALYZED));
        document.add(new Field("contents", contents, Field.Store.YES,
                Field.Index.ANALYZED));
        return document;
    }

}

Gruß Tom
 
danke, aber ich weiß nun noch immer nicht welche Datei ich ändern muss. ich verwende, Regain, das ist ein auf Lucene Basirendes Programm, mit Lucene kern... und hoffe dass man es da auch machen kann, aber ich weiß nicht wie.

daher die Frage welche datei man änder muss..
 
Frage: danke, aber ich weiß nun noch immer nicht welche Datei ich ändern muss. ich verwende, Regain, das ist ein auf Lucene Basirendes Programm, mit Lucene kern... und hoffe dass man es da auch machen kann, aber ich weiß nicht wie.

Antwort: net.sf.regain.search.results.SingleSearchResults Zeile 121. Ich habe es geändert und eingecheckt. Jörg, da kannst dir den Trunk auschecken und bauen.

Code:
        String[] searchFieldArr = indexConfig.getSearchFieldList();
        for (int i = 0; i < searchFieldArr.length; i++) {
          QueryParser parser = new QueryParser(searchFieldArr[i], mAnalyzer);
          parser.setDefaultOperator(QueryParser.AND_OPERATOR);
          parser.setAllowLeadingWildcard(true);
          Query fieldQuery = parser.parse(queryText);

          // Add as OR
          mQuery.add(fieldQuery, Occur.SHOULD);
        }
 
Also.. danke nochmal !

Aber die Datei die ich runter laden kann muss man noch Kompilieren oder?
wie genau realisiere ich dass?
damit ich regain mal dazu bekomme das zu tun was ich will, auch auf die Gefahr hin, dass es langsamer wird.
Und natürlich auch die anderen auf Lucene basierenden engins.?
 

Neue Beiträge

Zurück