国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

基于Lucene的全文檢索系統(tǒng)的實現(xiàn)與應用

這篇具有很好參考價值的文章主要介紹了基于Lucene的全文檢索系統(tǒng)的實現(xiàn)與應用。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、概念

Lucene是一個開源的全文搜索引擎庫,用于實現(xiàn)文本索引和搜索功能。它提供了強大的搜索和排序功能,可以用于構(gòu)建各種類型的搜索應用程序,如網(wǎng)站搜索引擎、文檔管理系統(tǒng)等。Lucene支持多種編程語言,并且具有高性能和可擴展性。它是許多其他搜索引擎和文本處理工具的基礎。

二、引入案例

我們要實現(xiàn)一個文件的搜索功能,通過關鍵字搜索文件,凡是文件名或文件內(nèi)容包括該關鍵字的文件都需要找出來,還可以根據(jù)中文詞語進行查詢,并且需要支持多個條件查詢,應該怎么做?分析一波~

1、數(shù)據(jù)庫搜索

有沒有想過,為什么數(shù)據(jù)庫實現(xiàn)搜索很容易?

一般都是使用sql語句進行查詢,而且能很快的得到查詢結(jié)果。因為數(shù)據(jù)庫中的數(shù)據(jù)存儲是有規(guī)律的,有行有列而且數(shù)據(jù)格式、數(shù)據(jù)長度都是固定的。

2、數(shù)據(jù)分類

我們生活中的數(shù)據(jù)總體分為兩種:結(jié)構(gòu)化數(shù)據(jù)和非結(jié)構(gòu)化數(shù)據(jù)。

  • 結(jié)構(gòu)化數(shù)據(jù):指具有固定格式或有限長度的數(shù)據(jù),如數(shù)據(jù)庫,元數(shù)據(jù)等。
  • 非結(jié)構(gòu)化數(shù)據(jù):指不定長或無固定格式的數(shù)據(jù),如郵件,word文檔等磁盤上的文件。

3、非結(jié)構(gòu)化數(shù)據(jù)查詢方法

那么非結(jié)構(gòu)化數(shù)據(jù)查詢,怎么實現(xiàn)?

1) 順序掃描法(Serial Scanning)

所謂順序掃描,比如要找內(nèi)容包含某一個字符串的文件,就是一個文檔一個文檔的看,對于每一個文檔,從頭看到尾,如果此文檔包含此字符串,則此文檔為我們要找的文件,接著看下一個文件,直到掃描完所有的文件。如利用windows的搜索也可以搜索文件內(nèi)容,只是相當?shù)穆?/p>

2)全文檢索(Full-text Search)

將非結(jié)構(gòu)化數(shù)據(jù)中的一部分信息提取出來,重新組織,使其變得有一定結(jié)構(gòu),然后對此有一定結(jié)構(gòu)的數(shù)據(jù)進行搜索,從而達到搜索相對較快的目的。這部分從非結(jié)構(gòu)化數(shù)據(jù)中提取出的然后重新組織的信息,我們稱之索引。

例如:字典。字典的拼音表和部首檢字表就相當于字典的索引,對每一個字的解釋是非結(jié)構(gòu)化的,如果字典沒有音節(jié)表和部首檢字表,在茫茫辭海中找一個字只能順序掃描。然而字的某些信息可以提取出來進行結(jié)構(gòu)化處理,比如讀音,就比較結(jié)構(gòu)化,分聲母和韻母,分別只有幾種可以一一列舉,于是將讀音拿出來按一定的順序排列,每一項讀音都指向此字的詳細解釋的頁數(shù)。我們搜索時按結(jié)構(gòu)化的拼音搜到讀音,然后按其指向的頁數(shù),便可找到我們的非結(jié)構(gòu)化數(shù)據(jù)——也即對字的解釋。

這種先建立索引,再對索引進行搜索的過程就叫全文檢索。

雖然創(chuàng)建索引的過程也是非常耗時的,但是索引一旦創(chuàng)建就可以多次使用,全文檢索主要處理的是查詢,所以耗時間創(chuàng)建索引是值得的。

4、如何實現(xiàn)全文檢索

對于數(shù)據(jù)量大、數(shù)據(jù)結(jié)構(gòu)不固定的數(shù)據(jù)可采用全文檢索方式搜索,比如百度、Google等搜索引擎、論壇站內(nèi)搜索、電商網(wǎng)站站內(nèi)搜索等。

可以使用Lucene實現(xiàn)全文檢索。Lucene是apache下的一個開放源代碼的全文檢索引擎工具包。提供了完整的查詢引擎和索引引擎,部分文本分析引擎。Lucene的目的是為軟件開發(fā)人員提供一個簡單易用的工具包,以方便的在目標系統(tǒng)中實現(xiàn)全文檢索的功能。

三、Lucene實現(xiàn)全文檢索的流程

