日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于 Lucene 的桌面文件搜索

發(fā)布時間:2025/5/22 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于 Lucene 的桌面文件搜索 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

開源2010年,自己在學習 Lucene 時開發(fā)的一款桌面文件搜索工具,這么多年過去了,代碼一直靜靜存放在自己的硬盤上,與其讓其沉睡,不如分享出來。

這款工具帶有明顯的模仿 Everything 的痕跡。事實上這是當時某項課程的作業(yè),而那個時候剛好發(fā)現(xiàn)了 Eveything 這款神奇的工具,出于想探究其原理,就著手做了一款與其類似的工具,但是最后的結(jié)果卻是令人不滿意的,因為差距仍然是很大。

就比如 Everything 能夠?qū)崟r監(jiān)測 NTFS 文件的變化(據(jù)說是監(jiān)測 NTFS 的日志)并自動更新索引,而我卻需要手動來更新。

雖然這不是一款另我十分滿意的作品,但希望其中某些部分能夠幫到有需要的人。這里還要感謝共同完成的楊一和江邊串串香。

代碼開源在 Github 上,地址在這里。

為什么選擇 Lucene?

  • Lucene 是最著名的全文檢索引擎的核心庫,使用 Lucene 可以讓搜索出來的結(jié)果按匹配程度排序。
  • Lucene 有很多版本的實現(xiàn),Java,C#,Python。
  • 用數(shù)據(jù)庫的模糊搜索也可以實現(xiàn),但是效果和速度跟 Lucene 還是有差距。
  • 關(guān)于 Lucene 的一些資料可以參考車東的筆記。

    功能

    實現(xiàn)對桌面文件名、MP3 文件 Tag 信息(歌手,專輯,流派,...)的快速檢索。

    前提:需要先對文件建立索引。

    分詞

    默認情況下使用中文的分詞是對詞進行切分,比如:

    這是文件名 -> 這是|文件名

    為了實現(xiàn)對文件名的模糊搜索,需要自定義一個自己的分詞,分詞效果是對所有的字都進行切分:

    這是文件名 -> 這|是|文|件|名

    特別指出,Lucene 可以自定義分詞,這里就不展開介紹。

    在 Lucene.Net.Analysis 中添加一個自己的 MyAnalyzer

    //文件:Lucene/Net/Analysis/MyAnalyzer/MyAnalyzer.cs using System; using System.Collections.Generic; using System.Text; using Lucene.Net.Analysis; using System.IO;namespace Lucene.Net.Analysis.MyAnalyzer {public class MyAnalyzer : Analyzer{public override TokenStream TokenStream(string fieldName, System.IO.TextReader reader){TokenStream result = new MyTokenizer(reader);return result;}public override TokenStream ReusableTokenStream(System.String fieldName, System.IO.TextReader reader){Tokenizer tokenizer = (Tokenizer)GetPreviousTokenStream();if (tokenizer == null){tokenizer = new MyTokenizer(reader);SetPreviousTokenStream(tokenizer);}elsetokenizer.Reset(reader);return tokenizer;}} } //文件:Lucene/Net/Analysis/MyAnalyzer/MyTokenizer.cs using System; using System.Collections.Generic; using System.Text; using System.IO; using Lucene.Net.Analysis;using Token = Lucene.Net.Analysis.Token; using Tokenizer = Lucene.Net.Analysis.Tokenizer;namespace Lucene.Net.Analysis.MyAnalyzer {public class MyTokenizer : Tokenizer{public MyTokenizer(System.IO.TextReader input) : base(input){ }private int start = 0;private int length = 0;private const int IO_BUFFER_SIZE = 256;private char[] ioBuffer = new char[IO_BUFFER_SIZE];public override Token Next(Token token){token.Clear();if (start == 0){length = input.Read((System.Char[])ioBuffer, 0, ioBuffer.Length);if (length <= 0)return null;}if (start == length)return null;token.SetTermBuffer(ioBuffer, start, 1);start++;token.termBuffer[0] = System.Char.ToLower(token.termBuffer[0]);return token;}public override void Reset(System.IO.TextReader input){start = 0;length = 0;}} }

    相關(guān)注意事項

  • 由于需要訪問系統(tǒng)注冊表,來根據(jù)文件擴展名獲取圖標,因此啟動的時候需要管理員權(quán)限,同時在VS上開發(fā)的時候,也相應(yīng)需要用管理員權(quán)限打開VS。
  • 建立索引的時候,使用了三個線程來處理文件索引操作:分掃描磁盤文件,處理掃描獲取的文件數(shù)據(jù),將文件信息加入到索引中。它們之間使用隊列來傳遞文件信息,如果運行時線程的速度不一致,就會出現(xiàn)隊列有大量未處理的數(shù)據(jù),導(dǎo)致詭異的內(nèi)存占用升到非常高。這在其他同學的電腦上測試時有出現(xiàn)過。(當時使用多線程,是為了在等待IO時,順便創(chuàng)建索引)
  • 轉(zhuǎn)載于:https://www.cnblogs.com/restran/p/4542052.html

    總結(jié)

    以上是生活随笔為你收集整理的基于 Lucene 的桌面文件搜索的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。