2011-12-29 4 views
1

私は現在、lucene.netを使用してキーワード検索のためにファイルの内容を検索しています。結果を正しく得ることができましたが、特定のファイルにあるキーワードを表示する必要があるシナリオがあります。ファイルコンテンツの検索にlucene.netを使用するにはどうすればよいですか?

karthik」と「steven」という2つの異なるファイルがあり、「karthik and steven」を検索すると、両方のファイルが表示されます。 「karthik」と「steven」のみを個別に検索すると、それぞれのファイルのみが表示されます。

"karthik and steven"を同時に検索すると、ファイル名だけが表示されているので、結果として両方のファイルが取得されます。その特定のファイルにある特定のキーワードをlistviewのレコードとして表示する必要があります。上記

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

私は、今私は、それぞれの文書で見つかった特定のキーワードをタグ付けしてrecordsssとしてリストビューに表示する必要があり、検索と私はリストビューに結合していたXMLのためにsimlar使用していたコードです実測下記リストビュー

なしファイル名、キーワード(複数可)

1 TEST.DOCのカルティク

2 Test2.Docスティーブン

私はあなたの質問を望ましくないことを願っています。

+0

コードください! atleastスニペット! –

+1

Highlighter.Netを試してください。結果を強調表示したり、ソースを調べたりするのに使用できます。 –

+0

私は上記のコードスニペットで質問を修正しました。 – karthikdavanam

答えて

0

これは、文書の索引付けの仕方によって異なります。元のコンテンツを抽出し、アナライザに渡してインデックス付きのトークンを取得し、生成されたクエリに一致するものを確認する必要があります。

Highlighter.Netパッケージと一緒に、contribの一部として行ってください。

+0

上記の方法を試してみました。ありがとうサイモン、 – karthikdavanam

関連する問題