1、索引和搜索流程圖

基于Lucene的全文檢索系統(tǒng)的實現(xiàn)與應用,搜索引擎,全文檢索,lucene,搜索引擎
1、綠色:表示索引過程,對要搜索的原始內(nèi)容進行索引構(gòu)建一個索引庫
索引過程:確定原始內(nèi)容,即要搜索的內(nèi)容,采集文檔,創(chuàng)建文檔,分析文檔,索引文檔

2、紅色表示搜索過程,從索引庫中搜索內(nèi)容
搜索過程:用戶通過搜索界面,創(chuàng)建查詢執(zhí)行搜索,從索引庫搜索渲染搜索結(jié)果

2、創(chuàng)建索引

對文檔索引的過程,將用戶要搜索的文檔內(nèi)容進行索引,索引存儲在索引庫(index)中。
這里我們要搜索的文檔是磁盤上的文本文件,根據(jù)案例描述:凡是文件名或文件內(nèi)容包括關鍵字的文件都要找出來,這里要對文件名和文件內(nèi)容創(chuàng)建索引。

1)獲取原始文檔

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

本案例中的原始內(nèi)容就是磁盤上的文件,如下圖:
基于Lucene的全文檢索系統(tǒng)的實現(xiàn)與應用,搜索引擎,全文檢索,lucene,搜索引擎

從互聯(lián)網(wǎng)上、數(shù)據(jù)庫、文件系統(tǒng)中等獲取需要搜索的原始信息,這個過程就是信息采集,信息采集的目的是為了對原始內(nèi)容進行索引。

在Internet上采集信息的軟件通常稱為爬蟲或蜘蛛,也稱為網(wǎng)絡機器人,爬蟲訪問互聯(lián)網(wǎng)上的每一個網(wǎng)頁,將獲取到的網(wǎng)頁內(nèi)容存儲起來。

Lucene不提供信息采集的類庫,需要自己編寫一個爬蟲程序?qū)崿F(xiàn)信息采集,也可以通過一些開源軟件實現(xiàn)信息采集,如下:

  • Nutch(http://lucene.apache.org/nutch), Nutch是apache的一個子項目,包括大規(guī)模爬蟲工具,能夠抓取和分辨web網(wǎng)站數(shù)據(jù)。

  • jsoup(http://jsoup.org/ ),jsoup 是一款Java 的HTML解析器,可直接解析某個URL地址、HTML文本內(nèi)容。它提供了一套非常省力的API,可通過DOM,CSS以及類似于jQuery的操作方法來取出和操作數(shù)據(jù)。

  • heritrix(http://sourceforge.net/projects/archive-crawler/files/),Heritrix 是一個由 java 開發(fā)的、開源的網(wǎng)絡爬蟲,用戶可以使用它來從網(wǎng)上抓取想要的資源。其最出色之處在于它良好的可擴展性,方便用戶實現(xiàn)自己的抓取邏輯。

本案例我們要獲取磁盤上文件的內(nèi)容,可以通過文件流來讀取文本文件的內(nèi)容,對于pdf、doc、xls等文件可通過第三方提供的解析工具讀取文件內(nèi)容,比如Apache POI讀取doc和xls的文件內(nèi)容。

2)創(chuàng)建文檔對象

獲取原始內(nèi)容的目的是為了索引,在索引前需要將原始內(nèi)容創(chuàng)建成文檔(Document),文檔中包括一個一個的域(Field),域中存儲內(nèi)容。
這里我們可以將磁盤上的一個文件當成一個document,Document中包括一些Field(file_name文件名稱、file_path文件路徑、file_size文件大小、file_content文件內(nèi)容),如下圖:
基于Lucene的全文檢索系統(tǒng)的實現(xiàn)與應用,搜索引擎,全文檢索,lucene,搜索引擎
注:每個Document可以有多個Field,不同的Document可以有不同的Field,同一個Document可以有相同的Field(域名和域值都相同)
每個文檔都有一個唯一的編號,就是文檔id。

3)分析文檔

將原始內(nèi)容創(chuàng)建為包含域(Field)的文檔(document),需要再對域中的內(nèi)容進行分析,分析的過程是經(jīng)過對原始文檔提取單詞、將字母轉(zhuǎn)為小寫、去除標點符號、去除停用詞等過程生成最終的語匯單元,可以將語匯單元理解為一個一個的單詞。

原文檔內(nèi)容:

Lucene is a Java full-text search engine. Lucene is not a complete
application, but rather a code library and API that can easily be used
to add search capabilities to applications.

分析后得到的語匯單元:

lucene、java、full、search、engine。。。。

每個單詞叫做一個Term,不同的域中拆分出來的相同的單詞是不同的term。term中包含兩部分一部分是文檔的域名,另一部分是單詞的內(nèi)容。

例如:文件名中包含apache和文件內(nèi)容中包含的apache是不同的term。

4)創(chuàng)建索引

