public static void AutoCompleteSample() { Directory dir = new RAMDirectory(); // Create n-edge grams for field suggestionText Analyzer analyzer = new EdgeNGramAnalyzer(Version); var indexWriter = new IndexWriter(dir, analyzer, IndexWriter.MaxFieldLength.UNLIMITED); var docs = CreateAutoCompleteDocuments(GetDeals()); foreach (var doc in docs) { indexWriter.AddDocument(doc); } indexWriter.Commit(); indexWriter.Dispose(); var searcherManager = new SearcherManager(dir); // Default sort by dicount pct desc. var sort = new Sort(new SortField(DiscountPctFieldName, SortField.INT, true)); const int maxSuggestions = 5; for (;;) { Console.Write("Enter a text for auto completion and press enter: "); var input = Console.ReadLine(); Query query = new TermQuery(new Term(SuggestionTextFieldName, input)); var searcher = searcherManager.GetSearcher(); TopDocs hits; try { hits = searcher.Search(query, null, maxSuggestions, sort); } finally { searcherManager.ReleaseSearcher(searcher); } foreach (ScoreDoc match in hits.ScoreDocs) { Document doc = searcher.Doc(match.Doc); Console.WriteLine("Matched: '{0}' in '{1}' by '{2}'", doc.Get(SuggestionTextFieldName), doc.Get(LocationNameFieldName), doc.Get(SupplierFieldName)); } } }
/// <summary> /// Create edge n-grams for each term. Store the terms (n-grams) and the term frequency in the directory. /// </summary> /// <param name="directory"></param> /// <param name="termsMap"></param> private static void BuildAutoSuggestIndex(Directory directory, Dictionary <string, int> termsMap) { var analyzer = new EdgeNGramAnalyzer(Lucene.Net.Util.Version.LUCENE_29); var writer = new IndexWriter(directory, analyzer, true, IndexWriter.MaxFieldLength.LIMITED); writer.SetRAMBufferSizeMB(64d); writer.MergeFactor = 300; foreach (var term in termsMap.Keys) { var doc = new Document(); doc.Add(new Field(NGramTermField, term, Field.Store.YES, Field.Index.ANALYZED_NO_NORMS)); doc.Add(new Field(TermFreqField, termsMap[term].ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS)); writer.AddDocument(doc); } writer.Optimize(); writer.Commit(); writer.Dispose(); }