Zum Hauptinhalt springen

Apache Lucene

  • Programmbibliothek zur Volltextsuche
  • von Apache Software Foundation

.NET

Installation

dotnet new console --name LuceneTest
cd LuceneTest
dotnet add package Lucene.Net --prerelease
dotnet add package Lucene.Net.Analysis.Common --prerelease

Hinweis: Die --prerelease-Option ist erforderlich, da Lucene.NET schon seit langem in der Beta-Version 4.8.0 Beta (Stand 24.06.2025) vorliegt. Diese ist jedoch sehr stabil und wird schon produktiv in vielen Projekten eingesetzt.

Grundaufbau

Siehe Startseite von Lucene.NET

Queries

TermQuery

  • sucht Dokumente, die spezifisches einzelnes Wort enthalten
  • sucht Terme
Query termQuery = new TermQuery(new Term("content", "lucene"));
luceneIndex.Search(termQuery, 10);

PhraseQuery

  • sucht Dokumente, die bestimmte Abfolge von Wörtern / Phrasen enthalten
PhraseQuery phraseQuery = new PhraseQuery() { Slop = 0 };
phraseQuery.Add(new Term("content", "verlorenen"));
phraseQuery.Add(new Term("content", "schatz"));
luceneIndex.Search(phraseQuery1, 10);
EigenschaftDatentypBeschreibung
Slopint0: Wörter müssen direkt nebeneinander stehen
1: erlaubt Wort zwischen den Wörtern

WildcardQuery

  • sucht Dokumente, die mit Platzhaltern/Wildcard übereinstimmende Wörter enthalten
  • sucht Phrasen
WildcardQuery wildcardQuery = new WildcardQuery(new Term("content", "geh?eimnis*"));
luceneIndex.Search(wildcardQuery, 10);
WildcardBedeutung
?1 beliebiges Zeichen
*beliebig viele beliebige Zeichen

FuzzyQuery

  • sucht Dokumente, die dem Suchbegriff ähnliche Wörter enthalten (Tippfehlertoleranz)
FuzzyQuery fuzzyQuery = new FuzzyQuery(new Term("content", "rezepte"), maxEdits: 1);
luceneIndex.Search(fuzzyQuery, 10);
EigenschaftBedeutung
maxEditsmaximaler Editierabstand

BooleanQuery

  • kombiniert mehrere Queries mit logischen Operatoren
  • logische Operatoren: und, oder, nicht
BooleanQuery booleanQuery = new BooleanQuery();
booleanQuery.Add(new TermQuery(new Term("content", "alpen")), Occur.MUST);
booleanQuery.Add(new TermQuery(new Term("content", "schweiz")), Occur.MUST);
booleanQuery.Add(new TermQuery(new Term("content", "reisen")), Occur.SHOULD);
luceneIndex.Search(booleanQuery, 10);

QueryParser

const LuceneVersion matchVersion = LuceneVersion.LUCENE_48;

StandardQueryParser qpHelper = new StandardQueryParser();

QueryConfigHandler config = qpHelper.QueryConfigHandler;
config.Set(ConfigurationKeys.ALLOW_LEADING_WILDCARD, true);
config.Set(ConfigurationKeys.ANALYZER, new WhitespaceAnalyzer(matchVersion));

Query query = qpHelper.Parse("apache AND lucene", "defaultField");

Query-Syntax

Beispiele:

QueryBeschreibung
test^10wird höher gewichtet
test~Fuzzy-Suche
test^10 or test~wenn test alleine vorkommt, wird es höher gewichtet, nachher kommen Resultate, welche ungefähr gleich wie test sind