對所有文檔分析得出的語匯單元進行索引,索引的目的是為了搜索,最終要實現(xiàn)只搜索被索引的語匯單元從而找到Document(文檔)。
基于Lucene的全文檢索系統(tǒng)的實現(xiàn)與應用,搜索引擎,全文檢索,lucene,搜索引擎一個索引可能對應多個文檔

注:一個索引可能對應多個文檔,創(chuàng)建索引是對語匯單元索引,通過詞語找文檔,這種索引的結(jié)構(gòu)叫倒排索引結(jié)構(gòu)。

傳統(tǒng)方法是根據(jù)文件找到該文件的內(nèi)容,在文件內(nèi)容中匹配搜索關鍵字,這種方法是順序掃描方法,數(shù)據(jù)量大、搜索慢。

倒排索引結(jié)構(gòu)是根據(jù)內(nèi)容(詞語)找文檔,如下圖:
基于Lucene的全文檢索系統(tǒng)的實現(xiàn)與應用,搜索引擎,全文檢索,lucene,搜索引擎
倒排索引結(jié)構(gòu)也叫反向索引結(jié)構(gòu),包括索引和文檔兩部分,索引即詞匯表,它的規(guī)模較小,而文檔集合較大。

3、查詢索引

1)創(chuàng)建查詢

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

2)執(zhí)行查詢

搜索索引過程:根據(jù)查詢語法在倒排索引詞典表中分別找出對應搜索詞的索引,從而找到索引所鏈接的文檔鏈表。
比如搜索語法為“fileName:lucene”表示搜索出fileName域中包含Lucene的文檔。
搜索過程就是在索引上查找域為fileName,并且關鍵字為Lucene的term,并根據(jù)term找到文檔id列表。

3)渲染結(jié)果

全文檢索系統(tǒng)提供用戶搜索的界面供用戶提交搜索的關鍵字,搜索完成展示搜索結(jié)果。

以一個友好的界面將查詢結(jié)果展示給用戶,用戶根據(jù)搜索結(jié)果找自己想要的信息,為了幫助用戶很快找到自己的結(jié)果,提供了很多展示的效果,比如搜索結(jié)果中將關鍵字高亮顯示,百度提供的快照等。
基于Lucene的全文檢索系統(tǒng)的實現(xiàn)與應用,搜索引擎,全文檢索,lucene,搜索引擎

四、配置開發(fā)環(huán)境

1、Lucene下載

官方網(wǎng)站:http://lucene.apache.org/

Lucene是開發(fā)全文檢索功能的工具包,從官方網(wǎng)站下載Lucene4.10.3,并解壓。

2、需要使用的jar包

Lucene包:

  • lucene-core-4.10.3.jar
  • lucene-analyzers-common-4.10.3.jar
  • lucene-queryparser-4.10.3.jar

其它包:

  • commons-io-2.4.jar
  • junit-4.9.jar

五、功能實現(xiàn)

1、創(chuàng)建索引庫

1)實現(xiàn)步驟

  • 第一步:創(chuàng)建一個java工程,新建一個文件夾lib,并導入jar包,添加到工作路徑去。
  • 第二步:新建一個測試類,添加測試方法
  • 第三步:創(chuàng)建一個indexwriter對象。
    1)指定索引庫的存放位置Directory對象
    2)指定一個分析器,對文檔內(nèi)容進行分析。
  • 第四步:創(chuàng)建document對象。
  • 第五步:創(chuàng)建field對象,將field添加到document對象中。
  • 第六步:使用indexwriter對象將document對象寫入索引庫,此過程進行索引創(chuàng)建。并將索引和document對象寫入索引庫。
  • 第七步:關閉IndexWriter對象。

2)Field說明

Field域?qū)傩裕?/p>

  • 是否分析:是否對域的內(nèi)容進行分詞處理。前提是我們要對域的內(nèi)容進行查詢。
  • 是否索引:將Field分析后的詞或整個Field值進行索引,只有索引方可搜索到。
    比如:商品名稱、商品簡介分析后進行索引,訂單號、身份證號不用分析但也要索引,這些將來都要作為查詢條件。
  • 是否存儲:將Field值存儲在文檔中,存儲在文檔中的Field才可以從Document中獲取
    比如:商品名稱、訂單號,凡是將來要從Document中獲取的Field都要存儲。
  • 是否存儲的標準:是否要將內(nèi)容展示給用戶

Field類:
基于Lucene的全文檢索系統(tǒng)的實現(xiàn)與應用,搜索引擎,全文檢索,lucene,搜索引擎

3)代碼實現(xiàn)

import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.document.LongField;
import org.apache.lucene.document.StoredField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.junit.Test;

public class FirstLucene {
    
