2017-05-10 1 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); 
    } 

ich habe Tabellenfelder Vorname Nachname zu verarbeiten .... wie kann ichwie Zugriffe auf lucene 3,03

die Werte aus dem Suchergebnis zu erhalten verarbeiten getroffen

ich habe einen Fehler, der sagt, TopDocs enthält keine Definition für doc

Antwort

1

Lean auf den Compiler. Es gibt keine Eigenschaft oder Methode Doc in TopDocs Klasse. In ScoreDocs Eigentum von TopDocs Klasse haben Sie eine Liste von Treffern mit Dokumentnummer und Punktzahl. Sie müssen diese Dokumentennummer verwenden, um das aktuelle Dokument zu erhalten. Verwenden Sie danach die Methode Doc, die in IndexSearcher ist, um ein Dokument mit dieser Nummer abzufragen. Und dann können Sie Felddaten aus diesem Dokument erhalten.

Sie können Ergebnisse wie das verarbeiten:

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); 
} 

Oder in mehr LINQ Weise:

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

Trennung von hits Methode können Sie das angepasste documents und in Zukunft zu löschen, wenn Sie möchten, highlight die gematchte documents dann können Sie problemlos die lucene.net highlighter in getMatchedHits Methode einbetten.

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 Methodencode:

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 
    } 
} 

hoffe, es hilft!