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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

java全文检索的框架_lucene框架全文检索搜索引擎方案

發布時間:2024/10/6 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java全文检索的框架_lucene框架全文检索搜索引擎方案 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

搜索引擎技術方案

搜索引擎方案

功能需求背景:

----有搜索引擎需求

功能需求

提高查詢效率,關鍵詞全文檢索。

不需要訪問多次數據庫,只能一次數據庫查詢。

準確關鍵詞全文檢索。

由于查詢功能效率較差,等待時間過長,數據量大以及多租戶多用戶關系查詢。

需求分析

提高用戶體驗,查詢效率,關鍵詞全文檢索。

準確性查找關鍵詞全文檢索數據,不使用模糊查詢。

多租戶與用戶關系:多對多,多對一,一對多。

根據多租戶與用戶關系來關鍵詞全文檢索。

解決方案(建議使用lucene框架搜索引擎)

方案一:(推薦)

第一步:定義一個租戶標識作為索引庫(即服務器盤符文件夾路徑)。

第二步:dataId+用戶標識=idField(索引庫id)。

第三步:指定檢索字段拼接于nameField(索引庫name)

第四步:對索引庫增刪改。

第五步:全文檢索出該租戶下所有符合的關鍵詞檢索(可以設置檢索的前幾條)。

第六步:通過用戶標識過濾用戶數據,從idField(索引庫id)解析dataId保存數據集。

第七步:通過dataId數據集去數據庫查找對應數據(id查詢結果集)。

第八步:查詢結果集返回頁面查詢。

方案二:

第一步:定義一個索引庫(即服務器盤符文件夾路徑)。

第二步:租戶標識+dataId+用戶標識=idField(索引庫id)。

第三步:指定檢索字段拼接于nameField(索引庫name)

第四步:對索引庫增刪改。

第五步:全文檢索出該租戶下所有符合的關鍵詞檢索(可以設置檢索的前幾條)。

第六步:通過租戶標識過濾租戶數據,通過用戶標識過濾用戶數據,從idField(索引庫id)解析dataId保存數據集。

第七步:通過dataId數據集去數據庫查找對應數據(id查詢結果集)。

第八步:查詢結果集返回頁面查詢。

Lucene索引結構圖解

Lucene全文檢索說明

索引庫的增、刪、改是由indexWriter來操作的

同一個時刻內。同一個索引庫,僅僅能同意一個indexWriter操作

當IndexWriter創建完畢以后,indexwriter所指向的索引庫就被占據了。僅僅有當indexWriter.close時。才干釋放鎖的資源

當一個新的indexWriter想擁有索引庫時,原來的indexWriter必須釋放鎖

僅僅要索引庫中存在write.lock文件,說明上鎖了

indexWriter.close有兩層含義:1.?關閉IO資源; 2.釋放鎖

能夠設置非常多個索引庫.

索引庫能不能合并起來?

假設是內存索引庫

Directory ramDirectory = new RamDirectory(Directory d);

這樣就能夠把一個索引庫放入到內存索引庫中

利用IndexWriter.addIndexesNoOptimize方法能夠把非常多個索引庫進行合并操作.

應用程序能不能在內存中和索引庫進行交互.

搜索引擎實現

索引庫寫入信息

public void testCreateIndex() throws Exception{

/**

* 1、創建一個student對象,而且把信息存放進去

* 2、調用indexWriter的API把數據存放在索引庫中

* 3、關閉indexWriter

*/

// 創建一個Student對象。而且把信息存放進去

Student student = new Student();

student.setId(1L);

student.setName("張三");

// 調用indexWriter的API把數據存放在索引庫中

/**

* 創建一個IndexWriter

*? ? 參數三個 1、索引庫, 指向索引庫的位置? 2、分詞器

*/

// 創建索引庫

Directory directory = FSDirectory.open(new File("./indexDir"));

// 創建分詞器

Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);

IndexWriter indexWriter = new IndexWriter(directory, analyzer, MaxFieldLength.LIMITED);

// 把一個student對象轉化成document

Document document = new Document();

Field idField = new Field("id",student.getId().toString(),Store.YES,Index.NOT_ANALYZED);

Field nameField = new Field("name",student.getName(),Store.YES,Index.ANALYZED);

document.add(idField);

document.add(nameField);

indexWriter.addDocument(document);

// 關閉indexWriter

indexWriter.close();

}

索引庫讀取信息

public void testSearchIndex() throws Exception{

/**

* 1、創建一個IndexSearch對象

* 2、調用search方法進行檢索

* 3、輸出內容

*/

// 創建一個 IndexSearch對象

Directory directory = FSDirectory.open(new File("./indexDir"));

IndexSearcher indexSearcher = new IndexSearcher(directory);

// 調用search方法進行檢索

Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);

QueryParser queryParser = new QueryParser(Version.LUCENE_30,"name",analyzer);

Query query = queryParser.parse("張");? // 要查找的關鍵詞

TopDocs topDocs = indexSearcher.search(query, 2);? // 前兩條

int count = topDocs.totalHits;? // 依據關鍵詞查詢出來的總的記錄數

ScoreDoc[] scoreDocs = topDocs.scoreDocs;

List studentList = new ArrayList();

for(ScoreDoc scoreDoc:scoreDocs){

float score = scoreDoc.score;? // 關鍵詞得分

int index = scoreDoc.doc;? // 索引的下標

Document document = indexSearcher.doc(index);

// 把document轉化成Student

Student student = new? Student();

student.setId(Long.parseLong(document.get("id")));? // document.getField("id").stringValue()

student.setTitle(document.get("name"));

studentList.add(student);

}

for(Student student:studentList){

System.out.println(student.getId());

System.out.println(student.getName());

}

}

總結

以上是生活随笔為你收集整理的java全文检索的框架_lucene框架全文检索搜索引擎方案的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。