public static void search(String indexDir, String q) { Directory dir = FSDriecotry.Open(new System.IO.FileInfo(indexDir)); IndexSearcher searcher = new IndexSearcher(dir, true); QueryParser parser = new QueryParser("contents", new StandardAnalyzer(Version.LUCENE_CURRENT)); Query query = parser.Parser(q); Lucene.Net.Saerch.TopDocs hits = searher.Search(query, 10); System.Console.WriteLine("Found " + hits.totalHits + " document(s) that matched query '" + q + "':"); for (int i = 0; i < hits.scoreDocs.Length; i++) { ScoreDoc scoreDoc = hits.ScoreDoc[i]; Document doc = searcher.Doc(scoreDoc.doc); System.Console.WriteLine(doc.Get("filename")); } searcher.Close(); }
public List <Article.Blog.Data.Models.Article> Search(string field, string keyword) { _QueryParser = new QueryParser(Lucene.Net.Util.Version.LUCENE_30, field, _Analyzer); _Query = _QueryParser.Parse(keyword); using (_IndexSearcher = new IndexSearcher(_Directory, true)) { var article = new List <Article.Blog.Data.Models.Article>(); var result = _IndexSearcher.Search(_Query, 10); foreach (var loopDoc in result.ScoreDocs.OrderBy(s => s.Score)) { _Document = _IndexSearcher.Doc(loopDoc.Doc); article.Add(new Article.Blog.Data.Models.Article() { Id = System.Convert.ToInt32(_Document.Get("Id")), Description = _Document.Get("Description") }); } return(article); } }
public Commentary GetForVerse(string commentatorCode, int chapterNumber, int verseNumber) { if (commentatorCode == null) { throw new ArgumentNullException(nameof(commentatorCode)); } IEnumerable <int> docIds = GetCommentaryIds( chapterNumber: chapterNumber, verseNumber: verseNumber, commentatorCode: commentatorCode) .Distinct(); IndexSearcher indexSearcher = IndexSearcherProvider.GetIndexSearcher(); return(docIds .Select(x => indexSearcher.Doc(x).GetObject <Commentary>()) .OrderBy(x => x.CommentatorCode) .ThenBy(x => x.ChapterNumber) .ThenBy(x => x.FirstVerseNumber) .SingleOrDefault()); }
private static List <string> searchOneWord_Lucene(string query, IndexSearcher searcher) { //Ищем по одному слову List <string> result_lucene = new List <string>(); var array = query.Split(' '); var phrase = new MultiPhraseQuery(); foreach (var word in array) { phrase = new MultiPhraseQuery(); if (!String.IsNullOrEmpty(word)) { phrase.Add(new Term("name_word", word)); var res = searcher.Search(phrase, 10).ScoreDocs; foreach (var hit in res) { var foundDoc = searcher.Doc(hit.Doc); result_lucene.Add(getFoundDocResult(foundDoc)); } } } return(result_lucene); }
//Find Repetition using numeric range query private void BasicFindRepByNumericRange(Directory directory) { var indexReader = DirectoryReader.Open(directory); var indexSearcher = new IndexSearcher(indexReader); Query query = NumericRangeQuery.NewInt32Range("Repetition", 1, 2, true, false); TopDocs topDocs = indexSearcher.Search(query, 10); Console.WriteLine("Total Hits: " + topDocs.TotalHits); Console.WriteLine("Results: "); foreach (var scoreDoc in topDocs.ScoreDocs) { Document d = indexSearcher.Doc(scoreDoc.Doc); Console.WriteLine("Book Id: " + d.Get("BookId")); } indexReader.Dispose(); }
public static IEnumerable <Artifact> getAllIndexRecords() { if (!System.IO.Directory.EnumerateFiles(_luceneDir).Any()) { return(new List <Artifact>()); } //search 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(); return(_mapLuceneToDataList(docs)); }
public IEnumerable <TEntity> GetAllIndexRecords() { // validate search index if (!System.IO.Directory.EnumerateFiles(_luceneDir).Any()) { return(new List <TEntity>()); } // 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 3.0.3: use 'hit.Doc' while (term.Next()) { docs.Add(searcher.Doc(term.Doc)); } reader.Dispose(); searcher.Dispose(); return(_mapLuceneToDataList(docs)); }
public IEnumerable <LuceneSynonymData> GetAllIndexRecords() { // validate search index if (!System.IO.Directory.EnumerateFiles(_luceneDir).Any()) { yield break; } // set up lucene searcher using (var searcher = new IndexSearcher(_directory, false)) { using (var reader = IndexReader.Open(_directory, false)) { var docs = new List <Document>(); var term = reader.TermDocs(); // v 2.9.4: use 'hit.Doc()' // v 3.0.3: use 'hit.Doc' while (term.Next()) { yield return(MapToSynonymData(searcher.Doc(term.Doc))); } } } }
/// <summary> /// 获取商品信息数据 /// </summary> /// <param name="query"></param> /// <param name="fieldModelList"></param> /// <param name="listCount"></param> /// <returns></returns> public List <T> QueryIndex(Query query, IEnumerable <FieldDataModel> fieldModelList, int listCount) { List <T> modelList = null; IndexSearcher searcher = null; try { modelList = new List <T>(); Directory dir = FSDirectory.Open(StaticConstant.IndexPath); searcher = new IndexSearcher(dir); TopDocs docs = searcher.Search(query, listCount); foreach (ScoreDoc sd in docs.ScoreDocs) { Document doc = searcher.Doc(sd.Doc); modelList.Add(DocumentToTInfo(doc, fieldModelList)); } } finally { searcher?.Dispose(); } return(modelList); }
public Pagination Paginate(int pageIndex, int pageSize) { Sort sort = null; if (_sortFields != null && _sortFields.Count > 0) { sort = new Sort(_sortFields.ToArray()); } TopDocs docs; if (sort == null) { docs = _searcher.Search(_nativeQuery, null, Int32.MaxValue); } else { docs = _searcher.Search(_nativeQuery, null, Int32.MaxValue, sort); } var items = new List <object>(); var start = pageIndex * pageSize; var bound = start + pageSize; if (bound > docs.TotalHits) { bound = docs.TotalHits; } for (var i = start; i < bound; i++) { var doc = docs.ScoreDocs[i]; items.Add(ModelConverter.ToModel(_searcher.Doc(doc.Doc), ModelType)); } return(new Pagination(items, pageIndex, pageSize, docs.TotalHits)); }
public IDictionary <string, ISet <int> > GetDocumentsWithMatches(string term) { var result = new Dictionary <string, ISet <int> >(); var indexWriter = GetIndexWriter(); var reader = indexWriter.GetReader(true); TermQuery query = new TermQuery(new Term(IndexFieldNames.Text, term)); BooleanQuery theQuery = new BooleanQuery(); theQuery.Add(query, Occur.SHOULD); IndexSearcher searcher = new IndexSearcher(reader); var searchResults = searcher.Search(query, 10); var matches = new HashSet <int>(); foreach (var docId in searchResults.ScoreDocs) { Lucene.Net.Documents.Document doc = searcher.Doc(docId.Doc); //result.AddOccurence(docId.Doc, doc.Get(IndexFieldNames.File), reader.GetTermVector(docId.Doc, IndexFieldNames.Text)); var documentName = doc.Get(IndexFieldNames.File); if (result.ContainsKey(documentName)) { result[documentName].Add(docId.Doc); } else { result.Add(documentName, new HashSet <int>() { docId.Doc }); } } reader.Dispose(); indexWriter.Dispose(); return(result); }
private List <SearchResult> GetResults(string searchText) { Microsoft.WindowsAzure.Storage.CloudStorageAccount storageAccount = Microsoft.WindowsAzure.Storage.CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;AccountName=diningsearchstorage;AccountKey=xeYMzXThFxrU7SsAMGbSWLdy9psLFRMk5NI8x0bx24xtEg9MPIstf/xwPdjvDm6HpHZaCPxxVFCv/7DDd5wymA=="); AzureDirectory azureDirectory = new AzureDirectory(storageAccount, "diningsearchindex"); IndexReader indexReader = IndexReader.Open(azureDirectory, true); Searcher indexSearch = new IndexSearcher(indexReader); Analyzer analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30); var queryParser = new QueryParser(Lucene.Net.Util.Version.LUCENE_30, "Dish", analyzer); var query = queryParser.Parse(searchText); Console.WriteLine("Searching for: " + query.ToString()); TopDocs resultDocs = indexSearch.Search(query, 100); Console.WriteLine("Results Found: " + resultDocs.TotalHits); List <SearchResult> searchResults = new List <SearchResult>(); var hits = resultDocs.ScoreDocs; foreach (var hit in hits) { Document documentFromSearcher = indexSearch.Doc(hit.Doc); SearchResult result = new SearchResult { CafeName = documentFromSearcher.Get("Cafe/Restaurant"), CafeUrl = documentFromSearcher.Get("URL"), DishName = documentFromSearcher.Get("Dish"), Price = documentFromSearcher.Get("Price"), Description = documentFromSearcher.Get("Description") }; searchResults.Add(result); } return(searchResults); }
public DataTable Query(string keyword) { if (!((_Directory as dynamic).Directory as System.IO.DirectoryInfo).Exists) { return(null); } if (_Directory.ListAll().Length == 0) { return(null); } _IndexReader = IndexReader.Open(_Directory, true); _QueryParser = new MultiFieldQueryParser(Lucene.Net.Util.Version.LUCENE_30, _IndexReader.GetFieldNames(IndexReader.FieldOption.ALL).ToArray(), _Analyzer); _Query = _QueryParser.Parse(keyword); var docList = new List <Document>(); using (_IndexSearcher = new IndexSearcher(_Directory, true)) { var searchResult = _IndexSearcher.Search(_Query, 10); foreach (var loopDoc in searchResult.ScoreDocs.OrderBy(s => s.Score)) { var doc = _IndexSearcher.Doc(loopDoc.Doc); docList.Add(doc); } } var result = DocumentToTable(docList); return(result); }
private static IList <SearchResult> RetrieveSearchResults(IndexSearcher indexSearcher, TopDocs hits) { //iterate over the results. var results = hits.ScoreDocs.AsQueryable() .OrderByDescending(hit => hit.Score) .ToList() .Select(hit => { var jsonDocumentField = indexSearcher.Doc(hit.Doc).GetField(Constants.JsonDocumentFieldName); var fieldDoc = (hit as FieldDoc); if (fieldDoc != null && Double.IsNaN(hit.Score) && fieldDoc.fields.Length > 0 && fieldDoc.fields[0] is float) { hit.Score = (float)fieldDoc.fields[0]; //TODO: is this really true? } if (jsonDocumentField == null) { return new SearchResult { Score = hit.Score, LuceneDocId = hit.Doc, Document = null } } ; return(new SearchResult { Score = hit.Score, LuceneDocId = hit.Doc, Document = JsonConvert.DeserializeObject <JsonDocumentDto>(jsonDocumentField.StringValue) }); }) .ToList(); return(results); }
public IList <SearchDocument> Search(IList <Filter> searchFilters, IList <SearchSortField> sortFields) { if (searchFilters == null || searchFilters.Count == 0) { return(new List <SearchDocument>()); } var sort = CreateSort(searchFilters, sortFields); var reader = IndexReader.Open(_directory, true); var searcher = new IndexSearcher(reader); var query = CreateQuery(searchFilters); var hits = searcher.Search(query, new QueryWrapperFilter(query), 100, sort); var searchResult = new List <SearchDocument>(); foreach (var facet in hits.ScoreDocs) { var doc = searcher.Doc(facet.Doc); var searchDoc = new SearchDocument { Fields = new List <SearchDocumentField>() }; var docFields = doc.GetFields(); foreach (var field in docFields) { var value = doc.Get(field.Name); searchDoc.Fields.Add(new SearchDocumentField { FieldName = field.Name, Value = value }); } searchResult.Add(searchDoc); } return(searchResult); }
public static IList <T> Search <T>(string fieldName, string searchText, int pageSize) where T : class, new() { IList <T> result = new List <T>(); var props = typeof(T).GetProperties(); using (IndexReader reader = IndexReader.Open(directory, true)) using (IndexSearcher searcher = new IndexSearcher(reader)) { using (Analyzer analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30)) { QueryParser parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_30, fieldName, analyzer); // support `*xxx` parser.AllowLeadingWildcard = true; Query query = parser.Parse(searchText); ScoreDoc[] scoreDocs = searcher.Search(query, pageSize).ScoreDocs; foreach (var score in scoreDocs) { Document doc = searcher.Doc(score.Doc); T t = new T(); foreach (var prop in props) { var value = Convert.ChangeType(doc.Get(prop.Name), prop.PropertyType); prop.SetValue(t, value); } result.Add(t); } } } directory.Dispose(); return(result); }
public static List <Post> getPitanjaPretrage(string recenica) { if (recenica != "") { Directory directoryPronadjenaPitanja = Data.Lucene.Indexing.GetDirectoryPitanja(); Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30); IndexReader indexReader = IndexReader.Open(directoryPronadjenaPitanja, true); Searcher searcher = new IndexSearcher(indexReader); //var queryParser = new QueryParser(Version.LUCENE_30, "Naslov", analyzer); var queryParser = new MultiFieldQueryParser(Version.LUCENE_30, new[] { "Naslov", "Sadrzaj", "Tagovi" }, analyzer); var query = queryParser.Parse(recenica.Trim()); // Rastavljanje rečenice na rijeci TopDocs pronadjeno = searcher.Search(query, indexReader.MaxDoc); List <Post> pitanja = new List <Post>(); var hits = pronadjeno.ScoreDocs; foreach (var hit in hits) { var documentFromSearcher = searcher.Doc(hit.Doc); using (TriglavBL temp = new TriglavBL()) { pitanja.Add(temp.getPitanjeByID(Convert.ToInt32(documentFromSearcher.Get("id")))); } } searcher.Dispose(); directoryPronadjenaPitanja.Dispose(); return(pitanja); } else { return(null); } }
public static List <Product> Search(string criterion, string term) { List <Product> products = new List <Product>(); try { Directory directory = FSDirectory.Open(new DirectoryInfo(indexPath)); Analyzer analyzer = new StandardAnalyzer(Util.Version.LUCENE_30); IndexReader indexReader = IndexReader.Open(directory, true); Searcher searcher = new IndexSearcher(indexReader); var queryParser = new QueryParser(Util.Version.LUCENE_30, criterion, analyzer); var query = queryParser.Parse(term); TopDocs resultDocs = searcher.Search(query, indexReader.MaxDoc); var topDocs = resultDocs.ScoreDocs; foreach (var hit in topDocs) { var documentFromSearch = searcher.Doc(hit.Doc); products.Add(new Product { ProductID = Convert.ToInt32(documentFromSearch.Get("ProductID")), Name = documentFromSearch.Get("Name"), Detail = documentFromSearch.Get("Detail"), Price = Convert.ToDecimal(documentFromSearch.Get("Price")) }); } return(products); } catch (Exception ex) { return(products); } }
public List <Product> SearchAllField(string keyword) { var type = typeof(Product); var properties = (from u in type.GetProperties() select u.Name).ToArray(); _QueryParser = new MultiFieldQueryParser( Lucene.Net.Util.Version.LUCENE_30, properties, new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30)); _Query = _QueryParser.Parse(keyword); using (_IndexSearcher = new IndexSearcher(_Directory, true)) { List <Product> products = new List <Product>(); var result = _IndexSearcher.Search(_Query, 10); foreach (var loopDoc in result.ScoreDocs.OrderBy(s => s.Score)) { _Document = _IndexSearcher.Doc(loopDoc.Doc); products.Add(new Product() { Id = System.Convert.ToInt32(_Document.Get("Id")), Name = _Document.Get("Name"), Description = _Document.Get("Description") }); } return(products); } }
public void TestGiga() { Directory index = NewDirectory(); RandomIndexWriter w = new RandomIndexWriter(Random(), index, Similarity, TimeZone); addDoc("Lucene in Action", w); addDoc("Lucene for Dummies", w); //addDoc("Giga", w); addDoc("Giga byte", w); addDoc("ManagingGigabytesManagingGigabyte", w); addDoc("ManagingGigabytesManagingGigabytes", w); addDoc("The Art of Computer Science", w); addDoc("J. K. Rowling", w); addDoc("JK Rowling", w); addDoc("Joanne K Roling", w); addDoc("Bruce Willis", w); addDoc("Willis bruce", w); addDoc("Brute willis", w); addDoc("B. willis", w); IndexReader r = w.Reader; w.Dispose(); Query q = new SlowFuzzyQuery(new Term("field", "giga"), 0.9f); // 3. search IndexSearcher searcher = NewSearcher(r); ScoreDoc[] hits = searcher.Search(q, 10).ScoreDocs; assertEquals(1, hits.Length); assertEquals("Giga byte", searcher.Doc(hits[0].Doc).Get("field")); r.Dispose(); index.Dispose(); }
private void button4_Click(object sender, EventArgs e) { string indexPath = "lucenedir"; string kw = "奥运会";//对用户输入的搜索条件进行拆分。 FSDirectory directory = FSDirectory.Open(new DirectoryInfo(indexPath), new NoLockFactory()); IndexReader reader = IndexReader.Open(directory, true); IndexSearcher searcher = new IndexSearcher(reader); //搜索条件 PhraseQuery query = new PhraseQuery(); //foreach (string word in kw.Split(' '))//先用空格,让用户去分词,空格分隔的就是词“计算机 专业” //{ // query.Add(new Term("body", word)); //} //query.Add(new Term("body","语言"));--可以添加查询条件,两者是add关系.顺序没有关系. // query.Add(new Term("body", "大学生")); query.Add(new Term("body", kw)); //body中含有kw的文章 query.Slop = 100; //多个查询条件的词之间的最大距离.在文章中相隔太远 也就无意义.(例如 “大学生”这个查询条件和"简历"这个查询条件之间如果间隔的词太多也就没有意义了。) //TopScoreDocCollector是盛放查询结果的容器 TopScoreDocCollector collector = TopScoreDocCollector.Create(1000, true); searcher.Search(query, null, collector); //根据query查询条件进行查询,查询结果放入collector容器 ScoreDoc[] docs = collector.TopDocs(0, collector.TotalHits).ScoreDocs; //得到所有查询结果中的文档,GetTotalHits():表示总条数 TopDocs(300, 20);//表示得到300(从300开始),到320(结束)的文档内容. //可以用来实现分页功能 this.listBox1.Items.Clear(); for (int i = 0; i < docs.Length; i++) { // //搜索ScoreDoc[]只能获得文档的id,这样不会把查询结果的Document一次性加载到内存中。降低了内存压力,需要获得文档的详细内容的时候通过searcher.Doc来根据文档id来获得文档的详细内容对象Document. int docId = docs[i].Doc; //得到查询结果文档的id(Lucene内部分配的id) Document doc = searcher.Doc(docId); //找到文档id对应的文档详细信息 this.listBox1.Items.Add(doc.Get("number") + "\n"); // 取出放进字段的值 this.listBox1.Items.Add(doc.Get("body") + "\n"); Console.WriteLine(doc.Get("body")); this.listBox1.Items.Add("-----------------------\n"); } }
/// <summary> /// Gets all records in index. Performance will be impacted by /// </summary> /// <returns></returns> public static IEnumerable <LuceneData> GetAllIndexRecords() { // validating search index if (!System.IO.Directory.EnumerateFiles(LuceneDirectory).Any()) { return(new List <LuceneData>()); } // setting up Lucene searcher var searcher = new IndexSearcher(Directory, false); var reader = IndexReader.Open(Directory, false); var docs = new List <Document>(); var term = reader.TermDocs(); // adding docs to list while (term.Next()) { docs.Add(searcher.Doc(term.Doc)); } // disposing of handlers reader.Dispose(); searcher.Dispose(); // mapping Lucene doc list to data list return(MapLuceneToDataList(docs)); }
public IEnumerable <int> Search(string keywords) { var dir = FSDirectory.Open(_config.IndexPath); using (var reader = DirectoryReader.Open(dir)) { var searcher = new IndexSearcher(reader); var query = new RevisionDefinition.QueryBuilder() .WithKeywords(keywords); var result = searcher.Search(query.Query, 25); //todo: paging var hits = result.ScoreDocs; var docs = hits .Select(d => searcher.Doc(d.Doc)) .ToArray(); return(docs .Select(d => int.Parse(d.Get(query.IndexFieldId))) .ToArray()); } }
/// <summary> /// 搜索日志 /// </summary> /// <param name="project"></param> /// <param name="str"></param> /// <returns></returns> public static List <String> SearchData(String project, String str, DateTime dt) { if (String.IsNullOrWhiteSpace(str)) { return(null); } String path = LoggerModel.Getpath(project, dt); if (!File.Exists(Path.Combine(path, "write.lock"))) { return(null); } List <String> list = new List <String>(); try { IndexSearcher searcher = GetSearcher(project, dt); bool InOrder = true; ScoreDoc[] scoreDoc = SearchTime(searcher, str, "Content", 10, InOrder); foreach (var docs in scoreDoc) { Document doc = searcher.Doc(docs.Doc); String result = doc.Get("Content"); if (!String.IsNullOrWhiteSpace(result)) { list.Add(result); } } searcher.Dispose(); } catch (Exception e) { LogHelper.Critical("日志查询报错" + e.Message); } return(list); }
public static IEnumerable <PostModel> GetAllIndexRecords() { // validate search index if (!System.IO.Directory.EnumerateFiles(luceneDirectory).Any()) { return(new List <PostModel>()); } // 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(); return(MapLuceneToDataList(docs)); }
public static List <Post> getPitanjaByTag(int TAGID) { Directory directoryPronadjenaPitanjaTagovi = Data.Lucene.Indexing.GetDirectoryPitanjaTagovi(); Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30); IndexReader indexReader = IndexReader.Open(directoryPronadjenaPitanjaTagovi, true); Searcher searcher = new IndexSearcher(indexReader); //var queryParser = new QueryParser(Version.LUCENE_30, "Naslov", analyzer); var queryParser = new MultiFieldQueryParser(Version.LUCENE_30, new[] { "PostID", "TagID", "DatumKreiranja" }, analyzer); var query = queryParser.Parse(Convert.ToString(TAGID)); // Rastavljanje rečenice na rijeci TopDocs pronadjeno = searcher.Search(query, indexReader.MaxDoc); List <Post> PitanjaTagovi = new List <Post>(); if (pronadjeno != null) { var hits = pronadjeno.ScoreDocs; foreach (var hit in hits) { var documentFromSearcher = searcher.Doc(hit.Doc); using (TriglavBL temp = new TriglavBL()) { PitanjaTagovi.Add(temp.getPitanjeByID(Convert.ToInt32(documentFromSearcher.Get("PostID")))); } } searcher.Dispose(); directoryPronadjenaPitanjaTagovi.Dispose(); return(PitanjaTagovi); } else { searcher.Dispose(); directoryPronadjenaPitanjaTagovi.Dispose(); return(PitanjaTagovi); } }
private SearchResults CompileResults(IndexSearcher searcher, TopDocs topdDocs) { SearchResults searchResults = new SearchResults() { TotalHits = topdDocs.TotalHits }; foreach (var result in topdDocs.ScoreDocs) { Document document = searcher.Doc(result.Doc); Hit searchResult = new Hit { Rating = document.GetField("rating")?.GetStringValue(), MovieId = document.GetField("movieid")?.GetStringValue(), Score = result.Score, Title = document.GetField("title")?.GetStringValue(), Snippet = document.GetField("snippet")?.GetStringValue() }; searchResults.Hits.Add(searchResult); } return(searchResults); }
// search methods public static IEnumerable <LuceneSearchModel> GetAllIndexRecords() { // validate search index if (!System.IO.Directory.EnumerateFiles(_luceneDir).Any()) { return(new List <LuceneSearchModel>()); } // set up lucene searcher var searcher = new IndexSearcher(_directory, false); var reader = IndexReader.Open(_directory, false); searcher.SetDefaultFieldSortScoring(true, true); var docs = new List <Document>(); var term = reader.TermDocs(); while (term.Next()) { docs.Add(searcher.Doc(term.Doc)); } reader.Dispose(); searcher.Dispose(); return(_mapLuceneToDataList(docs)); }
static void Main(string[] args) { RAMDirectory dir = new RAMDirectory(); IndexWriter writer = new IndexWriter(dir, new StandardAnalyzer()); AddDocument(writer, "John Doe", "NY"); AddDocument(writer, "John Foo", "New Jersey"); AddDocument(writer, "XYZ", "NY"); writer.Commit(); BooleanQuery query = new BooleanQuery(); query.Add(new TermQuery(new Term("Name", "john")), BooleanClause.Occur.SHOULD); query.Add(new TermQuery(new Term("Location", "NY")), BooleanClause.Occur.SHOULD); IndexReader reader = writer.GetReader(); IndexSearcher searcher = new IndexSearcher(reader); var hits = searcher.Search(query, null, 10); for (int i = 0; i < hits.totalHits; i++) { Document doc = searcher.Doc(hits.scoreDocs[i].doc); var explain = searcher.Explain(query, hits.scoreDocs[i].doc); Console.WriteLine("{0} - {1} - {2}", hits.scoreDocs[i].score, doc.ToString(), explain.ToString()); } }
public static JToken AutoCompleteMakeResult(IndexSearcher searcher, TopDocs topDocs, int skip, int take, NuGetSearcherManager searcherManager, bool includeExplanation, Query query) { JArray array = new JArray(); for (int i = skip; i < Math.Min(skip + take, topDocs.ScoreDocs.Length); i++) { ScoreDoc scoreDoc = topDocs.ScoreDocs[i]; Document document = searcher.Doc(scoreDoc.Doc); string id = document.Get("Id"); array.Add(id); } JObject result = new JObject(); result.Add("@context", new JObject { { "@vocab", "http://schema.nuget.org/schema#" } }); result.Add("totalHits", topDocs.TotalHits); result.Add("indexName", searcherManager.IndexName); result.Add("data", array); if (includeExplanation) { JArray explanations = new JArray(); for (int i = skip; i < Math.Min(skip + take, topDocs.ScoreDocs.Length); i++) { ScoreDoc scoreDoc = topDocs.ScoreDocs[i]; Explanation explanation = searcher.Explain(query, scoreDoc.Doc); explanations.Add(explanation.ToString()); } result.Add("explanations", explanations); } return(result); }
public List <string> SearchAndDisplayResults(string querytext) { querytext = querytext.ToLower(); Query query = parser.Parse(querytext); TopDocs results = searcher.Search(query, 100); int rank = 0; List <string> rankResult = new List <string>(); foreach (ScoreDoc scoreDoc in results.ScoreDocs) { rank++; Lucene.Net.Documents.Document doc = searcher.Doc(scoreDoc.Doc); string myFieldValue = doc.Get(TEXT_FN).ToString(); rankResult.Add("Rank " + rank + " title " + myFieldValue); //string titleValue = doc.Get(TITLE_FN).ToString(); //string authorValue = doc.Get(AUTHOR_FN).ToString(); //Console.WriteLine("Rank " + rank + " title " + titleValue + " author " + authorValue); //rankResult.Add("Rank " + rank + " title " + titleValue + " author " + authorValue); } return(rankResult); }
private static void GenerateHighlights(IList<Document> documents, IndexWriter writer, SearchCriteria criteria) { var documentHightlightMap = documents.ToDictionary(c => c._id.ToString()); var reader = DirectoryReader.Open(writer, true, true); var queryParser = new HighlighterQueryParser(writer.GetAnalyzer()); queryParser.SetMultiTermRewriteMethod(MultiTermQuery.SCORING_BOOLEAN_REWRITE); var query = queryParser.Parse(criteria.Query) .Rewrite(reader); var highlighter = CreateHighlighter(); var fieldQuery = highlighter.GetFieldQuery(query); var searcher = new IndexSearcher(reader); var topFieldDocs = searcher.Search(query, documents.Count, Sort.RELEVANCE); var scoreDocs = topFieldDocs.ScoreDocs; foreach (var sd in scoreDocs) { var bestFragments = highlighter.GetBestFragments(fieldQuery, reader, sd.Doc, Schema.StandardField.FULL_TEXT, FRAGMENT_SIZE, FRAGMENT_COUNT); var document = searcher.Doc(sd.Doc); var docId = document.Get(Schema.StandardField.ID); if (documentHightlightMap.ContainsKey(docId) && bestFragments.Length > 0) { var dictionary = documentHightlightMap[docId].AsDictionary(); var highlight = String.Join($"{Environment.NewLine} ... {Environment.NewLine}", bestFragments); dictionary[HIGHLIGHT_FIELD_NAME] = highlight; } } }
private void SearchIndex() { String q = "t_text1:random"; QueryParser parser = new QueryParser(TEST_VERSION, "t_text1", a); Query query = parser.Parse(q); IndexSearcher searcher = new IndexSearcher(dir, true); // This scorer can return negative idf -> null fragment IScorer scorer = new QueryTermScorer(query, searcher.IndexReader, "t_text1"); // This scorer doesn't use idf (patch version) //Scorer scorer = new QueryTermScorer( query, "t_text1" ); Highlighter h = new Highlighter(scorer); TopDocs hits = searcher.Search(query, null, 10); for (int i = 0; i < hits.TotalHits; i++) { Document doc = searcher.Doc(hits.ScoreDocs[i].Doc); String result = h.GetBestFragment(a, "t_text1", doc.Get("t_text1")); Console.WriteLine("result:" + result); Assert.AreEqual(result, "more <B>random</B> words for second field"); } searcher.Close(); }
public void TestQueryScorerHits() { Analyzer analyzer = new SimpleAnalyzer(); QueryParser qp = new QueryParser(TEST_VERSION, FIELD_NAME, analyzer); query = qp.Parse("\"very long\""); searcher = new IndexSearcher(ramDir, true); TopDocs hits = searcher.Search(query, 10); QueryScorer scorer = new QueryScorer(query, FIELD_NAME); Highlighter highlighter = new Highlighter(scorer); for (int i = 0; i < hits.ScoreDocs.Length; i++) { Document doc = searcher.Doc(hits.ScoreDocs[i].Doc); String storedField = doc.Get(FIELD_NAME); TokenStream stream = TokenSources.GetAnyTokenStream(searcher.IndexReader, hits.ScoreDocs[i].Doc, FIELD_NAME, doc, analyzer); IFragmenter fragmenter = new SimpleSpanFragmenter(scorer); highlighter.TextFragmenter = fragmenter; String fragment = highlighter.GetBestFragment(stream, storedField); Console.WriteLine(fragment); } }
public void TestNumericRangeQuery() { // doesn't currently highlight, but make sure it doesn't cause exception either query = NumericRangeQuery.NewIntRange(NUMERIC_FIELD_NAME, 2, 6, true, true); searcher = new IndexSearcher(ramDir, true); hits = searcher.Search(query, 100); int maxNumFragmentsRequired = 2; QueryScorer scorer = new QueryScorer(query, FIELD_NAME); Highlighter highlighter = new Highlighter(this, scorer); for (int i = 0; i < hits.TotalHits; i++) { String text = searcher.Doc(hits.ScoreDocs[i].Doc).Get(NUMERIC_FIELD_NAME); TokenStream tokenStream = analyzer.TokenStream(FIELD_NAME, new StringReader(text)); highlighter.TextFragmenter = new SimpleFragmenter(40); String result = highlighter.GetBestFragments(tokenStream, text, maxNumFragmentsRequired, "..."); //Console.WriteLine("\t" + result); } }
public void DoStandardHighlights(Analyzer analyzer, IndexSearcher searcher, TopDocs hits, Query query, IFormatter formatter, bool expandMT) { IFragmenter frag = new SimpleFragmenter(20); for (int i = 0; i < hits.TotalHits; i++) { String text = searcher.Doc(hits.ScoreDocs[i].Doc).Get(HighlighterTest.FIELD_NAME); int maxNumFragmentsRequired = 2; String fragmentSeparator = "..."; IScorer scorer = null; TokenStream tokenStream = analyzer.TokenStream(HighlighterTest.FIELD_NAME, new StringReader(text)); if (Mode == QUERY) { scorer = new QueryScorer(query); } else if (Mode == QUERY_TERM) { scorer = new QueryTermScorer(query); } var highlighter = new Highlighter(formatter, scorer) {TextFragmenter = frag}; String result = highlighter.GetBestFragments(tokenStream, text, maxNumFragmentsRequired, fragmentSeparator); Console.WriteLine("\t" + result); } }
public void TestUnRewrittenQuery() { var helper = new TestHighlightRunner(); helper.TestAction = () => { numHighlights = 0; // test to show how rewritten query can still be used searcher = new IndexSearcher(ramDir, true); Analyzer analyzer = new StandardAnalyzer(TEST_VERSION); QueryParser parser = new QueryParser(TEST_VERSION, FIELD_NAME, analyzer); Query query = parser.Parse("JF? or Kenned*"); Console.WriteLine("Searching with primitive query"); // forget to set this and... // query=query.Rewrite(reader); TopDocs hits = searcher.Search(query, null, 1000); // create an instance of the highlighter with the tags used to surround // highlighted text // QueryHighlightExtractor highlighter = new // QueryHighlightExtractor(this, // query, new StandardAnalyzer(TEST_VERSION)); int maxNumFragmentsRequired = 3; for (int i = 0; i < hits.TotalHits; i++) { String text = searcher.Doc(hits.ScoreDocs[i].Doc).Get(FIELD_NAME); TokenStream tokenStream = analyzer.TokenStream(FIELD_NAME, new StringReader(text)); Highlighter highlighter = helper.GetHighlighter(query, FIELD_NAME, tokenStream, this, false); highlighter.TextFragmenter = new SimpleFragmenter(40); String highlightedText = highlighter.GetBestFragments(tokenStream, text, maxNumFragmentsRequired, "..."); Console.WriteLine(highlightedText); } // We expect to have zero highlights if the query is multi-terms and is // not // rewritten! Assert.IsTrue(numHighlights == 0, "Failed to find correct number of highlights " + numHighlights + " found"); }; helper.Start(); }
public void TestConstantScoreMultiTermQuery() { numHighlights = 0; query = new WildcardQuery(new Term(FIELD_NAME, "ken*")); ((WildcardQuery) query).RewriteMethod = MultiTermQuery.CONSTANT_SCORE_FILTER_REWRITE; searcher = new IndexSearcher(ramDir, true); // can't rewrite ConstantScore if you want to highlight it - // it rewrites to ConstantScoreQuery which cannot be highlighted // query = unReWrittenQuery.Rewrite(reader); Console.WriteLine("Searching for: " + query.ToString(FIELD_NAME)); hits = searcher.Search(query, null, 1000); for (int i = 0; i < hits.TotalHits; i++) { String text = searcher.Doc(hits.ScoreDocs[i].Doc).Get(HighlighterTest.FIELD_NAME); int maxNumFragmentsRequired = 2; String fragmentSeparator = "..."; QueryScorer scorer = null; TokenStream tokenStream = null; tokenStream = analyzer.TokenStream(FIELD_NAME, new StringReader(text)); scorer = new QueryScorer(query, FIELD_NAME); Highlighter highlighter = new Highlighter(this, scorer); highlighter.TextFragmenter = new SimpleFragmenter(20); String result = highlighter.GetBestFragments(tokenStream, text, maxNumFragmentsRequired, fragmentSeparator); Console.WriteLine("\t" + result); } Assert.IsTrue(numHighlights == 5, "Failed to find correct number of highlights " + numHighlights + " found"); // try null field hits = searcher.Search(query, null, 1000); numHighlights = 0; for (int i = 0; i < hits.TotalHits; i++) { String text = searcher.Doc(hits.ScoreDocs[i].Doc).Get(HighlighterTest.FIELD_NAME); int maxNumFragmentsRequired = 2; String fragmentSeparator = "..."; QueryScorer scorer = null; TokenStream tokenStream = null; tokenStream = analyzer.TokenStream(HighlighterTest.FIELD_NAME, new StringReader(text)); scorer = new QueryScorer(query, null); Highlighter highlighter = new Highlighter(this, scorer); highlighter.TextFragmenter = new SimpleFragmenter(20); String result = highlighter.GetBestFragments(tokenStream, text, maxNumFragmentsRequired, fragmentSeparator); Console.WriteLine("\t" + result); } Assert.IsTrue(numHighlights == 5, "Failed to find correct number of highlights " + numHighlights + " found"); // try default field hits = searcher.Search(query, null, 1000); numHighlights = 0; for (int i = 0; i < hits.TotalHits; i++) { String text = searcher.Doc(hits.ScoreDocs[i].Doc).Get(HighlighterTest.FIELD_NAME); int maxNumFragmentsRequired = 2; String fragmentSeparator = "..."; QueryScorer scorer = null; TokenStream tokenStream = null; tokenStream = analyzer.TokenStream(HighlighterTest.FIELD_NAME, new StringReader(text)); scorer = new QueryScorer(query, "random_field", HighlighterTest.FIELD_NAME); Highlighter highlighter = new Highlighter(this, scorer); highlighter.TextFragmenter = new SimpleFragmenter(20); String result = highlighter.GetBestFragments(tokenStream, text, maxNumFragmentsRequired, fragmentSeparator); Console.WriteLine("\t" + result); } Assert.IsTrue(numHighlights == 5, "Failed to find correct number of highlights " + numHighlights + " found"); }
// Make sure the documents returned by the search match the expected list // Copied from TestSort.java private void AssertMatches(IndexSearcher searcher, Query query, Sort sort, string expectedResult) { ScoreDoc[] result = searcher.Search(query, null, 1000, sort).ScoreDocs; StringBuilder buff = new StringBuilder(10); int n = result.Length; for (int i = 0; i < n; ++i) { Document doc = searcher.Doc(result[i].Doc); IndexableField[] v = doc.GetFields("tracer"); for (int j = 0; j < v.Length; ++j) { buff.Append(v[j].StringValue); } } Assert.AreEqual(expectedResult, buff.ToString()); }
public void TestRegexQuery() { const int maxNumFragmentsRequired = 2; query = new RegexQuery(new Term(FIELD_NAME, "ken.*")); searcher = new IndexSearcher(ramDir, true); hits = searcher.Search(query, 100); var scorer = new QueryScorer(query, FIELD_NAME); var highlighter = new Highlighter(this, scorer); for (int i = 0; i < hits.TotalHits; i++) { String text = searcher.Doc(hits.ScoreDocs[i].Doc).Get(FIELD_NAME); TokenStream tokenStream = analyzer.TokenStream(FIELD_NAME, new StringReader(text)); highlighter.TextFragmenter = new SimpleFragmenter(40); String result = highlighter.GetBestFragments(tokenStream, text, maxNumFragmentsRequired, "..."); Console.WriteLine("\t" + result); } Assert.IsTrue(numHighlights == 5, "Failed to find correct number of highlights " + numHighlights + " found"); }