コード例 #1
0
 private static IEnumerable <TvChannel> search(string searchQuery, string searchField = "")
 {
     if (string.IsNullOrEmpty(searchQuery.Replace("*", "").Replace("?", "")))
     {
         return(new List <TvChannel>());
     }
     using (IndexSearcher searcher = new IndexSearcher(Directory, false)) {
         int n = 1000;
         StandardAnalyzer standardAnalyzer = new StandardAnalyzer(Version.LUCENE_30);
         if (!string.IsNullOrEmpty(searchField))
         {
             QueryParser             parser     = new QueryParser(Version.LUCENE_30, searchField, standardAnalyzer);
             Query                   query      = parseQuery(searchQuery, parser);
             IEnumerable <TvChannel> enumerable = mapLuceneToDataList(searcher.Search(query, n).ScoreDocs, searcher);
             standardAnalyzer.Close();
             searcher.Dispose();
             return(enumerable);
         }
         MultiFieldQueryParser fieldQueryParser = new MultiFieldQueryParser(Version.LUCENE_30, new string[3]
         {
             "Id",
             "Name",
             "Description"
         }, standardAnalyzer);
         Query query1 = parseQuery(searchQuery, fieldQueryParser);
         IEnumerable <TvChannel> enumerable1 = mapLuceneToDataList(searcher.Search(query1, null, n, Sort.RELEVANCE).ScoreDocs, searcher);
         standardAnalyzer.Close();
         searcher.Dispose();
         return(enumerable1);
     }
 }
コード例 #2
0
ファイル: SearchService.cs プロジェクト: hoangsangnguyen/CRM
        public IEnumerable <TEntity> _search(string searchQuery, string searchField = "")
        {
            // set up lucene searcher
            using (var searcher = new IndexSearcher(_directory, false))
            {
                var hits_limit = 1000;
                var analyzer   = _getAnalyzer();

                // search by single field
                if (!string.IsNullOrEmpty(searchField))
                {
                    var parser = new QueryParser(Version.LUCENE_30, searchField, analyzer);
                    parser.AllowLeadingWildcard = true;
                    var query   = parseQuery(searchQuery, parser);
                    var hits    = searcher.Search(query, hits_limit).ScoreDocs;
                    var results = _mapLuceneToDataList(query, hits, searcher);
                    analyzer.Close();
                    searcher.Dispose();
                    return(results);
                }
                // search by multiple fields (ordered by RELEVANCE)
                else
                {
                    var parser = new MultiFieldQueryParser(Lucene.Net.Util.Version.LUCENE_30,
                                                           new[] { IndexKey.Id, IndexKey.TextValue, IndexKey.TextContentId },
                                                           analyzer);
                    var query   = parseQuery(searchQuery, parser);
                    var hits    = searcher.Search(query, null, hits_limit, Sort.INDEXORDER).ScoreDocs;
                    var results = _mapLuceneToDataList(query, hits, searcher);
                    analyzer.Close();
                    searcher.Dispose();
                    return(results);
                }
            }
        }
コード例 #3
0
 //partially taken from http://www.codeproject.com/Articles/320219/Lucene-Net-ultra-fast-search-for-MVC-or-WebForms
 //START
 private IEnumerable <FileToIndex> _search(string keywords, out int count, string field = "")
 {
     if (string.IsNullOrEmpty(keywords.Replace("*", "").Replace("?", "")))
     {
         count = 0;
         return(new List <FileToIndex>());
     }
     using (var searcher = new IndexSearcher(_directory))
         using (var analyzer = new Lucene.Net.Analysis.Ru.RussianAnalyzer(Version.LUCENE_30))
         {
             if (!string.IsNullOrEmpty(field))
             {
                 var parser        = new QueryParser(Version.LUCENE_30, field, analyzer);
                 var queryForField = parseQuery(keywords, parser);
                 var docs          = searcher.Search(queryForField, 100);
                 count = docs.TotalHits;
                 var samples = _convertDocs(docs.ScoreDocs, searcher);
                 searcher.Dispose();
                 return(samples);
             }
             else
             {
                 var parser = new MultiFieldQueryParser
                                  (Version.LUCENE_30, new[] { "Title", "Authors", "Description", "Text", "Discipline" }, analyzer);
                 var queryForField = parseQuery(keywords, parser);
                 var docs          = searcher.Search(queryForField, null, 100, Sort.RELEVANCE);
                 count = docs.TotalHits;
                 var samples = _convertDocs(docs.ScoreDocs, searcher);
                 searcher.Dispose();
                 return(samples);
             }
         }
 }