    @Test
    public void testIndex() throws Exception{
        //創(chuàng)建一個indexwriter對象
        Directory directory=FSDirectory.open(new File("F:\\time"));//索引庫
        Analyzer analyzer=new StandardAnalyzer();//官方分析器
        IndexWriterConfig config=new IndexWriterConfig(Version.LATEST, analyzer);
        IndexWriter iw=new IndexWriter(directory, config);
        //創(chuàng)建field對象,并添加到docement對象中
        File f=new File("F:\\source");
        File[] listFiles = f.listFiles();
        for (File file : listFiles) {
            //創(chuàng)建docement對象
            Document document=new Document();
            String file_name=file.getName();
            Field fileNameField=new TextField("fileName",file_name,Store.YES);
            long file_size=FileUtils.sizeOf(file);
            Field fileSizeField=new LongField("fileSize",file_size, Store.YES);
            String file_path=file.getPath();
            Field filePathField=new StoredField("filePath",file_path);
            String file_content=FileUtils.readFileToString(file);
            Field fileContentField=new TextField("fileContent",file_content,Store.YES);
            
            document.add(fileNameField);
            document.add(fileSizeField);
            document.add(filePathField);
            document.add(fileContentField);
            //使用indexwriter對象將document對象寫入索引庫
            iw.addDocument(document);
        }
            //關閉IndexWriter對象
            iw.close();
    }
}

4)使用Luke工具查看索引文件

啟動后,填入我們的索引路徑即可
基于Lucene的全文檢索系統(tǒng)的實現(xiàn)與應用,搜索引擎,全文檢索,lucene,搜索引擎

2、查詢索引

1)實現(xiàn)步驟

  • 第一步:創(chuàng)建一個Directory對象,也就是索引庫存放的位置。
  • 第二步:創(chuàng)建一個indexReader對象,需要指定Directory對象。
  • 第三步:創(chuàng)建一個indexsearcher對象,需要指定IndexReader對象
  • 第四步:創(chuàng)建一個TermQuery對象,指定查詢的域和查詢的關鍵詞。
  • 第五步:執(zhí)行查詢。
  • 第六步:返回查詢結(jié)果。遍歷查詢結(jié)果并輸出。
  • 第七步:關閉IndexReader對象

2)IndexSearcher搜索方法

基于Lucene的全文檢索系統(tǒng)的實現(xiàn)與應用,搜索引擎,全文檢索,lucene,搜索引擎

3)代碼實現(xiàn)

//搜索索引
    @Test
    public void testSearch() throws Exception{
        //創(chuàng)建一個Directory對象,也就是索引庫存放的位置。
        Directory directory=FSDirectory.open(new File("F:\\time"));
        //創(chuàng)建一個indexReader對象,需要指定Directory對象。
        IndexReader ir=DirectoryReader.open(directory);
        //創(chuàng)建一個indexsearcher對象,需要指定IndexReader對象
        IndexSearcher indexsearcher=new IndexSearcher(ir);
        //創(chuàng)建一個TermQuery對象,指定查詢的域和查詢的關鍵詞。
        Query query=new TermQuery(new Term("fileName","notice.txt"));
        //執(zhí)行查詢。
        TopDocs topDocs = indexsearcher.search(query, 2);
        //返回查詢結(jié)果。遍歷查詢結(jié)果并輸出。
        ScoreDoc[] scoreDocs = topDocs.scoreDocs;//文檔id
        for (ScoreDoc scoreDoc : scoreDocs) {
            int doc = scoreDoc.doc;
            Document document = indexsearcher.doc(doc);//獲取文檔
            String fileName = document.get("fileName");
            System.out.println(fileName);
            String fileContent = document.get("fileContent");
            System.out.println(fileContent);
            String fileSize= document.get("fileSize");
            System.out.println(fileSize);
            String filePath = document.get("filePath");
            System.out.println(filePath);
            System.out.println("-----------------------------");
        }
        //關閉IndexReader對象
        ir.close();
    }

3、支持中文分詞

1)分析器(Analyzer)的執(zhí)行過程

如下圖是語匯單元的生成過程:
基于Lucene的全文檢索系統(tǒng)的實現(xiàn)與應用,搜索引擎,全文檢索,lucene,搜索引擎
從一個Reader字符流開始,創(chuàng)建一個基于Reader的Tokenizer分詞器,經(jīng)過三個TokenFilter生成語匯單元Tokens。

要看分析器的分析效果,只需要看Tokenstream中的內(nèi)容就可以了。每個分析器都有一個方法tokenStream,返回一個tokenStream對象。

2)選擇中文分析器

Lucene自帶中文分詞器:

  • StandardAnalyzer:單字分詞,按照中文一個字一個字地進行分詞。如:“我愛中國”,效果:“我”、“愛”、“中”、“國”。
  • CJKAnalyzer:二分法分詞,按兩個字進行切分。如:“我是中國人”,效果:“我是”、“是中”、“中國”“國人”。
  • SmartChineseAnalyzer:對中文支持較好,但擴展性差,擴展詞庫,禁用詞庫和同義詞庫等不好處理

