Lucene實(shí)現(xiàn)全文檢索技術(shù)(包含SpringBoot整合Lucene 7.6.0 )

Lucene實(shí)現(xiàn)全文檢索的流程

① 綠色表示索引過程,對要搜索的原始內(nèi)容進(jìn)行索引構(gòu)建一個索引庫珊泳,索引過程包括:
確定原始內(nèi)容即要搜索的內(nèi)容à采集文檔à創(chuàng)建文檔à分析文檔à索引文檔

② 紅色表示搜索過程熟嫩,從索引庫中搜索內(nèi)容片习,搜索過程包括:
用戶通過搜索界面à創(chuàng)建查詢à執(zhí)行搜索照卦,從索引庫搜索引擎渲染搜索結(jié)果

引入核心依賴

lucene核心及其依賴

<!--lucene-->
        <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-core</artifactId>
            <version>7.6.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-queryparser</artifactId>
            <version>7.6.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-analyzers-common</artifactId>
            <version>7.6.0</version>
        </dependency>

中文分詞器

<dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-analyzers-smartcn</artifactId>
            <version>7.6.0</version>
        </dependency>

文件IO操作

<dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>
原始文檔

原始文檔是指要索引和搜索的內(nèi)容。原始內(nèi)容包括互聯(lián)網(wǎng)上的網(wǎng)頁狸驳、數(shù)據(jù)庫中的數(shù)據(jù)预明、磁盤上的文件等。


用來測試的原始文檔
Field分析
創(chuàng)建索引

對所有文檔分析得出的語匯單元進(jìn)行索引耙箍,索引的目的是為了搜索撰糠,最終要實(shí)現(xiàn)只搜索被索引的語匯單元從而找到Document(文檔)。


索引庫
創(chuàng)建查詢

用戶輸入查詢關(guān)鍵字執(zhí)行搜索之前需要先構(gòu)建一個查詢對象辩昆,查詢對象中可以指定查詢要搜索的Field文檔域窗慎、查詢關(guān)鍵字等,查詢對象會生成具體的查詢語法卤材,
例如:
語法 “fileName:lucene”表示要搜索Field域的內(nèi)容為“l(fā)ucene”的文檔

代碼示例(創(chuàng)建索引)

   //創(chuàng)建索引
    @Test
    public void luceneCreateIndex() throws Exception{

        //指定索引存放的位置
        //E:\Lucene_index
        Directory directory = FSDirectory.open(Paths.get(new File("E:\\Lucene_index").getPath()));
        System.out.println("pathname"+Paths.get(new File("E:\\Lucene_index").getPath()));
       //創(chuàng)建一個分詞器
//        StandardAnalyzer analyzer = new StandardAnalyzer();
//        CJKAnalyzer cjkAnalyzer = new CJKAnalyzer();
        SmartChineseAnalyzer smartChineseAnalyzer = new SmartChineseAnalyzer();
        //創(chuàng)建indexwriterConfig(參數(shù)分詞器)
        IndexWriterConfig indexWriterConfig = new IndexWriterConfig(smartChineseAnalyzer);
        //創(chuàng)建indexwrite 對象(文件對象,索引配置對象)
        IndexWriter indexWriter = new IndexWriter(directory,indexWriterConfig);
        //原始文件
        File file = new File("E:\\Lucene_Document");

        for (File f: file.listFiles()){
            //文件名
            String fileName = f.getName();
            //文件內(nèi)容
            String fileContent = FileUtils.readFileToString(f,"GBK");
            System.out.println(fileContent);
            //文件路徑
            String path = f.getPath();
            //文件大小
            long fileSize = FileUtils.sizeOf(f);

            //創(chuàng)建文件域名
            //域的名稱 域的內(nèi)容 是否存儲
            Field fileNameField = new TextField("fileName", fileName, Field.Store.YES);
            Field fileContentField = new TextField("fileContent", fileContent, Field.Store.YES);
            Field filePathField = new TextField("filePath", path, Field.Store.YES);
            Field fileSizeField = new TextField("fileSize", fileSize+"", Field.Store.YES);

            //創(chuàng)建Document 對象
            Document indexableFields = new Document();
            indexableFields.add(fileNameField);
            indexableFields.add(fileContentField);
            indexableFields.add(filePathField);
            indexableFields.add(fileSizeField);
            //創(chuàng)建索引峦失,并寫入索引庫
            indexWriter.addDocument(indexableFields);

        }

        //關(guān)閉indexWriter
        indexWriter.close();
    }

代碼示例(查詢索引)

@Test
    public void searchIndex() throws IOException {
        //指定索引庫存放路徑
        //E:\Lucene_index
        Directory directory = FSDirectory.open(Paths.get(new File("E:\\Lucene_index").getPath()));
        //創(chuàng)建indexReader對象
        IndexReader indexReader = DirectoryReader.open(directory);
        //創(chuàng)建indexSearcher對象
        IndexSearcher indexSearcher = new IndexSearcher(indexReader);
        //創(chuàng)建查詢
        Query query = new TermQuery(new Term("fileContent", "可愛"));
        //執(zhí)行查詢
        //參數(shù)一  查詢對象    參數(shù)二  查詢結(jié)果返回的最大值
        TopDocs topDocs = indexSearcher.search(query, 10);
        System.out.println("查詢結(jié)果的總數(shù)"+topDocs.totalHits);
        //遍歷查詢結(jié)果
        for (ScoreDoc scoreDoc: topDocs.scoreDocs){
            //scoreDoc.doc 屬性就是doucumnet對象的id
            Document doc = indexSearcher.doc(scoreDoc.doc);
            System.out.println(doc.getField("fileName"));
            System.out.println(doc.getField("fileContent"));
            System.out.println(doc.getField("filePath"));
            System.out.println(doc.getField("fileSize"));
        }
        indexReader.close();
    }

Demo示例展示

可愛女人
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末扇丛,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子尉辑,更是在濱河造成了極大的恐慌帆精,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異卓练,居然都是意外死亡隘蝎,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門襟企,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嘱么,“玉大人,你說我怎么就攤上這事顽悼÷瘢” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵蔚龙,是天一觀的道長冰评。 經(jīng)常有香客問我,道長木羹,這世上最難降的妖魔是什么甲雅? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮坑填,結(jié)果婚禮上抛人,老公的妹妹穿的比我還像新娘。我一直安慰自己穷遂,他們只是感情好函匕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蚪黑,像睡著了一般盅惜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上忌穿,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天抒寂,我揣著相機(jī)與錄音,去河邊找鬼掠剑。 笑死屈芜,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的朴译。 我是一名探鬼主播井佑,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼眠寿!你這毒婦竟也來了躬翁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤盯拱,失蹤者是張志新(化名)和其女友劉穎盒发,沒想到半個月后例嘱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宁舰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年拼卵,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛮艰。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡腋腮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出印荔,到底是詐尸還是另有隱情低葫,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布仍律,位于F島的核電站嘿悬,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏水泉。R本人自食惡果不足惜善涨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望草则。 院中可真熱鬧钢拧,春花似錦、人聲如沸炕横。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽份殿。三九已至膜钓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間卿嘲,已是汗流浹背颂斜。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拾枣,地道東北人沃疮。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像梅肤,于是被迫代替她去往敵國和親司蔬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354