コード例 #4
0
        private static IEnumerable <Artifact> _search(string searchQuery, string searchField = "")
        {
            if (string.IsNullOrEmpty(searchQuery.Replace("*", "").Replace("?", "")))
            {
                return(new List <Artifact>());
            }

            using (var searcher = new IndexSearcher(_directory, false))
            {
                var hits_limit = 1000;
                var analyzer   = new StandardAnalyzer(Version.LUCENE_30);

                if (!string.IsNullOrEmpty(searchField))
                {
                    var parser  = new QueryParser(Version.LUCENE_30, searchField, analyzer);
                    var query   = parseQuery(searchQuery, parser);
                    var hits    = searcher.Search(query, hits_limit).ScoreDocs;
                    var results = _mapLuceneToDataList(hits, searcher);
                    analyzer.Close();
                    searcher.Dispose();
                    return(results);
                }

                else
                {
                    var parser  = new MultiFieldQueryParser(Version.LUCENE_30, getArtifactPropertiesArray(), analyzer);
                    var query   = parseQuery(searchQuery, parser);
                    var hits    = searcher.Search(query, null, hits_limit, Sort.INDEXORDER).ScoreDocs;
                    var results = _mapLuceneToDataList(hits, searcher);
                    analyzer.Close();
                    searcher.Dispose();
                    return(results);
                }
            }
        }
コード例 #5
0
        private static IEnumerable <Task> privateSearch(string searchQuery, string searchField = "")
        {
            if (string.IsNullOrEmpty(searchQuery.Replace("*", "").Replace("?", "")))
            {
                return(new List <Task>());
            }

            using (var searcher = new IndexSearcher(directory, false))
            {
                var hits_limit = 1000;
                var analyzer   = new StandardAnalyzer(Version.LUCENE_30);
                if (!string.IsNullOrEmpty(searchField))
                {
                    var parser  = new QueryParser(Version.LUCENE_30, searchField, analyzer);
                    var query   = parseQuery(searchQuery, parser);
                    var hits    = searcher.Search(query, hits_limit).ScoreDocs;
                    var results = mapLuceneToDataList(hits, searcher);
                    analyzer.Close();
                    searcher.Dispose();
                    return(results);
                }
                else
                {
                    var parser = new MultiFieldQueryParser
                                     (Version.LUCENE_30, new[] { "Id", "Name", "Condition" }, analyzer);
                    var query = parseQuery(searchQuery, parser);
                    var hits  = searcher.Search
                                    (query, null, hits_limit, Sort.RELEVANCE).ScoreDocs;
                    var results = mapLuceneToDataList(hits, searcher);
                    analyzer.Close();
                    searcher.Dispose();
                    return(results);
                }
            }
        }
