using System.Collections.Generic;
using Lucene.Net.Analysis;
using Lucene.Net.Analysis.En;
using Lucene.Net.Documents;
using Lucene.Net.QueryParsers.Classic;
internal static class Program
private static void Main()
var x = new NUnitLite.AutoRun().Execute(new string[]{"--test:TestAnalyzers", "--noc"});
Console.WriteLine("----------------------------------------------");
Console.WriteLine(x==0?"All Test Passed... :¬)": string.Format("{0} tests failed... :¬(", x));
Console.WriteLine("----------------------------------------------");
public class TestAnalyzers
private const string FieldName = "CustomFieldName";
public Directory CreateDirectory(IEnumerable<string> documents, Analyzer analyzer)
var directory = new RAMDirectory();
var iwc = new IndexWriterConfig(LuceneVersion.LUCENE_48, analyzer)
OpenMode = OpenMode.CREATE_OR_APPEND,
var writer = new IndexWriter(directory, iwc);
foreach(var doc in documents) {
var document = new Document();
document.AddTextField(FieldName, doc, StoredField.Store.YES);
writer.AddDocument(document);
writer.Flush(true, true);
private QueryParser CreateQueryParser(Analyzer analyzer)
=> new MultiFieldQueryParser(
private string[] GetSearchFields() => new [] { FieldName };
[TestCase("for", "forward")]
[TestCase("forward", "for")]
[TestCase("retirement", "retire")]
public void TestPartialWordsStandard(string fieldValue, string query)
var analyzer = new EnglishAnalyzer(LuceneVersion.LUCENE_48);
var directory = CreateDirectory(new [] { fieldValue }, analyzer);
var indexReader = DirectoryReader.Open(directory);
Assert.AreEqual(1, indexReader.NumDocs);
var doc = indexReader.Document(0);
Assert.AreEqual(fieldValue, doc.GetField(FieldName).GetStringValue());
var searcher = new IndexSearcher(indexReader);
var queryObj = CreateQueryParser(analyzer).Parse(query);
var results = searcher.Search(queryObj, 2);
Assert.AreEqual(1, results.TotalHits);
doc = indexReader.Document(results.ScoreDocs.First().Doc);
Assert.AreEqual(fieldValue, doc.GetField(FieldName).GetStringValue());