基于 Lucene 的桌面文件搜索
開源2010年,自己在學習 Lucene 時開發的一款桌面文件搜索工具,這么多年過去了,代碼一直靜靜存放在自己的硬盤上,與其讓其沉睡,不如分享出來。
這款工具帶有明顯的模仿 Everything 的痕跡。事實上這是當時某項課程的作業,而那個時候剛好發現了 Eveything 這款神奇的工具,出于想探究其原理,就著手做了一款與其類似的工具,但是最后的結果卻是令人不滿意的,因為差距仍然是很大。
就比如 Everything 能夠實時監測 NTFS 文件的變化(據說是監測 NTFS 的日志)并自動更新索引,而我卻需要手動來更新。
雖然這不是一款另我十分滿意的作品,但希望其中某些部分能夠幫到有需要的人。這里還要感謝共同完成的楊一和江邊串串香。
代碼開源在 Github 上,地址在這里。
為什么選擇 Lucene?
關于 Lucene 的一些資料可以參考車東的筆記。
功能
實現對桌面文件名、MP3 文件 Tag 信息(歌手,專輯,流派,...)的快速檢索。
前提:需要先對文件建立索引。
分詞
默認情況下使用中文的分詞是對詞進行切分,比如:
這是文件名 -> 這是|文件名
為了實現對文件名的模糊搜索,需要自定義一個自己的分詞,分詞效果是對所有的字都進行切分:
這是文件名 -> 這|是|文|件|名
特別指出,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;}} }相關注意事項
轉載于:https://www.cnblogs.com/restran/p/4542052.html
總結
以上是生活随笔為你收集整理的基于 Lucene 的桌面文件搜索的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 弹指之间 -- Waltz
- 下一篇: kb-07线段树-12--二分查找区间边