コード例 #6
0
ファイル: LuceneSearch.cs プロジェクト: gkovalev/nastia
        // main search method
        /// <summary>
        /// return IEnumerable of interesting id
        /// </summary>
        /// <param name="searchQuery">that to find</param>
        /// <param name="pageNumber">number of paging</param>
        /// <param name="pageSize">size return collection</param>
        /// <param name="searchField">if set than return result only by fiekd</param>
        /// <returns></returns>
        private static IEnumerable <int> _search(string searchQuery, int pageNumber, int pageSize, string searchField = "")
        {
            // validation
            if (string.IsNullOrEmpty(searchQuery.Replace("*", "").Replace("?", "")))
            {
                return(new List <int>());
            }

            try
            {
                // set up lucene searcher
                using (LuceneDirectory)
                {
                    //var analyzer = new RuAnalyzer();
                    var analyzer = new StandardAnalyzer(Version);
                    using (var searcher = new IndexSearcher(LuceneDirectory, true))
                    {
                        // search by single field
                        if (!string.IsNullOrEmpty(searchField))
                        {
                            var parser = new QueryParser(Version, searchField, analyzer);
                            var query  = ParseQuery(searchQuery, parser);
                            var hits   = searcher.Search(query, HitsLimit).ScoreDocs;
                            //calc
                            var paging = CalculateArrayLocation(hits.Length, pageNumber, pageSize);

                            var results = MapLuceneToDataList(hits, searcher, paging);
                            analyzer.Close();
                            searcher.Close();
                            searcher.Dispose();
                            LuceneDirectory.Close();
                            return(results);
                        }
                        // search by multiple fields (ordered by RELEVANCE)
                        else
                        {
                            var parser = new MultiFieldQueryParser(Version, new[] { "ArtNo", "Name", "NameWithWiteSpace" }, analyzer);
                            var query  = ParseQuery(searchQuery, parser);
                            //searcher.SetDefaultFieldSortScoring(true, true);
                            var hits = searcher.Search(query, null, HitsLimit, Sort.RELEVANCE).ScoreDocs;
                            //var hits = searcher.Search(query, HitsLimit).ScoreDocs;
                            //calc
                            var paging = CalculateArrayLocation(hits.Length, pageNumber, pageSize);

                            var results = MapLuceneToDataList(hits, searcher, paging);
                            analyzer.Close();
                            searcher.Close();
                            searcher.Dispose();
                            LuceneDirectory.Close();
                            return(results);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Debug.LogError(ex);
                return(new List <int>());
            }
        }
コード例 #7
0
        public override List <TT> ExecuteSearch(string searchQuery, string searchField = "")
        {
            try
            {
                if (string.IsNullOrEmpty(searchQuery.Replace("*", "").Replace("?", "")))
                {
                    return(new List <TT>());
                }


                IndexReader rdr;
                try
                {
                    rdr = IndexReader.Open(_writerPool[HostContext.Instance.Items["Contract"].ToString().ToLower()].Directory,
                                           true);
                }
                catch (Exception ex)
                {
                    throw new ArgumentException(
                              "DD:AllergyLuceneStrategy:ExecuteSearch(): Could not find contract name in the WriterPool." + ex.Message, ex.StackTrace);
                }

                using (var searcher = new IndexSearcher(rdr))
                {
                    var hits_limit = 1000;
                    var analyzer   = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30);

                    if (!string.IsNullOrEmpty(searchField))
                    {
                        var parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_30, searchField, analyzer);
                        parser.AllowLeadingWildcard = true;
                        parser.PhraseSlop           = 0;
                        var query   = ParseWholeQuery(searchQuery, parser);
                        var hits    = searcher.Search(query, hits_limit).ScoreDocs;
                        var results = MapLuceneToDataList(hits, searcher);
                        analyzer.Close();
                        searcher.Dispose();
                        return(results);
                    }
                    else
                    {
                        var parser = new MultiFieldQueryParser(Lucene.Net.Util.Version.LUCENE_30, new[] { "Id", "Name" }, analyzer);
                        parser.AllowLeadingWildcard = true;
                        parser.PhraseSlop           = 0;
                        var query   = ParseWholeQuery(searchQuery, parser);
                        var hits    = searcher.Search(query, null, hits_limit, Sort.RELEVANCE).ScoreDocs;
                        var results = MapLuceneToDataList(hits, searcher);
                        analyzer.Close();
                        searcher.Dispose();
                        return(results);
                    }
                }
            }
            catch (Exception ex)
            {
                FileLog.LogMessageToFile(ex.Message + " trace:" + ex.StackTrace);
                throw ex;
            }
        }
コード例 #8
0
 /// <summary>
 /// handler for the OnIndexSearcherUpdateRequested event: the global indexsearcher must be recreated after the index had been modified to reflect changes to the endusers
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 protected void IndexSearcherUpdater(object sender, EventArgs e)
 {
     lock (indexSearcher)
     {
         indexSearcher.Dispose();
         indexSearcher = new IndexSearcher(luceneIndexDirectory, true);
     }
 }
コード例 #9
0
        private static IEnumerable <ProductModel> _search(string searchQuery, int UserId, string searchField = "")
        {
            // validation
            if (string.IsNullOrEmpty(searchQuery.Replace("*", "").Replace("?", "")))
            {
                return(new List <ProductModel>());
            }

            // set up lucene searcher
            using (var searcher = new IndexSearcher(_directory, false))
            {
                var hits_limit = 20;
                var analyzer   = new StandardAnalyzer(Version.LUCENE_30);
                Lucene.Net.Search.TermRangeFilter filter = new TermRangeFilter("OwnerIdString", UserId.ToString(), UserId.ToString(), true, true);


                // search by single field
                if (!string.IsNullOrEmpty(searchField))
                {
                    var parser = new QueryParser(Version.LUCENE_30, searchField, analyzer);
                    var query  = parseQuery(searchQuery, parser);

                    ScoreDoc[] hits;
                    hits = searcher.Search(query, hits_limit).ScoreDocs;
                    //if (UserId != 0)
                    //    hits = searcher.Search(query, filter, hits_limit).ScoreDocs;
                    //else
                    //    hits = searcher.Search(query, hits_limit).ScoreDocs;

                    var results = _mapLuceneToDataList(hits, searcher);
                    analyzer.Close();
                    searcher.Dispose();
                    return(results);
                }
                // search by multiple fields (ordered by RELEVANCE)
                else
                {
                    var parser = new MultiFieldQueryParser
                                     (Version.LUCENE_30, new[] { "SrcId", "Title", "Description", "Brand", "Gtin", "Mpn" }, analyzer);
                    var query = parseQuery(searchQuery, parser);

                    ScoreDoc[] hits;
                    hits = searcher.Search(query, hits_limit).ScoreDocs;

                    //if (UserId != 0)
                    //    hits = searcher.Search(query, filter, hits_limit, Sort.RELEVANCE).ScoreDocs;
                    //else
                    //    hits = searcher.Search(query, null, hits_limit, Sort.RELEVANCE).ScoreDocs;

                    var results = _mapLuceneToDataList(hits, searcher);
                    analyzer.Close();
                    searcher.Dispose();
                    return(results);
                }
            }
        }
コード例 #10
0
ファイル: SearchProducts.cs プロジェクト: gj-arrow/Store
        private IEnumerable <SearchProduct> _search(string searchQuery, string searchField = "")
        {
            // validation
            if (string.IsNullOrEmpty(searchQuery.Replace("*", "").Replace("?", "")))
            {
                return(new List <SearchProduct>());
            }

            // set up lucene searcher
            using (var searcher = new IndexSearcher(_directory, false))
            {
                var hits_limit = 1000;
                var analyzer   = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30);

                // search by single field
                if (!string.IsNullOrEmpty(searchField))
                {
                    var parser  = new QueryParser(Lucene.Net.Util.Version.LUCENE_30, searchField, analyzer);
                    var query   = parseQuery(searchQuery, parser);
                    var hits    = searcher.Search(query, hits_limit).ScoreDocs;
                    var results = _mapLuceneToDataList(hits, searcher);
                    analyzer.Close();
                    searcher.Dispose();
                    List <SearchProduct> products = new List <SearchProduct>();
                    using (var db = new ApplicationDbContext())
                    {
                        foreach (var elem in results)
                        {
                            products.Add(new SearchProduct(elem));
                        }
                    }
                    return(products);
                }
                // search by multiple fields (ordered by RELEVANCE)
                else
                {
                    var parser = new MultiFieldQueryParser
                                     (Lucene.Net.Util.Version.LUCENE_30, new[] { "ProductId", "Name", "Description", "Price", "Category" }, analyzer);
                    var query   = parseQuery(searchQuery, parser);
                    var hits    = searcher.Search(query, null, hits_limit, Sort.RELEVANCE).ScoreDocs;
                    var results = _mapLuceneToDataList(hits, searcher);
                    analyzer.Close();
                    searcher.Dispose();
                    List <SearchProduct> products = new List <SearchProduct>();
                    using (var db = new ApplicationDbContext())
                    {
                        foreach (var elem in results)
                        {
                            products.Add(new SearchProduct(elem));
                        }
                    }
                    return(products);
                }
            }
        }
