The Lucene.Net documentation is extremely lacking - I've been trying to figure out how to make use of the Lucene.Net phonetic searching functionality.
I've mainly been referencing the lucene.ne git project's test case for the PhoneticFilter: https://github.com/apache/lucenenet/blob/master/src/Lucene.Net.Tests.Analysis.Phonetic/TestPhoneticFilter.cs
How I create my index:
// add new index entry
Document doc = new Document
{
new TextField("brand", vehicle.Brand ?? string.Empty, Field.Store.YES),
new TextField("range", vehicle.Range ?? string.Empty, Field.Store.YES),
new TextField("model", vehicle.Model ?? string.Empty, Field.Store.YES),
new TextField("year", vehicle.Year ?? string.Empty, Field.Store.YES),
};
// add entry to index
writer.AddDocument(doc);
Next, from the test case, it seems you can add the PhoneticFilter to the Analyzer:
// set up lucene searcher
using DirectoryReader reader = DirectoryReader.Open(Directory);
Analyzer analyzer = Analyzer.NewAnonymous(createComponents: (fieldName, reader) =>
{
Tokenizer tokenizer = new KeywordTokenizer(reader);
return new TokenStreamComponents(tokenizer, new PhoneticFilter(tokenizer, new Soundex(), false));
});
IndexSearcher searcher = new IndexSearcher(reader);
int hits_limit = searchModel.Start + searchModel.Qty;
TopDocs topDocs;
Sort sortOrder = null;
BooleanQuery vehicleFilterQuery = new BooleanQuery();
var brandParser = new QueryParser(Lucene.Net.Util.LuceneVersion.LUCENE_48, "brand", analyzer);
var brandQuery = ParseQuery(searchModel.SearchTerm, brandParser);
brandQuery.Boost = 4.0f;
vehicleFilterQuery.Add(brandQuery, Occur.SHOULD);
var rangeParser = new QueryParser(Lucene.Net.Util.LuceneVersion.LUCENE_48, "range", analyzer);
var rangeQuery = ParseQuery(searchModel.SearchTerm, rangeParser);
rangeQuery.Boost = 3.0f;
vehicleFilterQuery.Add(rangeQuery, Occur.SHOULD);
var modelParser = new QueryParser(Lucene.Net.Util.LuceneVersion.LUCENE_48, "model", analyzer);
var modelQuery = ParseQuery(searchModel.SearchTerm, modelParser);
modelQuery.Boost = 2.0f;
vehicleFilterQuery.Add(modelQuery, Occur.SHOULD);
var yearParser = new QueryParser(Lucene.Net.Util.LuceneVersion.LUCENE_48, "year", analyzer);
var yearQuery = ParseQuery(searchModel.SearchTerm, yearParser);
yearQuery.Boost = 1.0f;
vehicleFilterQuery.Add(yearQuery, Occur.SHOULD);
topDocs = searcher.Search(vehicleFilterQuery, null, hits_limit, sortOrder ?? Sort.RELEVANCE);
ScoreDoc[] subset = topDocs.ScoreDocs.Skip(searchModel.Start).Take(searchModel.Qty).ToArray();
return MapToModelList(subset, searcher);
After implementing this in order to test, I search with Audee, expecting to get a bunch of Audi results, but while the regular (correctly spelled) search works, the phonetic search seems to have no impact.
I've tried the Metaphone(), DoubleMetaphone(), Soundex(), RefinedSoundex(), Caverphone1() and Caverphone2() encoders
DoubleMetaphone https://lucenenetdocs.azurewebsites.net/api/Lucene.Net.Analysis/Lucene.Net.Analysis.Phonetic.Language.DoubleMetaphone.html
RefinedSoundex https://lucenenetdocs.azurewebsites.net/api/Lucene.Net.Analysis/Lucene.Net.Analysis.Phonetic.Language.RefinedSoundex.html