第三方中文分析器

IK-analyzer: 最新版在https://code.google.com/p/ik-analyzer/上,支持Lucene 4.10從2006年12月推出1.0版開始, IKAnalyzer已經(jīng)推出了4個大版本。最初,它是以開源項目Luence為應用主體的,結(jié)合詞典分詞和文法分析算法的中文分詞組件。從3.0版本開 始,IK發(fā)展為面向Java的公用分詞組件,獨立于Lucene項目,同時提供了對Lucene的默認優(yōu)化實現(xiàn)。在2012版本中,IK實現(xiàn)了簡單的分詞 歧義排除算法,標志著IK分詞器從單純的詞典分詞向模擬語義分詞衍化。 但是也就是2012年12月后沒有在更新。

IKAnalyzer使用
基于Lucene的全文檢索系統(tǒng)的實現(xiàn)與應用,搜索引擎,全文檢索,lucene,搜索引擎
第一步:把IKAnalyzer2012FF_u1.jar包添加到工程中
第二步:把配置文件和擴展詞典和停用詞詞典添加到classpath下
基于Lucene的全文檢索系統(tǒng)的實現(xiàn)與應用,搜索引擎,全文檢索,lucene,搜索引擎
測試代碼

	@Test
    public void testTokenStream() throws Exception {
        // 創(chuàng)建一個標準分析器對象
        Analyzer analyzer = new IKAnalyzer();
        // 獲得tokenStream對象
        // 第一個參數(shù):域名,可以隨便給一個
        // 第二個參數(shù):要分析的文本內(nèi)容
        TokenStream tokenStream = analyzer.tokenStream("test","高富帥可以用二維表結(jié)構(gòu)來邏輯表達實現(xiàn)的數(shù)據(jù)");
        // 添加一個引用,可以獲得每個關鍵詞
        CharTermAttribute charTermAttribute = tokenStream.addAttribute(CharTermAttribute.class);
        // 添加一個偏移量的引用,記錄了關鍵詞的開始位置以及結(jié)束位置
        OffsetAttribute offsetAttribute = tokenStream.addAttribute(OffsetAttribute.class);
        // 將指針調(diào)整到列表的頭部
        tokenStream.reset();
        // 遍歷關鍵詞列表,通過incrementToken方法判斷列表是否結(jié)束
        while (tokenStream.incrementToken()) {
            // 關鍵詞的起始位置
            System.out.println("start->" + offsetAttribute.startOffset());
            // 取關鍵詞
            System.out.println(charTermAttribute);
            // 結(jié)束位置
            System.out.println("end->" + offsetAttribute.endOffset());
        }
        tokenStream.close();
    }

基于Lucene的全文檢索系統(tǒng)的實現(xiàn)與應用,搜索引擎,全文檢索,lucene,搜索引擎
ext.dic里面保留要的字段
stopword.dic保留不要的字段

3)Analyzer使用時機

輸入關鍵字進行搜索,當需要讓該關鍵字與文檔域內(nèi)容所包含的詞進行匹配時需要對文檔域內(nèi)容進行分析,需要經(jīng)過Analyzer分析器處理生成語匯單元(Token)。分析器分析的對象是文檔中的Field域。當Field的屬性tokenized(是否分詞)為true時會對Field值進行分析,如下圖:
基于Lucene的全文檢索系統(tǒng)的實現(xiàn)與應用,搜索引擎,全文檢索,lucene,搜索引擎
對于一些Field可以不用分析:
1、不作為查詢條件的內(nèi)容,比如文件路徑
2、不是匹配內(nèi)容中的詞而匹配Field的整體內(nèi)容,比如訂單號、身份證號等。

注意:搜索使用的分析器要和索引使用的分析器一致。

3、維護索引庫

新建一個class,用于測試

1)索引庫刪除

刪除全部

package com.it.lucene;

import java.io.File;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.junit.Test;

public class LuceneManager {
    public IndexWriter getIndexWriter() throws Exception{
          //創(chuàng)建一個indexwriter對象
        Directory directory=FSDirectory.open(new File("F:\\time"));//索引庫
        Analyzer analyzer=new StandardAnalyzer();//官方分析器
        IndexWriterConfig config=new IndexWriterConfig(Version.LATEST, analyzer);
        return new IndexWriter(directory, config);
    }
    //全刪除
    @Test
    public void testAllDelete() throws Exception{
        IndexWriter indexWriter=getIndexWriter();
        indexWriter.deleteAll();
        indexWriter.close();
    }
}

指定查詢條件刪除

	//根據(jù)條件刪除
    @Test
    public void testDelete() throws Exception{
        IndexWriter indexWriter=getIndexWriter();
        Query query=new TermQuery(new Term("fileName","notice.txt"));
        indexWriter.deleteDocuments(query);
        indexWriter.close();
    }