コード例 #11
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="searchQuery"></param>
        /// <param name="searchField"></param>
        /// <returns></returns>
        public IEnumerable <LearningCourseDTO> GetSearchResults(string searchQuery, string searchField = "")
        {
            // validation
            if (string.IsNullOrEmpty(searchQuery.Replace("*", "").Replace("?", "")))
            {
                return(new List <LearningCourseDTO>());
            }

            // set up lucene searcher
            using (var searcher = new IndexSearcher(_directory, false))
            {
                var hits_limit = 1000;
                var analyzer   = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30);

                //if one need to add new field to search:
                //var parser = new MultiFieldQueryParser
                //(Version.LUCENE_30, new[] { "Id", "Name", "Description", "NEW_FIELD" }, analyzer);

                // search by single field
                if (!string.IsNullOrEmpty(searchField))
                {
                    var parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_30, searchField, analyzer);
                    var query  = parseQuery(searchQuery, parser);
                    var hits   = searcher.Search(query, hits_limit).ScoreDocs;

                    var mapper = new LearningCourseMapper();

                    var results = mapper.MapLuceneToDataList(hits, searcher);

                    analyzer.Close();
                    searcher.Dispose();
                    return(results);
                }
                // search by multiple fields (ordered by RELEVANCE)

                else
                {
                    var parser = new MultiFieldQueryParser
                                     (Lucene.Net.Util.Version.LUCENE_30, new[] { "Name", "Description" }, analyzer);
                    var query = parseQuery(searchQuery, parser);
                    var hits  = searcher.Search
                                    (query, null, hits_limit, Sort.RELEVANCE).ScoreDocs;

                    var mapper = new LearningCourseMapper();

                    var results = mapper.MapLuceneToDataList(hits, searcher);

                    analyzer.Close();
                    searcher.Dispose();
                    return(results);
                }
            }
        }
コード例 #12
0
        public void Commit()
        {
            lock (_lock)
            {
                _writer.Commit();

                if (_searcher != null)
                {
                    _searcher.Dispose();
                    _searcher = null;
                }
            }
        }
コード例 #13
0
 public void Close()
 {
     lock (searcherLock)
     {
         EnsureOpen();
         closed = true;
         if (searcher != null)
         {
             searcher.Dispose();
         }
         searcher = null;
     }
 }
コード例 #14
0
        // main search method
        private static IEnumerable <IndexableEntity> _search(string searchQuery, string searchField = "")
        {
            // validation
            if (string.IsNullOrWhiteSpace(searchQuery.Replace("*", string.Empty).Replace("?", string.Empty)))
            {
                return(new List <IndexableEntity>());
            }

            // set up lucene searcher
            using (var searcher = new IndexSearcher(_directory, false))
            {
                var hits_limit = 1000;
                var analyzer   = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30);

                // search by single field
                if (!string.IsNullOrWhiteSpace(searchField))
                {
                    var sort = new Sort(new SortField[] {
                        SortField.FIELD_SCORE,
                        new SortField(searchField, SortField.STRING)
                    });
                    TopFieldCollector topField = TopFieldCollector.Create(sort, hits_limit, true, true, true, true);


                    var parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_30, searchField, analyzer);
                    var query  = parseQuery(searchQuery, parser);
                    //var hits = searcher.Search(query, hits_limit).ScoreDocs;
                    searcher.Search(query, topField);
                    var hits    = topField.TopDocs().ScoreDocs;
                    var results = _mapLuceneToDataList(hits, searcher);
                    analyzer.Close();
                    searcher.Dispose();
                    return(results);
                }
                // search by multiple fields (ordered by RELEVANCE)
                else
                {
                    var parser = new MultiFieldQueryParser
                                     (Lucene.Net.Util.Version.LUCENE_30, new[] { "Id", "TitleName", "SubtitleText" }, analyzer);
                    var query   = parseQuery(searchQuery, parser);
                    var hits    = searcher.Search(query, null, hits_limit, Sort.INDEXORDER).ScoreDocs;
                    var results = _mapLuceneToDataList(hits, searcher);
                    analyzer.Close();
                    searcher.Dispose();
                    return(results);
                }
            }
        }
