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
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.
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.
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
Ich sehe nicht den Punkt der Verwendung von Ente hier tippen (d. H. 'Dynamic' Schlüsselwort). Vielleicht wollten Sie type interence mit 'var' verwenden? –
- 1. Alle Wörter, die über EditText gesucht
- 2. Solr - Abfrage über alle Felder best practice
- 3. Telling ld wo über eine Umgebungsvariable nach Verzeichnissen gesucht wird
- 4. Wie wird nach Eclipse P2-Repositories gesucht?
- 5. Wie wird nach einem festen Dokument gesucht?
- 6. Wie wird nach ungültigen RLM-Ergebnissen gesucht?
- 7. meta_query, wie wird mit beiden Relationen OR & AND gesucht?
- 8. Kopfzeile ignorieren, wenn nach Duplikaten gesucht wird
- 9. Wie bekomme ich ALLE Felder eines WorkItems?
- 10. Applet-Jar wird nicht nach Dateien gesucht
- 11. Wie wird mit einem regulären Ausdruck in Eclipse gesucht?
- 12. Elastische Suche - Nur bestimmte Felder über alle Indizes abrufen
- 13. Schleife über alle Felder in einer Java-Klasse
- 14. Wie wird eine case-insensitive Liste in C# gesucht?
- 15. Bestimmte öffentliche Felder über Reflektion abrufen (für alle übergeordneten Klassen)
- 16. Serialize alle Felder
- 17. libvlc_media_player_set_position schlägt fehl, wenn rückwärts gesucht wird
- 18. Wie wird nach vorhandenen Objekten in NSSet oder NSCountedSet gesucht?
- 19. Überschreiben Gleich(), aber nicht alle Felder prüfen - was wird passieren?
- 20. Wie validiert man alle Felder gleichzeitig?
- 21. VSTS Wie suche ich alle Felder?
- 22. Wie wird die ganze Zeichenfolge nach einem bestimmten Wort gesucht?
- 23. Lambda-Ausdrücke, wie in einem Objekt gesucht wird?
- 24. Wie wird in der Tabelle nach bestimmten Spaltenwerten gesucht?
- 25. Wie wird nach Ähnlichkeit in MySQL gesucht und sortiert?
- 26. Wie wird im iPhone SDK nach einem Namen gesucht?
- 27. Wie wird nach dem nächsten Wert in einer Nachschlagetabelle gesucht?
- 28. Wie wird nach mehreren Feldern (SQL, PHP) gesucht?
- 29. Wie wird nach allen Großbuchstaben in vim gesucht?
- 30. Wie wird der Dateiinhalt in mehreren Subversion-Repositories gesucht?
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