2)索引庫修改

原理就是先刪除后添加。

	//修改
    @Test
    public void testUpdate() throws Exception{
        IndexWriter indexWriter=getIndexWriter();
        Document doc=new Document();
        doc.add(new TextField("fileN","測試文件名",Store.YES));
        indexWriter.updateDocument(new Term("fileName","notice"),doc,new IKAnalyzer());
        indexWriter.close();
    }

六、Lucene索引庫查詢(重點)

對要搜索的信息創(chuàng)建Query查詢對象,Lucene會根據(jù)Query查詢對象生成最終的查詢語法,類似關系數(shù)據(jù)庫Sql語法一樣Lucene也有自己的查詢語法,比如:“name:lucene”表示查詢Field的name為“l(fā)ucene”的文檔信息。

可通過兩種方法創(chuàng)建查詢對象:

1)使用Lucene提供Query子類
Query是一個抽象類,lucene提供了很多查詢對象,比如TermQuery項精確查詢,NumericRangeQuery數(shù)字范圍查詢等。
如下代碼:

Query query = new TermQuery(new Term("name", "lucene"));

2)使用QueryParse解析查詢表達式
QueryParse會將用戶輸入的查詢表達式解析成Query對象實例。
如下代碼:

QueryParser queryParser = new QueryParser("name", new IKAnalyzer());
Query query = queryParser.parse("name:lucene");

1、使用query的子類查詢

使用MatchAllDocsQuery查詢索引目錄中的所有文檔

public IndexSearcher getIndexSearcher() throws Exception{
      //創(chuàng)建一個Directory對象,也就是索引庫存放的位置。
    Directory directory=FSDirectory.open(new File("F:\\time"));
    //創(chuàng)建一個indexReader對象,需要指定Directory對象。
    IndexReader ir=DirectoryReader.open(directory);
    //創(chuàng)建一個indexsearcher對象,需要指定IndexReader對象
    return new IndexSearcher(ir);
}

//執(zhí)行查詢結(jié)果
public static void printResult(IndexSearcher indexsearcher,Query query) throws Exception{  
    //執(zhí)行查詢。
    TopDocs topDocs = indexsearcher.search(query, 2);
    //返回查詢結(jié)果。遍歷查詢結(jié)果并輸出。
    ScoreDoc[] scoreDocs = topDocs.scoreDocs;//文檔id
    for (ScoreDoc scoreDoc : scoreDocs) {
        int doc = scoreDoc.doc;
        Document document = indexsearcher.doc(doc);//獲取文檔
        String fileName = document.get("fileName");
        System.out.println(fileName);
        String fileContent = document.get("fileContent");
        System.out.println(fileContent);
        String fileSize= document.get("fileSize");
        System.out.println(fileSize);
        String filePath = document.get("filePath");
        System.out.println(filePath);
        System.out.println("-----------------------------");
    }
} 
//查詢所有
@Test
public void testMatchAllDocsQuery() throws Exception{
    IndexSearcher indexSearcher=getIndexSearcher();
    Query query=new MatchAllDocsQuery();
    printResult(indexSearcher,query);
    indexSearcher.getIndexReader().close();
}

TermQuery:指定要查詢的域和要查詢的關鍵詞。
TermQuery不使用分析器,所以建議匹配不分詞的Field域查詢,比如訂單號、分類ID號等。

//使用Termquery查詢
@Test
public void testTermQuery() throws Exception {
    IndexSearcher indexSearcher = getIndexSearcher();
    //創(chuàng)建查詢對象
    Query query = new TermQuery(new Term("fileName", "notice"));
    //執(zhí)行查詢
    TopDocs topDocs = indexSearcher.search(query, 10);
    //共查詢到的document個數(shù)
    System.out.println("查詢結(jié)果總數(shù)量:" + topDocs.totalHits);
}

NumericRangeQuery:可以根據(jù)數(shù)值范圍查詢

//根據(jù)數(shù)值范圍查詢
@Test
public void testNumericRangeQuery() throws Exception{
    IndexSearcher indexSearcher=getIndexSearcher();
    Query query=NumericRangeQuery.newLongRange("fileSize", 1L, 20000L, true, true);
    printResult(indexSearcher,query);
    indexSearcher.getIndexReader().close();
}

BooleanQuery:可以組合查詢條件

//組合條件查詢
@Test
public void testBooleanQuery() throws Exception {
    IndexSearcher indexSearcher = getIndexSearcher();
    //創(chuàng)建一個布爾查詢對象
    BooleanQuery query = new BooleanQuery();
    //創(chuàng)建第一個查詢條件
    Query query1 = new TermQuery(new Term("fileName", "notice"));
    Query query2 = new TermQuery(new Term("fileContent", "has"));
    //組合查詢條件
    query.add(query1, Occur.SHOULD);
    query.add(query2, Occur.SHOULD);
    //執(zhí)行查詢
    printResult(indexSearcher,query);
}