コード例 #15
0
        private IEnumerable <Lecturer> search(string searchQuery, string searchField = "")
        {
            if (string.IsNullOrEmpty(searchQuery.Replace("*", "").Replace("?", "")))
            {
                return(new List <Lecturer>());
            }

            using (var searcher = new IndexSearcher(Directory, false))
            {
                var analyzer = new StandardAnalyzer(Version.LUCENE_30);

                var parser = new MultiFieldQueryParser(Version.LUCENE_30, new[]
                {
                    SearchingFields.Id.ToString(),
                    SearchingFields.FirstName.ToString(),
                    SearchingFields.MiddleName.ToString(),
                    SearchingFields.LastName.ToString(),
                    SearchingFields.Group.ToString(),
                    SearchingFields.Name.ToString()
                }, analyzer);

                var query   = ParseQuery(searchQuery, parser);
                var docs    = searcher.Search(query, null, HitsLimits, Sort.RELEVANCE).ScoreDocs;
                var results = MapSearchResults(docs, searcher);
                analyzer.Close();
                searcher.Dispose();

                return(results);
            }
        }
コード例 #16
0
        private IEnumerable <SampleData> _search(string searchQuery)
        {
            // validation
            if (string.IsNullOrEmpty(searchQuery.Replace("*", "").Replace("?", "")))
            {
                return(new List <SampleData>());
            }

            // set up lucene searcher
            using (var searcher = new IndexSearcher(FSDirectory.Open(@"C:\Users\Totalit\Source\Repos\FilesAnalyzer\FilesAnalyzer\FilesAnalyzer\IndexedFiles"), false))
            {
                var hits_limit = 1000;
                var analyzer   = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30);


                var parser = new MultiFieldQueryParser
                                 (Lucene.Net.Util.Version.LUCENE_30, new[] { "Author", "title", "description" }, analyzer);
                var query = parseQuery(searchQuery, parser);
                var hits  = searcher.Search
                                (query, null, hits_limit, Sort.RELEVANCE).ScoreDocs;
                var results = _mapLuceneToDataList(hits, searcher);
                analyzer.Close();
                searcher.Dispose();
                return(results);
            }
        }
コード例 #17
0
        public IEnumerable <SampleDataFileRow> _search(string searchTerm, int precision, global::Lucene.Net.Store.Directory indexDirectory)
        {
            Debug.Assert(!String.IsNullOrEmpty(searchTerm));

            List <SampleDataFileRow> results = new List <SampleDataFileRow>();

            if (String.IsNullOrEmpty(searchTerm))
            {
                return(results);
            }

            using (IndexSearcher searcher = new IndexSearcher(indexDirectory))
            {
                var analyzer = new StandardAnalyzer(Version.LUCENE_30, ListStopWords);

                QueryParser parser = new QueryParser(Version.LUCENE_30, "LineText", analyzer);

                if (precision > 0 && precision < 100)
                {
                    parser.FuzzyMinSim = ((float)precision) * 0.01f;
                }
                else if (precision == 100)
                {
                    parser.FuzzyMinSim = 0.99f;
                }
                else
                {
                    parser.FuzzyMinSim = 0.8f;
                }

                //parser.PhraseSlop = 5;

                var query = ParseQuery(searchTerm, parser);

                //var query = fparseQuery(searchTerm);
                ScoreDoc[] hitsFound = searcher.Search(query, null, CountSearchResults).ScoreDocs;

                foreach (var t in hitsFound)
                {
                    var         sampleDataFileRow = new SampleDataFileRow();
                    int         docId             = t.Doc;
                    float       score             = t.Score;
                    Explanation explanation       = searcher.Explain(query, t.Doc);
                    Document    doc = searcher.Doc(docId);

                    sampleDataFileRow.LineNumber = int.Parse(doc.Get("LineNumber"));
                    sampleDataFileRow.LineText   = doc.Get("LineText");
                    sampleDataFileRow.Score      = score;

                    _explanationResult = explanation.ToString();


                    results.Add(sampleDataFileRow);
                }

                analyzer.Close();
                searcher.Dispose();
            }
            return(results.OrderByDescending(x => x.Score).ToList());
        }
