2013-03-02 20 views
14

In Lucene können wir mit TermQuery einen Text mit einem Feld durchsuchen. Ich frage mich, wie man ein Keyword über eine Reihe von Feldern oder alle durchsuchbaren Felder durchsuchen kann?Wie wird über alle Felder gesucht?

Antwort

9

Zwei Ansätze

1) Index-Zeit Ansatz: Verwenden Sie ein allumfassendes Feld. Dies ist nichts anderes, als den gesamten Text aus allen Feldern anzufügen (Gesamttext aus Ihrem Eingabedokument) und den resultierenden großen Text in ein einzelnes Feld zu platzieren. Sie müssen während der Indizierung ein zusätzliches Feld hinzufügen, um als Sammelfeld zu fungieren.

2) Suchzeitansatz: Verwenden Sie BooleanQuery, um mehrere Abfragen zu kombinieren, z. B. TermQuery-Instanzen. Diese Mehrfachabfragen können gebildet werden, um alle Zielfelder abzudecken.

Example Überprüfen Sie am Ende des Artikels.

Verwenden Sie Ansatz 2, wenn Sie die Zielfeldliste zur Laufzeit kennen. Andernfalls müssen Sie den ersten Ansatz verwenden.

+0

Dank für die gute Gesamtbild Erklärung. Der erste Ansatz ist, was ich verwende, wenn ich verschiedene Arten von Produkten im selben Index speichere, zum Beispiel Drucker versus Monitore, wo verschiedene Felder für jedes Dokument existieren, aber ich möchte "Volltextsuche" mit einem einfachen Suchstring verwenden und alles zurückholen Produkte, die passen. – nothingisnecessary

20

Ein anderer Ansatz, der nichts mehr indizieren muss als das, was Sie bereits haben, noch verschiedene Abfragen kombinieren, ist die MultiFieldQueryParser.

Sie können eine Liste der Felder angeben, in denen Sie suchen möchten, und Ihre Abfrage, das ist alles.

MultiFieldQueryParser queryParser = new MultiFieldQueryParser(
       Version.LUCENE_41, 
       new String[]{"title", "content", "description"}, 
       new StandardAnalyzer(Version.LUCENE_41)); 

Query query = queryParser.parse("here goes your query"); 

So würde ich es mit der Original-Lucene-Bibliothek in Java geschrieben. Ich bin mir nicht sicher, ob die MultiFieldQueryParser auch in lucene.net verfügbar ist.

+0

MultiFieldQueryParser ist ein eleganter Ansatz .. :) – phani

+0

Danke, Ihre Antwort ist auch nicht schlecht;) +1 – javanna

3

Ein weiterer einfacher Ansatz für die Suche über alle Felder mit "MultifieldQueryParser" ist Verwendung IndexReader.FieldOption.ALL in Ihrer Abfrage.

Hier ist ein Beispiel in C#.

Directory directory = FSDirectory.Open(new DirectoryInfo(HostingEnvironment.MapPath(VirtualIndexPath))); 

    //get analyzer 
    Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_29); 

    //get index reader and searcher 
    IndexReader indexReader__1 = IndexReader.Open(directory, true); 
    Searcher indexSearch = new IndexSearcher(indexReader__1); 

    //add all possible fileds in multifieldqueryparser using indexreader getFieldNames method 
    dynamic queryParser = new MultiFieldQueryParser(Version.LUCENE_29, indexReader__1.GetFieldNames(IndexReader.FieldOption.ALL).ToArray(), analyzer); 
    dynamic query = queryParser.Parse(Criteria); 
    TopDocs resultDocs = null; 

    //perform search 
    resultDocs = indexSearch.Search(query, indexReader__1.MaxDoc()); 
    dynamic hits = resultDocs.scoreDocs; 

click here in meine pervious Antwort auf gleiche quesiton überprüfen vb.net

+0

Ich sehe nicht den Punkt der Verwendung von Ente hier tippen (d. H. 'Dynamic' Schlüsselwort). Vielleicht wollten Sie type interence mit 'var' verwenden? –

Verwandte Themen