2、使用queryparser查詢

通過QueryParser也可以創(chuàng)建Query,QueryParser提供一個Parse方法,此方法可以直接根據(jù)查詢語法來查詢。

注:需要使用到分析器的話,建議創(chuàng)建索引和查詢索引使用的分析器要一致。

1)查詢語法

1、基礎的查詢語法,關鍵詞查詢:
域名+“:”+搜索的關鍵字
例如:content:java

2、范圍查詢
域名+“:”+[最小值 TO 最大值]
例如:size:[1 TO 1000]
范圍查詢在lucene中支持數(shù)值類型,不支持字符串類型。在solr中支持字符串類型。

3、組合條件查詢

  • 寫法1:
    Occur.MUST 查詢條件必須滿足,相當于and:+
    Occur.SHOULD 查詢條件可選,相當于or:空
    Occur.MUST_NOT 查詢條件不能滿足,相當于not非:-

1)+條件1 +條件2:兩個條件之間是并且的關系and
例如:+filename:apache +content:apache
2)+條件1 條件2:必須滿足第一個條件,應該滿足第二個條件
例如:+filename:apache content:apache
3)條件1 條件2:兩個條件滿足其一即可。
例如:filename:apache content:apache
4)-條件1 條件2:必須不滿足條件1,要滿足條件2
例如:-filename:apache content:apache

寫法2:

  • 條件1 AND 條件2
  • 條件1 OR 條件2
  • 條件1 NOT 條件2

2)使用

QueryParser

//條件解析的對象查詢      @Test
public void testQueryParser() throws Exception {
    IndexSearcher indexSearcher = getIndexSearcher();
    //創(chuàng)建queryparser對象
    //第一個參數(shù)默認搜索的域
    //第二個參數(shù)就是分析器對象
    QueryParser queryParser = new QueryParser("fileName",new IKAnalyzer());
    //*:* 域:值
    Query query = queryParser.parse("notice");
    //執(zhí)行查詢
    printResult(indexSearcher,query);
}

MultiFieldQueryParser:可以指定多個默認搜索域文章來源地址http://www.zghlxwxcb.cn/news/detail-756033.html

//條件解析的對象查詢 多個默認域
@Test
public void testMultiFiledQueryParser() throws Exception {
    IndexSearcher indexSearcher = getIndexSearcher();
    //可以指定默認搜索的域是多個
    String[] fields = {"fileName", "fileContent"};
    //創(chuàng)建一個MulitFiledQueryParser對象
    MultiFieldQueryParser queryParser = new MultiFieldQueryParser(fields, new IKAnalyzer());
    Query query = queryParser.parse("java AND apache");
    System.out.println(query);
    //執(zhí)行查詢
    printResult(indexSearcher,query);
    
}