コード例 #18
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="searchQuery"></param>
        /// <param name="field"></param>
        /// <returns></returns>
        private static IEnumerable <LuceneData> _Search(string searchstring, string fields = "")
        {
            // validating searchstring
            if (string.IsNullOrEmpty(searchstring.Replace("*", "").Replace("?", "")))
            {
                return(new List <LuceneData>());
            }
            // TEMP: adding index records
            AddUpdateLuceneIndex(SampleLuceneRepository.GetAll());
            // setting up and using Lucene searcher
            using (var searcher = new IndexSearcher(Directory, false))
            {
                var hitLimit = 1000;
                var analyzer = new StandardAnalyzer(Version.LUCENE_30);
                var parser   = new MultiFieldQueryParser(Version.LUCENE_30, new[] { "PubDate", "Author", "Title", "Type", "Tags", "Description" }, analyzer);
                var query    = ParseQuery(searchstring, parser);
                var hits     = searcher.Search(query, hitLimit).ScoreDocs;
                var results  = MapLuceneToDataList(hits, searcher);

                // closing handlers
                analyzer.Close();
                searcher.Dispose();
                return(results);
            }
        }
コード例 #19
0
ファイル: LuceneQuery.cs プロジェクト: ewin66/CSharp-Study
        /// <summary>
        /// 获取商品信息数据
        /// </summary>
        /// <param name="queryString"></param>
        /// <returns></returns>
        public List <Commodity> QueryIndex(string queryString)
        {
            IndexSearcher searcher = null;

            try
            {
                List <Commodity> ciList = new List <Commodity>();
                Directory        dir    = FSDirectory.Open(StaticConstant.IndexPath);
                searcher = new IndexSearcher(dir);
                Analyzer analyzer = new PanGuAnalyzer();

                //--------------------------------------这里配置搜索条件
                QueryParser parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_30, "title", analyzer);
                Query       query  = parser.Parse(queryString);
                Console.WriteLine(query.ToString()); //显示搜索表达式
                TopDocs docs = searcher.Search(query, (Filter)null, 10000);

                foreach (ScoreDoc sd in docs.ScoreDocs)
                {
                    Document doc = searcher.Doc(sd.Doc);
                    ciList.Add(DocumentToCommodityInfo(doc));
                }

                return(ciList);
            }
            finally
            {
                if (searcher != null)
                {
                    searcher.Dispose();
                }
            }
        }
コード例 #20
0
        private static IEnumerable <LuceneSearchModel> _search(string searchQuery, string[] searchFields)
        {
            // validation
            if (string.IsNullOrEmpty(searchQuery.Replace("*", "").Replace("?", "")))
            {
                return(new List <LuceneSearchModel>());
            }

            // set up lucene searcher
            using (var searcher = new IndexSearcher(_directory, false))
            {
                const int hitsLimit = 1000;
                var       analyzer  = new StandardAnalyzer(Version.LUCENE_30);


                var parser = new MultiFieldQueryParser
                                 (Version.LUCENE_30, searchFields, analyzer);
                Query      query = parseQuery(searchQuery, parser);
                ScoreDoc[] hits  = searcher.Search(query, null, hitsLimit, Sort.RELEVANCE).ScoreDocs;

                if (hits.Length == 0)
                {
                    searchQuery = searchByPartialWords(searchQuery);
                    query       = parseQuery(searchQuery, parser);
                    hits        = searcher.Search(query, hitsLimit).ScoreDocs;
                }

                IEnumerable <LuceneSearchModel> results = _mapLuceneToDataList(hits, searcher);
                analyzer.Close();
                searcher.Dispose();
                return(results);
            }
        }
コード例 #21
0
ファイル: LuceneSearch.cs プロジェクト: mausba/rssheap
        public List <Article> GetRelatedArticles(int articleId, int count)
        {
            var reader   = IndexReader.Open(_directory, true);
            var searcher = new IndexSearcher(_directory, true);

            var searchQuery = new TermQuery(new Term("Id", articleId.ToString()));
            var doc         = searcher.Search(searchQuery, 1);

            if (doc.TotalHits == 0)
            {
                return(new List <Article>());
            }

            var docId = doc.ScoreDocs[0].Doc;

            MoreLikeThis mlt = new MoreLikeThis(reader);

            mlt.SetFieldNames(new[] { "Name", "Body", "TagName", "FeedName" });
            Query query = mlt.Like(docId);
            var   hits  = searcher.Search(query, count + 1);

            var articles = ConvertToArticles(hits, searcher, 1, count).Where(a => a.Id != articleId);

            reader.Dispose();
            searcher.Dispose();
            return(articles.ToList());
        }
コード例 #22
0
        private void BooleanQuery_Click(object sender, EventArgs e)
        {
            textBox2.Text = " ";
            indexDir      = FSDirectory.Open(selectedPathToIndexDir);
            getQuerySubstrs();
            BooleanQuery booleanQuery = new BooleanQuery();

            foreach (var queryString in querySubstrs)
            {
                booleanQuery.Add(new TermQuery(new Term("text", queryString)), Occur.MUST);
            }
            IndexSearcher indexSearcher = new IndexSearcher(indexDir);
            TopDocs       results       = indexSearcher.Search(booleanQuery, null, Int32.MaxValue);

            foreach (var scoreDoc in results.ScoreDocs)
            {
                Document doc   = indexSearcher.Doc(scoreDoc.Doc);
                string   field = doc.Get("name");
                textBox2.Text += " " + field + "\r\n";
            }
            textBox2.Text += "Boolean Query Всего документов: " + results.ScoreDocs.Length + "\r\n";
            //showResults(indexSearcher, results);
            indexSearcher.Dispose();
            indexDir.Dispose();
        }
