如何处理 lucene 3.03 上的命中

how to process hits on lucene 3.03

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

我有 table 个字段名字姓氏....我如何处理命中以从搜索结果中获取值

i have an error that says TopDocs does not contain defination for doc

依靠编译器。 TopDocs class 中没有 属性 或名为 Doc 的方法。在 ScoreDocs 属性 of TopDocs class 中,您有包含文档编号和分数的命中列表。您需要使用此文件编号来获取实际文件。之后使用 IndexSearcher 中的方法 Doc 来查询具有此编号的文档。然后您可以从该文档中获取存储的字段数据。

您可以这样处理结果:

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

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

希望对您有所帮助!