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框架全文检索搜索引擎方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java中文 x_java环境url中文
- 下一篇: java中除金额_《java中把金额以3