コード例 #23
0
        // search methods
        public static IEnumerable <SearchData> GetAllIndexRecords()
        {
            // validate search index
            if (!System.IO.Directory.EnumerateFiles(_luceneDir).Any())
            {
                return(new List <SearchData>());
            }

            // set up lucene searcher
            var searcher = new IndexSearcher(_directory, false);
            var reader   = IndexReader.Open(_directory, false);
            var docs     = new List <Document>();
            var term     = reader.TermDocs();

            // v 2.9.4: use 'term.Doc()'
            // v 3.0.3: use 'term.Doc'
            while (term.Next())
            {
                docs.Add(searcher.Doc(term.Doc));
            }

            reader.Dispose();
            searcher.Dispose();
            return(_mapLuceneToDataList(docs));
        }
コード例 #24
0
        private static void SearchIndex(string keyword, string title)
        {
            IndexSearcher searcher = new IndexSearcher(FSDirectory.Open(IndexDic), true);
            QueryParser   qp       = new QueryParser(Lucene.Net.Util.Version.LUCENE_30, "body", new JiebaAnalyzer());
            BooleanQuery  bq       = new BooleanQuery();

            //GetKeyWordsSplitBySpace分词空格连接 搜索结果更多联想功能。不使用时:body:"银河 大道 银河 星辰 花
            //。 使用后body:银河 body:大道 body:银河 body:星辰 body:花
            // keyword = GetKeyWordsSplitBySpace(keyword, new JiebaTokenizer(new JiebaSegmenter(), keyword));
            Query query = qp.Parse(keyword); //2008年底

            bq.Add(query, Occur.MUST);

            if (!string.IsNullOrEmpty(title))
            {
                TermQuery tq = new TermQuery(new Term("title", title));
                bq.Add(tq, Occur.MUST);
            }

            Sort           sort = new Sort(new SortField("body", SortField.SCORE, false));
            TopDocs        tds  = searcher.Search(bq, null, 10, sort);
            List <dynamic> list = new List <dynamic>();

            foreach (ScoreDoc sd in tds.ScoreDocs)
            {
                Console.WriteLine(sd.Score);
                Document doc = searcher.Doc(sd.Doc);
                list.Add(new { title = doc.Get("title"), body = doc.Get("body"), data = doc.Get("data") });
            }
            searcher.Dispose();
            Console.WriteLine(JsonConvert.SerializeObject(list));
        }
        private IEnumerable <string> Search(bool reverse)
        {
            var searcher = new IndexSearcher(_directory, true);

            Point littleMermaid = _ctx.MakePoint(12.599239, 55.692848);

            var sort = new Sort(new SortField(SpartialFieldName, new PointVectorDistanceFieldComparatorSource(littleMermaid, _strategy), reverse));

            var q = _strategy.MakeQuery(new SpatialArgs(SpatialOperation.IsWithin, _ctx.MakeCircle(littleMermaid.GetX(), littleMermaid.GetY(), DistanceUtils.Dist2Degrees(20000, DistanceUtils.EARTH_MEAN_RADIUS_KM))));

            TopDocs hits = searcher.Search(q, null, 100, sort);


            var result = new string[hits.ScoreDocs.Length];

            for (int i = 0; i < hits.ScoreDocs.Length; i++)
            {
                ScoreDoc match = hits.ScoreDocs[i];

                Document doc = searcher.Doc(match.Doc);
                result[i] = doc.Get(IdFieldName);
            }
            searcher.Dispose();

            return(result);
        }
コード例 #26
0
            public void Dispose()
            {
                lock (sync)
                {
                    disposePending = false;

                    if (disposed)
                    {
                        throw new ObjectDisposedException(GetType().Name);
                    }

                    RemoveDeadReferences();
                    if (searcherReferences.Count == 0)
                    {
                        lock (typeof(SearcherClientTracker))
                        {
                            undisposedTrackers.Remove(this);
                        }

                        searcher.Dispose();
                        disposed = true;
                    }
                    else
                    {
                        disposePending = true;
                    }
                }
            }
コード例 #27
0
 public void Dispose()
 {
     searcher.Dispose();
     writer.Dispose();
     directory.Dispose();
     analyzer = null;
 }
