(转)lucene.net,包括对htm,word,doc,pdf,等等式进行parse解析,取得内容

本文转载自:http://blog.csdn.net/hehui21/article/details/2873933

这几天完成一个相关lucene.net 索引,特此写上来供大爱评论!

建立全文索引,主要有两步,一,建立索引,二,查找,那么我先来讲一下怎么新建索引!
引用类:

  1. Imports System.Data
  2. Imports System.IO
  3. Imports System.Net
  4. Imports System.Text
  5. Imports System.Data.SqlClient
  6. Imports System.Data.Sql
  7. Imports System.Text.RegularExpressions
  8. Imports System.Web
  9. Imports System.Threading
  10. Imports Microsoft.Office
  11. Imports Lucene.Net.Documents
  12. Imports Lucene.Net.Index
  13. Imports Lucene.Net.Search
  14. Imports Lucene.Net.QueryParsers
  15. Imports Lucene.Net.Analysis.Cn
  16. Imports Lucene.Net
  17. Imports System.Data.OleDb


我这里是把它做成一个类的,它是一个form程式,里面有一个按钮,一个rechibox,一个timer然后在这个类里定义一些私有变量:
-

  1.    Private Delegate Sub indexfile_delegate()
  2.     Private _dir As String = "D:/idx"'存放索引位置
  3.     Private _display_index_Name As String = "XYPart_index"
  4.     'Private display_index_directory As String = _dir
  5.     Private _Analysis As New Lucene.Net.Analysis.Cn.ChineseAnalyzer
  6.     Private _writer As IndexWriter '新建一个索引
  7.     Private startTime As DateTime'定义程式开始运行时间,主要是记录索引时间用
  8.     Private _conn As New System.Data.SqlClient.SqlConnection("server=你的数据库地址;database=databasename;User Id = 用户名称;Password =密码;")

  1.  '解读出数据里的数据
  2.     Public Function F_getDataFromTable() As SqlDataReader
  3.         'connection
  4.          _conn.Open()
  5.         Dim query As String = ”sql语句“
  6.          Dim mycom As SqlCommand
  7.         mycom = New SqlCommand(query, _conn)
  8.         Dim myrea As SqlDataReader
  9.          myrea = mycom.ExecuteReader
  10.          Return myrea
  11.     End Function


