zoukankan      html  css  js  c++  java
  • (转)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
  • 相关阅读:
    网络安全基础——习题集
    文件上传
    python-nmap
    获得shell的几种姿势
    一句话木马
    svn: Failed to run the WC DB work queue associated svn的bug解决
    myEclipse卡顿解决
    myEclipse或eclipse复制或修改项目后的部署名称
    java跨域问题
    下拉框选中已选的选项查询操作
  • 原文地址:https://www.cnblogs.com/wpcnblog/p/2383559.html
Copyright © 2011-2022 走看看