コード例 #28
0
        /// <summary>
        /// 分页查询
        /// </summary>
        /// <param name="strCondition">查询条件 lucene的查询语法</param>
        /// <param name="page">分页相关</param>
        /// <param name="strFilter">[100,3000]</param>
        /// <returns></returns>
        public List <T> QueryByPage(string strCondition, Page page, string strFilter)
        {
            IndexSearcher searcher = null;

            try
            {
                List <T> ciList = new List <T>();
                searcher = CreateSearcher();
                Analyzer analyzer = new PanGuAnalyzer();
                //--------------------------------------这里配置搜索条件
                QueryParser parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_30, "Title", analyzer);
                Query       query  = parser.Parse(strCondition);

                int startIndex = (page.PageIndex - 1) * page.PageSize;
                int endIndex   = page.PageIndex * page.PageSize;

                var property = Properties.Where(u => u.Name.Equals(page.Sort)).FirstOrDefault();

                Sort sort = null;
                if (!string.IsNullOrEmpty(page.Sort))
                {
                    //排序
                    sort = new Sort();
                    //找到该属性
                    SortField sortField = new SortField(page.Sort, SortField.DOUBLE, page.Order.Equals("asc", StringComparison.CurrentCultureIgnoreCase));
                    sort.SetSort(sortField);
                }
                Filter  filter = null;
                TopDocs docs   = null;
                if (sort != null && !string.IsNullOrEmpty(strFilter))
                {
                    Tuple <double, double> tuple = QueryTools.GetMinAndMax(strFilter);
                    if (tuple != null)
                    {
                        filter = QueryTools.GetNumberFilter(property, tuple.Item1, tuple.Item2);
                        docs   = searcher.Search(query, filter, 10000, sort);
                    }
                }
                else
                {
                    //filter = NumericRangeFilter.NewDoubleRange("Price", 100, 400, true, true);
                    docs = searcher.Search(query, filter, 1000);
                }

                //获取中标的数据
                page.Total = docs.TotalHits;

                //PrintScores(docs, startIndex, endIndex, searcher);
                for (int i = startIndex; i < endIndex && i < page.Total; i++)
                {
                    Document doc = searcher.Doc(docs.ScoreDocs[i].Doc);
                    ciList.Add(ParseDocToEntity(doc));
                }
                return(ciList);
            }
            finally
            {
                searcher?.Dispose();
            }
        }
コード例 #29
0
            public bool TryDispose()
            {
                lock (sync)
                {
                    disposePending = false;

                    if (disposed)
                    {
                        throw new ObjectDisposedException(GetType().Name);
                    }

                    RemoveDeadReferences();
                    if (searcherReferences.Count == 0)
                    {
                        lock (typeof(SearcherClientTracker))
                        {
                            undisposedTrackers.Remove(this);
                        }

                        var reader = searcher.IndexReader;
                        searcher.Dispose();
                        // NB IndexSearcher.Dispose() does not Dispose externally provided IndexReader:
                        reader.Dispose();

                        disposed = true;
                    }
                    else
                    {
                        disposePending = true;
                    }

                    return(disposed);
                }
            }
コード例 #30
0
        /// <summary>
        /// method to return the whole Lucene search index
        /// </summary>
        /// <returns></returns>
        public IEnumerable <LearningCourseDTO> GetAllIndexRecords()
        {
            // validate search index
            if (!System.IO.Directory.EnumerateFiles(_luceneDir).Any())
            {
                return(new List <LearningCourseDTO>());
            }

            // set up lucene searcher
            var searcher = new IndexSearcher(_directory, false);
            var reader   = IndexReader.Open(_directory, false);
            var docs     = new List <Document>();
            var term     = reader.TermDocs();

            while (term.Next())
            {
                docs.Add(searcher.Doc(term.Doc));
            }
            reader.Dispose();
            searcher.Dispose();

            var mapper = new LearningCourseMapper();

            return(mapper.MapLuceneToDataList(docs));
        }
コード例 #31
0
        /// <summary>
        ///     Searches the datasource using the specified criteria. Criteria is parsed by the query builder specified by
        ///     <typeparamref
        ///         name="QueryBuilderType" />
        ///     .
        /// </summary>
        /// <param name="scope">Name of the application.</param>
        /// <param name="criteria">The criteria.</param>
        /// <returns></returns>
        /// <exception cref="VirtoCommerce.Search.Providers.Lucene.LuceneSearchException"></exception>
        public virtual ISearchResults Search(string scope, ISearchCriteria criteria)
        {
            TopDocs docs = null;

            var folderName = this.GetFolderName(scope, criteria.DocumentType);

            var dir = FSDirectory.Open(new DirectoryInfo(this.GetDirectoryPath(folderName)));
            var searcher = new IndexSearcher(dir);

            var q = (Query)this.QueryBuilder.BuildQuery(criteria);

            Debug.WriteLine("Search Lucene Query:{0}", (object)q.ToString());

            try
            {
                var numDocs = criteria.StartingRecord + criteria.RecordsToRetrieve;

                if (criteria.Sort != null)
                {
                    var fields = criteria.Sort.GetSort();

                    docs = searcher.Search(
                        q,
                        null,
                        numDocs,
                        new Sort(
                            fields.Select(field => new SortField(field.FieldName, field.DataType, field.IsDescending))
                                  .ToArray()));
                }
                else
                {
                    docs = searcher.Search(q, numDocs);
                }
            }
            catch (Exception ex)
            {
                throw new LuceneSearchException("Search exception", ex);
            }

            var results = new LuceneSearchResults(searcher, searcher.IndexReader, docs, criteria, q);

            // Cleanup here
            searcher.IndexReader.Dispose();
            searcher.Dispose();
            return results.Results;
        }