2017-05-10 3 views
1
List<SearchResults> Searchresults = new List<SearchResults>(); 

    // Specify the location where the index files are stored 
    string indexFileLocation = @"D:\Lucene.Net\Data\Persons"; 

    Lucene.Net.Store.Directory dir = FSDirectory.Open(indexFileLocation); 
    // specify the search fields, lucene search in multiple fields 
    string[] searchfields = new string[] { "FirstName", "LastName", "DesigName", "CatagoryName" }; 
    IndexSearcher indexSearcher = new IndexSearcher(dir); 
    // Making a boolean query for searching and get the searched hits 
    Query som = QueryMaker(searchString, searchfields); 
    int n = 1000; 
    TopDocs hits = indexSearcher.Search(som,null,n); 



    for (int i = 0; i <hits.TotalHits; i++) 
    { 
     SearchResults result = new SearchResults(); 
     result.FirstName = hits.ScoreDocs.GetValue(i).ToString(); 

     result.FirstName = hits.Doc.GetField("FirstName").StringValue(); 
     result.LastName = hits.Doc(i).GetField("LastName").StringValue(); 
     result.DesigName = hits.Doc(i).GetField("DesigName").StringValue(); 
     result.Addres = hits.Doc(i).GetField("Addres").StringValue(); 
     result.CatagoryName = hits.Doc(i).GetField("CatagoryName").StringValue(); 
     Searchresults.Add(result); 
    } 

내가 테이블 필드 이름 성을 가지고 ....내가 검색 결과에서 값을 얻을 명중 처리 할 수있는 방법 3.03

난라는 오류가 TopDocs에 doc에 대한 정의가 없습니다.

답변

1

컴파일러에 기대어 놓습니다. Doc이라는 속성 또는 메서드는 TopDocs 클래스에 없습니다. ScoreDocs 속성에 TopDocs 클래스의 문서 번호와 점수가있는 히트 목록이 있습니다. 실제 문서를 얻으려면이 문서 번호를 사용해야합니다. 그 후 사용 방법 DocIndexSearcher에 있으며이 번호의 문서를 쿼리합니다. 그런 다음 해당 문서에서 저장된 필드 데이터를 가져올 수 있습니다.

foreach (var scoreDoc in hits.ScoreDocs) 
{ 
    var result = new SearchResults(); 
    var doc = indexSearcher.Doc(scoreDoc.Doc); 
    result.FirstName = doc.GetField("FirstName").StringValue; 
    result.LastName = doc.GetField("LastName").StringValue; 
    result.DesigName = doc.GetField("DesigName").StringValue; 
    result.Addres = doc.GetField("Addres").StringValue; 
    result.CategoryName = doc.GetField("CategoryName").StringValue; 
    Searchresults.Add(result); 
} 

이상 LINQ 방법 :

var searchResults = 
    indexSearcher 
    .Search(som, null, n) 
    .ScoreDocs 
    .Select(scoreDoc => indexSearcher.Doc(scoreDoc)) 
    .Select(doc => 
    { 
     var result = new SearchResults(); 
     result.FirstName = doc.GetField("FirstName").StringValue; 
     result.LastName = doc.GetField("LastName").StringValue; 
     result.DesigName = doc.GetField("DesigName").StringValue; 
     result.Addres = doc.GetField("Addres").StringValue; 
     result.CategoryName = doc.GetField("CategoryName").StringValue; 
     return result; 
    }) 
    .ToList(); 
0

hits 방법의 분리 당신이 documents 일치하고 미래에 당신이 원하는 경우 취소하게됩니다

당신은 그런 결과를 처리 할 수 ​​있습니다 highlight 일치하는 documents 다음 lucene.net highlightergetMatchedHits 메서드에 쉽게 포함시킬 수 있습니다.

List<SearchResults> Searchresults = new List<SearchResults>(); 

// Specify the location where the index files are stored 
string indexFileLocation = @"D:\Lucene.Net\Data\Persons"; 

Lucene.Net.Store.Directory dir = FSDirectory.Open(indexFileLocation); 
     // specify the search fields, lucene search in multiple fields 
string[] searchfields = new string[] { "FirstName", "LastName", "DesigName", "CatagoryName" }; 
IndexSearcher indexSearcher = new IndexSearcher(dir); 
// Making a boolean query for searching and get the searched hits 
Query som = QueryMaker(searchString, searchfields); 
int n = 1000; 
var hits = indexSearcher.Search(som,null,n).ScoreDocs; 

Searchresults = getMatchedHits(hits,indexSearcher); 

getMatchedHits 방법 코드 :

public static List<SearchResults> getMatchedHits(ScoreDoc[] hits, IndexSearcher searcher) 
{ 
    List<SearchResults> list = new List<SearchResults>(); 
    SearchResults obj; 
    try 
    { 
     for (int i = 0; i < hits.Count(); i++) 
     { 
      // get the document from index 
      Document doc = searcher.Doc(hits[i].Doc); 
      string strFirstName = doc.Get("FirstName"); 
      string strLastName = doc.Get("LastName"); 
      string strDesigName = doc.Get("DesigName"); 
      string strAddres = doc.Get("Addres"); 
      string strCategoryName = doc.Get("CategoryName"); 
      obj = new SearchResults(); 
      obj.FirstName = strFirstName; 
      obj.LastName = strLastName; 
      obj.DesigName= strDesigName; 
      obj.Addres = strAddres; 
      obj.CategoryName = strCategoryName; 
      list.Add(obj); 
     } 
     return list; 
    } 
    catch (Exception ex) 
    { 
     return null; // or throw exception 
    } 
} 

그것이 도움이되기를 바랍니다!