到了這里,關于基于Lucene的全文檢索系統(tǒng)的實現(xiàn)與應用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 高性能的全文檢索庫Apache Lucene 介紹

    高性能的全文檢索庫Apache Lucene 介紹

    ????????Apache Lucene 是一個高性能的全文檢索庫,由 Apache Software Foundation 維護。Lucene 提供了豐富的 API,用于實現(xiàn)快速、準確的全文搜索。本文將詳細介紹 Apache Lucene 的技術特點、應用場景和優(yōu)勢。 ????????Apache Lucene 的歷史和發(fā)展 ????????Apache Lucene 起源于 1999 年

    2024年03月27日
    瀏覽(24)
  • Lucene全文檢索,阿里面試100%會問到的JVM

    Lucene全文檢索,阿里面試100%會問到的JVM

    全文檢索大體分兩個過程,索引創(chuàng)建(Indexing):將現(xiàn)實世界中所有的結(jié)構(gòu)化和非結(jié)構(gòu)化數(shù)據(jù)提取信息,搜索索引(Search):通過用戶的查詢請求搜索創(chuàng)建的索引,然后返回查詢結(jié)果的過程。 Lucene實現(xiàn)全文檢索的也同樣需要這兩個過程,其具體實現(xiàn)如下: 創(chuàng)建索引: 獲得文檔,表

    2024年03月20日
    瀏覽(26)
  • Java輕量級全文檢索引擎Lucene使用及優(yōu)化

    Lucene是一個開源的全文檢索引擎工具包由Doug Cutting編寫。它被設計用于實現(xiàn)全文搜索功能,即讀入一堆文本文件并將其轉(zhuǎn)換為易于搜索的數(shù)據(jù)結(jié)構(gòu)。Lucene提供了一組簡單而強大的API,使得索引和搜索過程變得非常方便。 Lucene廣泛應用于從1200萬站點中進行互聯(lián)網(wǎng)搜索等搜索引

    2024年02月16日
    瀏覽(19)
  • Lucene和Solr和Elasticsearch區(qū)別,全文檢索引擎工具包Lucene索引流程和搜索流程實操

    Lucene和Solr和Elasticsearch區(qū)別,全文檢索引擎工具包Lucene索引流程和搜索流程實操

    我們生活中的數(shù)據(jù)總體分為兩種: 結(jié)構(gòu)化數(shù)據(jù)和非結(jié)構(gòu)化數(shù)據(jù) 。 結(jié)構(gòu)化數(shù)據(jù) :指具有固定格式或有限長度的數(shù)據(jù),如數(shù)據(jù)庫,元數(shù)據(jù)等。 非結(jié)構(gòu)化數(shù)據(jù) :指不定長或無固定格式的數(shù)據(jù),如 互聯(lián)網(wǎng)數(shù)據(jù)、郵件,word文檔等。 非結(jié)構(gòu)化數(shù)據(jù)又有一種叫法叫全文數(shù)據(jù) 按照數(shù)據(jù)的

    2024年02月03日
    瀏覽(28)
  • 基于數(shù)據(jù)庫的全文檢索實現(xiàn)

    基于數(shù)據(jù)庫的全文檢索實現(xiàn)

    對于內(nèi)容摘要,信件內(nèi)容進行全文檢索 基于SpringBoot 2.5.6+Postgresql+jpa+hibernate實現(xiàn) 登記保存之后,處理完成業(yè)務邏輯,發(fā)送全文檢索事件 處理業(yè)務發(fā)送全文檢索事件 統(tǒng)一處理全文檢索事件 sql大致就是這樣的邏輯 事件處理機制請看另一篇文章 自定義事件處理機制

    2024年03月12日
    瀏覽(37)
  • ElasticSearch+Neo4j+ElasticSearch Head實現(xiàn)全文檢索應用

    本文主要闡述利用ES、知識圖譜(Neo4j)實現(xiàn)全文檢索,并利用ElasticSearch Head開源項目進行全文檢索測試。實驗在圖譜的幫助下如何開展全文檢索功能,為后續(xù)的復雜查詢或語義檢索做準備。 一、運行環(huán)境 1.Linux 7.5 2.JDK 1.8.0_191 3.ElasticSearch 7.17.4,注意用ES自帶的jdk,因為這個版

    2024年02月09日
    瀏覽(15)
  • 雙方案-基于Mysql 與 ElasticSearch實現(xiàn)關鍵詞提示搜索與全文檢索

    雙方案-基于Mysql 與 ElasticSearch實現(xiàn)關鍵詞提示搜索與全文檢索

    就喜歡搞這種不需要怎么費勁的東西,只需要把思路闡述清楚,隨筆性質(zhì)的博文,順手啊,幾乎不用改定就可以當博文發(fā)布出去。 那么,這里的話我們要做的就是實現(xiàn)這個的一個搜索功能,這個前端我就不說了,實現(xiàn)起來起來其實還是容易的,就是費勁。我們主要關注

    2024年01月18日
    瀏覽(24)
  • 實現(xiàn)全文檢索的方法

    實現(xiàn)網(wǎng)站全文檢索功能,可以采取多種方法,從簡單的基于數(shù)據(jù)庫的搜索到使用專門的全文檢索系統(tǒng)。以下是一些常見的實現(xiàn)全文檢索的方法: 1. **數(shù)據(jù)庫全文索引**: ? ?如果你的網(wǎng)站后端使用的是關系型數(shù)據(jù)庫(如MySQL),大多數(shù)數(shù)據(jù)庫管理系統(tǒng)都提供了全文索引的功能。

    2024年04月26日
    瀏覽(18)
  • mysql8全文檢索應用之二:Mybatis-Plus

    mysql8全文檢索應用之二:Mybatis-Plus

    上篇( mysql8全文檢索應用之一:參數(shù)設置)介紹了mysql服務器參數(shù)配置、full text索引,這篇介紹如何在Mybatis-Plus下應用全文檢索。 最少要3.5.0版本以上,Mybatis-Plus 3.5.0版本以下的jsqlparser組件支持mysql 全文檢索方面有bug,jsqlparser 4.3版本徹底修復了對mysql 全文檢索(match() agai

    2023年04月18日
    瀏覽(25)
  • Mysql 簡單實現(xiàn)全文檢索(FULLTEXT)

    版本支持 MySQL 5.6 以前的版本,只有 MyISAM 存儲引擎支持全文索引; MySQL 5.6 及以后的版本,MyISAM 和 InnoDB 存儲引擎均支持全文索引; 只有字段的數(shù)據(jù)類型為 char、varchar、text 及其系列才可以建全文索引。 按順序操做: 1.修改數(shù)據(jù)庫配置 etc/my.cnf 文件 [mysqld] 下面加入 ngram_token_s

    2024年02月09日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包