如何使用lucene.net搜索文件内容?

时间:2011-12-29 11:47:29

标签: c# lucene.net

我目前正在使用lucene.net搜索文件内容以进行关键字搜索。我能够正确地得到结果但我有一个场景需要显示特定文件中的关键字。

有两个不同的文件包含“karthik”和“steven”,如果我搜索“karthik and steven”,我可以同时显示这两个文件。如果我仅单独搜索“karthik”和“steven”,则仅显示相应的文件。

当我同时搜索“karthik and steven”时,我得到结果中的两个文件,因为我只显示文件名,现在我需要将该特定文件中的特定关键字显示为列表视图。

   Public bool StartSearch()
    {
        bool bResult = false;
        Searcher objSearcher = new IndexSearcher(mstrIndexLocation);
        Analyzer objAnalyzer = new StandardAnalyzer();

        try
        {
            //Perform Search
            DateTime dteStart = DateTime.Now;
            Query objQuery = QueryParser.Parse(mstrSearchFor, "contents", objAnalyzer);
            Hits objHits = objSearcher.Search(objQuery, objFilter);
            DateTime dteEnd = DateTime.Now;
            mlngTotalTime = (Date.GetTime(dteEnd) - Date.GetTime(dteStart));
            mlngNumHitsFound = objHits.Length();
            //GeneratePreviewText(objQuery, mstrSearchFor,objHits);
            //Generate results - convert to XML
            mstrResultsXML = "";
            if (mlngNumHitsFound > 0)
            {
                mstrResultsXML = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?><Results>";
                //Loop through results
                for (int i = 0; i < objHits.Length(); i++)
                {
                    try
                    {
                        //Get the next result
                        Document objDocument = objHits.Doc(i);
                        //Extract the data
                        string strPath = objDocument.Get("path");
                        string strFileName = objDocument.Get("name");
                        if (strPath == null) { strPath = ""; }
                        string strLastWrite = objDocument.Get("last_write_time");
                        if (strLastWrite == null)
                            strLastWrite = "unavailable";
                        else
                        {
                            strLastWrite = DateField.StringToDate(strLastWrite).ToShortDateString();
                        }
                        double dblScore = objHits.Score(i) * 100;
                        string strScore = String.Format("{0:00.00}", dblScore);
                        //Add results as an XML row
                        mstrResultsXML += "<Row>";
                        //mstrResultsXML += "<Sequence>" + (i + 1).ToString() + "</Sequence>";
                        mstrResultsXML += "<Path>" + strPath + "</Path>";
                        mstrResultsXML += "<FileName>" + strFileName + "</FileName>";
                        //mstrResultsXML += "<Score>" + strScore + "%" + "</Score>";
                        mstrResultsXML += "</Row>";
                    }
                    catch
                    {
                        break;
                    }
                }
                //Finish off XML
                mstrResultsXML += "</Results>";
                //Build Dataview (to bind to datagrid
                DataSet objDS = new DataSet();
                StringReader objSR = new StringReader(mstrResultsXML);
                objDS.ReadXml(objSR);
                objSR = null;
                mobjResultsDataView = new DataView();
                mobjResultsDataView = objDS.Tables[0].DefaultView;
            }
            //Finish up
            objSearcher.Close();
            bResult = true;
        }
        catch (Exception e)
        {
            mstrError = "Exception: " + e.Message;
        }
        finally
        {
            objSearcher = null;
            objAnalyzer = null;
        }
        return bResult;
    }

上面是我用于搜索的代码和我绑定到listview的xml,现在我需要标记在相应文档中找到的特定关键字并将其显示在listview中作为recordsss,类似于下面的listview < / p>

找不到FileName KeyWord

1 Test.Doc karthik

2 Test2.Doc steven

我希望你们不要回答这个问题,

1 个答案:

答案 0 :(得分:0)

这取决于您的文档的编制方式。您需要提取原始内容,将其传递给分析器以获取索引标记,并检查与生成的查询匹配的内容。

只需使用Highlighter.Net包,它是contrib的一部分,它可以执行此操作以及更多功能。