예제 #1
0
 public IEnumerable <Document> Search(string expression, int maxResults = 100)
 {
     if (expression == null)
     {
         throw new ArgumentNullException(nameof(expression));
     }
     try {
         var directory = SimpleFSDirectory.Open(indexDirectory);
         using (var indexReader = IndexReader.Open(directory, true)) {
             using (var indexSearcher = new IndexSearcher(indexReader)) {
                 using (var analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30)) {
                     var parser = new MultiFieldQueryParser(Lucene.Net.Util.Version.LUCENE_30, defaultFields.ToArray(), analyzer);
                     //var parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_30, "headline", analyzer);
                     var query = parser.Parse(expression);
                     var hits  = indexSearcher.Search(query, null, maxResults).ScoreDocs;
                     var docs  = hits.Select(e => indexSearcher.Doc(e.Doc)).ToList(); // Need ToList as indexSearcher will be disposed...
                     return(docs);
                 }
             }
         }
     }
     catch {
         return(null);
     }
 }
예제 #2
0
        private IEnumerator IndexInternal <T>(IEnumerable <T> items, int timeSlice = 13, bool processYields = true)
        {
            if (items == null)
            {
                throw new ArgumentNullException(nameof(items));
            }
            var type = typeof(T);

            if (!indexers.ContainsKey(type))
            {
                throw new ArgumentOutOfRangeException(nameof(items), "At least one index must be defined using DefineIndexTerm for a type before it can be indexed.");
            }
            var keyIndexer  = indexers[type].PrimaryKey;
            var definitions = indexers[type].Indexers;
            var analyzer    = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30);
            var stopwatch   = new Stopwatch();

            stopwatch.Start();
            var count        = 0;
            var notNullItems = items.Where(e => e != null);
            var total        = notNullItems.Count();

            OnProgress("Indexing", 0, total);
            var directory = SimpleFSDirectory.Open(indexDirectory);
            var create    = !IndexReader.IndexExists(directory);

            using (var writer = new IndexWriter(directory, analyzer, create, IndexWriter.MaxFieldLength.LIMITED)) {
                foreach (var item in notNullItems)
                {
                    var  doc  = new Document();
                    Term term = null;
                    if (keyIndexer != null)
                    {
                        term = new Term(keyIndexer.Name, keyIndexer.Indexer(item));
                    }
                    foreach (var definition in definitions)
                    {
                        var value = definition.Indexer(item);
                        var field = new Field(definition.Name, value, definition.StoreType(), definition.IndexType());
                        doc.Add(field);
                    }
                    if (term != null)
                    {
                        writer.UpdateDocument(term, doc);
                    }
                    else
                    {
                        writer.AddDocument(doc);
                    }
                    if (stopwatch.ElapsedMilliseconds >= timeSlice)
                    {
                        OnProgress("Indexing", count, total);
                        if (processYields)
                        {
                            yield return(null);
                        }
                        stopwatch.Restart();
                    }
                    ++count;
                }
                OnProgress("Indexing", count, total);
                if (processYields)
                {
                    yield return(null);
                }
                OnProgress("Optimizing", 0, 1);
                if (processYields)
                {
                    yield return(null);
                }
                writer.Optimize();
                writer.Commit();
                OnProgress("Optimizing", 1, 1);
            }
        }
예제 #3
0
        public static void TestFlexLuceneFS(string[] args)
        {
            string ixdir = string.Empty;

            if (IsLinux)
            {
                ixdir = "/home/master/flexlucene/indexes";
            }
            else
            {
                ixdir = @"c:\temp\flexlucene\indexes";
            }

            StandardAnalyzer analyzer = new StandardAnalyzer();

            //FlexLucene.Store.Directory index = SimpleFSDirectory.Open(java.nio.file.Paths.get(ixdir),SimpleFSLockFactory.INSTANCE);
            FlexLucene.Store.Directory index = SimpleFSDirectory.Open(java.nio.file.Paths.get(ixdir));
//			FlexLucene.Store.Directory index = NIOFSDirectory.Open(java.nio.file.Paths.get(ixdir));



            config = new IndexWriterConfig(analyzer);
            cnf    = new FacetsConfig();
            cnf.SetIndexFieldName("title", "facet_title");
            cnf.SetIndexFieldName("isbn", "facet_isbn");
            LuceneTest.taxoDir    = (FlexLucene.Store.Directory) new RAMDirectory();
            LuceneTest.taxoWriter = (TaxonomyWriter) new FlexLucene.Facet.Taxonomy.Directory.DirectoryTaxonomyWriter(LuceneTest.taxoDir, IndexWriterConfigOpenMode.CREATE);
            IndexWriter w = new IndexWriter(index, LuceneTest.config);

            addDoc(w, "Lucene in Action", "9900001");
            addDoc(w, "Lucene for Dummies", "9900002");
            addDoc(w, "Lucene for Dummies 2", "9900003");

            w.close();
            String querystr = "isbn:99*";

            Query                q           = new QueryParser("title", (Analyzer)analyzer).Parse(querystr);
            int                  hitsPerPage = 10;
            IndexReader          reader      = (IndexReader)DirectoryReader.Open(index);
            IndexSearcher        searcher    = new IndexSearcher(reader);
            TopScoreDocCollector collector   = TopScoreDocCollector.Create(hitsPerPage);

            searcher.Search(q, (Collector)collector);
            ScoreDoc[] hits = collector.TopDocs().ScoreDocs;
            Console.WriteLine("Found " + hits.Length + " hits.");
            for (int i = 0; i < hits.Length; ++i)
            {
                int      docId = hits [i].Doc;
                Document d     = searcher.Doc(docId);
                Console.WriteLine(i + 1 + ". " + d.Get("isbn") + "\t" + d.Get("title"));
            }
            SortedSetDocValuesReaderState state = (SortedSetDocValuesReaderState) new DefaultSortedSetDocValuesReaderState(reader, "facet_isbn");
            FacetsCollector fc = new FacetsCollector();

            FacetsCollector.Search(searcher, q, 10, (Collector)fc);
            Facets      facets = (Facets) new SortedSetDocValuesFacetCounts(state, fc);
            FacetResult result = facets.GetTopChildren(10, "isbn", new String[0]);

            for (int j = 0; j < result.ChildCount; ++j)
            {
                LabelAndValue lv = result.LabelValues [j];
                Console.WriteLine(String.Format("Label={0}, Value={1}", lv.Label, lv.Value));
            }
            reader.close();
        }