예제 #1
0
        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));
                }
            }
        }
예제 #2
0
        /// <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();
        }