解读出附件里的文件内容:

  1.     Public Function FileParse(ByVal file As StringAs String
  2.         Dim result As String = ""
  3.         '  For j As Integer = 0 To file.Length - 1
  4.         Dim T_str As String = Path.GetExtension(file).ToLower
  5.         Select Case T_str
  6.             Case ".txt"
  7.                 result = TxtParse(file)
  8.             Case ".htm"
  9.                 result = htmParse(file)
  10.             Case ".html"
  11.                 result = htmParse(file)
  12.             Case ".pdf"
  13.                 result = PDFParse(file)
  14.             Case ".docx"
  15.                 result = WordParse(file)
  16.             Case ".doc"
  17.                 result = WordParse(file)
  18.             Case ".ppt"
  19.                 result = PPTParse(file)
  20.             Case ".pptx"
  21.                 result = PPTParse(file)
  22.             Case ".xlsx"
  23.                 result = ExcelParse(file)
  24.             Case ".xls"
  25.                 result = ExcelParse(file)
  26.         End Select
  27.         '  Next
  28.         Return result
  29.     End Function
  30.     Public Function htmParse(ByVal path As StringAs String
  31.         Dim sr As New StreamReader(path, System.Text.Encoding.Default)
  32.         Dim file_html As String
  33.         file_html = sr.ReadToEnd
  34.         Dim Htmlstring As String = System.Text.RegularExpressions.Regex.Replace(file_html, "<[^>]*>""")
  35.         'remove script 
  36.         Htmlstring = Regex.Replace(Htmlstring, "<script[^>]*?>.*?</script>""", RegexOptions.IgnoreCase)
  37.         'remove html
  38.         Htmlstring = Regex.Replace(Htmlstring, "<(.[^>]*)>""", RegexOptions.IgnoreCase)
  39.         Htmlstring = Regex.Replace(Htmlstring, "([/r/n])[/s]+""", RegexOptions.IgnoreCase)
  40.         Htmlstring = Regex.Replace(Htmlstring, "-->""", RegexOptions.IgnoreCase)
  41.         Htmlstring = Regex.Replace(Htmlstring, "<!--.*""", RegexOptions.IgnoreCase)
  42.         Htmlstring = Regex.Replace(Htmlstring, "&(quot|#34);""/", RegexOptions.IgnoreCase)
  43.         Htmlstring = Regex.Replace(Htmlstring, "&(amp|#38);""&", RegexOptions.IgnoreCase)
  44.         Htmlstring = Regex.Replace(Htmlstring, "&(lt|#60);""<", RegexOptions.IgnoreCase)
  45.         Htmlstring = Regex.Replace(Htmlstring, "&(gt|#62);"">", RegexOptions.IgnoreCase)
  46.         Htmlstring = Regex.Replace(Htmlstring, "&(nbsp|#160);"" ", RegexOptions.IgnoreCase)
  47.         Htmlstring = Regex.Replace(Htmlstring, "&(iexcl|#161);""/xa1", RegexOptions.IgnoreCase)
  48.         Htmlstring = Regex.Replace(Htmlstring, "&(cent|#162);""/xa2", RegexOptions.IgnoreCase)
  49.         Htmlstring = Regex.Replace(Htmlstring, "&(pound|#163);""/xa3", RegexOptions.IgnoreCase)
  50.         Htmlstring = Regex.Replace(Htmlstring, "&(copy|#169);""/xa9", RegexOptions.IgnoreCase)
  51.         Htmlstring = Regex.Replace(Htmlstring, "&#(/d+);""", RegexOptions.IgnoreCase)
  52.         Htmlstring.Replace("<""")
  53.         Htmlstring.Replace(">""")
  54.         Htmlstring.Replace("/r/n""")
  55.         'Htmlstring = System.Web.HttpContext.Current.Server.HtmlEncode(Htmlstring).Trim()
  56.         Return Htmlstring.Replace(" "" ")
  57.     End Function
  58.     Public Function TxtParse(ByVal Path_str As StringAs String
  59.         Dim sr As New StreamReader(Path_str, System.Text.Encoding.Default)
  60.         Dim str As String = sr.ReadToEnd
  61.         Return str
  62.     End Function
  63.     Public Function PDFParse(ByVal path_str As StringAs String
  64.         Dim Path_str_totxt As String = path_str.Substring(0, path_str.LastIndexOf(".")) + ".txt"
  65.         Dim str As String = ""
  66.         Try
  67.             Shell(_datadir + "TextMiningTool/minetext.exe" + " " + path_str + " " + Path_str_totxt)
  68.             str = TxtParse(Path_str_totxt)
  69.             Shell("del /q /f " + Path_str_totxt)
  70.         Catch ex As Exception
  71.             MsgBox("this pdf    " + path_str + "  is not parsed ,the programme is continuing")
  72.         End Try
  73.         Return str
  74.     End Function
  75.     Public Function WordParse(ByVal path_str As StringAs String
  76.         Dim missing = System.Reflection.Missing.Value
  77.         Dim isReadOnly As Boolean = False
  78.         Dim isVisible As Boolean = True
  79.         Dim openword As New Microsoft.Office.Interop.Word.Application
  80.         Dim word_doc As Microsoft.Office.Interop.Word.Document
  81.         word_doc = openword.Documents.Open(path_str, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, isVisible, missing, missing, missing, missing)
  82.         word_doc.Activate()
  83.         openword.Visible = False
  84.         Dim str As String
  85.         str = word_doc.Content.Text
  86.         openword.Quit(missing, missing, missing)
  87.         word_doc.Close()
  88.         Return str
  89.     End Function
  90.     Public Function ExcelParse(ByVal path_str As StringAs String
  91.         Dim dbfconn As OleDb.OleDbConnection = New OleDb.OleDbConnection
  92.         Dim conn_excel As String
  93.         Dim FileExname As String = System.IO.Path.GetExtension(path_str).ToUpper
  94.         If FileExname <> ".XLSX" Then
  95.             conn_excel = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path_str + ";Extended Properties='Excel 8.0;HDR=NO;IMEX=1';"
  96.         Else
  97.             conn_excel = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path_str + ";Extended Properties='Excel 12.0;HDR=NO;IMEX=1';"
  98.         End If
  99.         Dim str As String = ""
  100.         dbfconn.ConnectionString = conn_excel
  101.         dbfconn.Open()
  102.         Dim tablename As String
  103.         Dim dt As DataTable = dbfconn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, Nothing)
  104.         For i As Integer = 0 To dt.Rows.Count - 1
  105.             tablename = dt.Rows(i)(2).ToString().Trim()
  106.             Dim strSQL As String = "Select * from [" + tablename + "]"
  107.             Dim objDA As System.Data.OleDb.OleDbDataAdapter = New System.Data.OleDb.OleDbDataAdapter(strSQL, conn_excel)
  108.             Dim objDS As New DataSet()
  109.             objDA.Fill(objDS)
  110.             For j As Integer = 0 To objDS.Tables(0).Rows.Count - 1
  111.                 For x As Integer = 0 To objDS.Tables(0).Columns.Count - 1
  112.                     str = str + " " + objDS.Tables(0).Rows(j)(x).ToString
  113.                 Next
  114.             Next
  115.         Next
  116.         dbfconn.Close()
  117.         Return str
  118.     End Function
  119.     Public Function PPTParse(ByVal file As StringAs String
  120.         Dim targetFile As String = file
  121.         Dim str As String = ""
  122.         Dim ppApp As New Microsoft.Office.Interop.PowerPoint.Application
  123.         Dim prsPres As Microsoft.Office.Interop.PowerPoint.Presentation = ppApp.Presentations.Open(targetFile, TrueFalseFalse)
  124.         For Each slide As Microsoft.Office.Interop.PowerPoint.Slide In prsPres.Slides
  125.             For Each shape As Microsoft.Office.Interop.PowerPoint.Shape In slide.Shapes
  126.                 If shape.TextFrame.HasText = Microsoft.Office.Core.MsoTriState.msoTrue Then
  127.                     str = str + shape.TextFrame.TextRange.Text
  128.                 End If
  129.             Next
  130.         Next
  131.         prsPres.Close()
  132.         ppApp.Quit()
  133.         Return str
  134.     End Function

建立索引:

  1. Private Sub indexfile()
  2.         Dim myrea As SqlDataReader
  3.         myrea = F_getDataFromTable()
  4.         'built field
  5.         Dim Field_contents_str As String = "" 'save the  contents from table ,
  6.         Dim Field_id As String = "" 'save the Requistion_no   id,
  7.         Dim Field_Datafile As String
  8.         Dim Field_file_Catagory As String
  9.         display_indexinfo("start")
  10.         ' Try
  11.         While (myrea.Read())
  12.             Dim doc As New Lucene.Net.Documents.Document
  13.             ' If myrea("file_category").ToString <> "" Then
  14.             Field_contents_str = myrea("Customer_Name").ToString + " " + myrea("Customer_Id").ToString + " " + myrea("Reject_Reason").ToString + " " + myrea("Remark").ToString + " " + myrea("Category").ToString
  15.             Field_contents_str = Field_contents_str + " " + myrea("AACATI_SO_No").ToString + " " + myrea("Vendor_Part_No").ToString + " " + myrea("Description").ToString + " " + myrea("AASC_Part_No").ToString + " " + myrea("Brand_Name").ToString
  16.             Field_id = myrea("requisition_no").ToString
  17.             'save the contents from various file
  18.             Dim fullpath As String = ""
  19.             fullpath = "../Utilities/Files/" + myrea("filefullname")
  20.             If File.Exists(fullpath) Then
  21.                 Field_Datafile = FileParse(fullpath)
  22.             Else
  23.                 Field_Datafile = ""
  24.             End If
  25.             '  fullpath = datadir + "word.doc"
  26.             Field_file_Catagory = myrea("file_category").ToString
  27.             doc.Add(New Lucene.Net.Documents.Field("Table_contents", Field_contents_str, Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.TOKENIZED))
  28.             doc.Add(New Lucene.Net.Documents.Field("File_contents", Field_Datafile, Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.TOKENIZED))
  29.             doc.Add(New Lucene.Net.Documents.Field("Requisition_no_id", Field_id, Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.UN_TOKENIZED))
  30.             doc.Add(New Lucene.Net.Documents.Field("FullContents", Field_contents_str + Field_Datafile, Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.TOKENIZED))
  31.             doc.Add(New Lucene.Net.Documents.Field("FileCatagory", Field_file_Catagory, Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.TOKENIZED))
  32.             _writer.AddDocument(doc)
  33.             '  End If
  34.         End While
  35.         ' Catch ex As Exception
  36.         '  MsgBox("index is not success")
  37.         'End Try
  38.         display_indexinfo("finished")
  39.         myrea.Close()
  40.     End Sub

显示索引中相关信息,比如文件名称,路径,等等,

  1.  Private Sub display_indexinfo(ByVal status As String)
  2.         '
  3.         Dim display_index_Time As Date
  4.         Dim _fi As New FileInfo("D:/idx/segments")
  5.         display_index_Time = _fi.LastAccessTime
  6.         Dim display_index_status As String = "Finished"
  7.         If Not File.Exists("D:/idx/segments"Then
  8.             DataList.AppendText("Sorry ,it is not built index!!")
  9.         ElseIf status.ToLower = "start" Then
  10.             DataList.Clear()
  11.           
  12.             startTime = Date.Now
  13.             DataList.AppendText("Index Name :     " + _display_index_Name + vbCrLf + vbCrLf)
  14.             DataList.AppendText("Index Directory:     " + _dir + vbCrLf + vbCrLf)
  15.             display_index_status = "in process"
  16.             DataList.AppendText("index  Status   :     " + display_index_status + vbCrLf)
  17.             DataList.AppendText("Start Time :     " + startTime.ToString + vbCrLf + vbCrLf)
  18.         ElseIf status.ToLower = "finished" Then
  19.        
  20.             Dim Endtime As DateTime = Date.Now
  21.             Dim timespan As TimeSpan = Endtime - startTime
  22.             '  doc.Add(New Lucene.Net.Documents.Field("Build_Time", timespan.ToString, Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.TOKENIZED))
  23.             ' _writer.AddDocument(doc)
  24.             DataList.AppendText("End Time :     " + Endtime.ToString + vbCrLf + vbCrLf)
  25.             DataList.AppendText("Span Time :     " + timespan.ToString + vbCrLf + vbCrLf)
  26.             DataList.AppendText(" Finished :")
  27.         Else
  28.             DataList.AppendText("Index Name :     " + _display_index_Name + vbCrLf + vbCrLf)
  29.             DataList.AppendText("Index Directory:     " + _dir + vbCrLf + vbCrLf)
  30.             DataList.AppendText("Index  Time:     " + display_index_Time + vbCrLf + vbCrLf)
  31.             DataList.AppendText("index  Status   :     " + display_index_status + vbCrLf)
  32.         End If
  33.         DataList.Refresh()
  34.     End Sub

优化索引:

  1.     Public Sub optimize_index(ByVal ar As IAsyncResult)
  2.         Dim writer As IndexWriter = ar.AsyncState
  3.         'optimize index
  4.         writer.SetMergeFactor(100) 'set document number,if your memory is bigger,please set bigger,exm:100 or 1000,defult is 10
  5.         writer.SetMaxMergeDocs(999999999)
  6.         'MinMergeDocs(use it to control the memory)  and MergeFactory(control amalgamation  times and the size of amalgamation ),they have more affect to build the index,
  7.         'but  Number of Mergefactory is not bigger and better,because when the document Number of segment is bigger,the efficiency is lower,so set a right value please,
  8.         'If your memory is bigger,you can set the MinMergedocs bigger
  9.         writer.SetMaxFieldLength(100000) 'set char lenth,defult is 10 000
  10.         writer.Optimize()
  11.         writer.Close()
  12.         _conn.Close()
  13.     End Sub

单击button,开始建立索引:

    1.   Private Sub btn_Builtindex_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles btn_Builtindex.Click
    2.         Timer1.Stop()
    3.         _writer = New IndexWriter(_dir, _Analysis, True)
    4.         Control.CheckForIllegalCrossThreadCalls = False
    5.         Dim CallbackOptimize As AsyncCallback = AddressOf optimize_index
    6.         Dim indexfile_gelegate_btn As New indexfile_delegate(AddressOf indexfile)
    7.         indexfile_gelegate_btn.BeginInvoke(CallbackOptimize, _writer)
    8.     End Sub
原文地址:https://www.cnblogs.com/wpcnblog/p/2383559.html