Lucene筆記36-Lucene運用到專案中-需求分析
一、需求分析
索引的目標
現在需要設計一個留言管理系統,我們需要對哪些欄位建立索引呢?
- 留言的內容
- 留言的標題
- 留言的附件
索引的物件
索引的物件,要存放什麼屬性呢?
- messageId
- title
- summary
- createDate
- content:這裡的content存放了文字內容或者附件內容
既然上面說到content既可以存放文字內容,又可以存放附件內容,那麼文字內容id和附件內容id就有可能衝突,怎麼解決這個衝突呢?這裡的附件id就不要使用int來儲存,而是使用String來儲存,因為,我們可以規定x_y的形式,如果存放的是文字,那麼x_y代表文字,其中x為0,y為文字id,如果存放的是附件,其中x代表文字id,y代表x下的附件id,這就巧妙的將id衝突問題解決了,而且還非常巧妙的綁定了文字和附件的關係。
搜尋的業務需求
是否做實時搜尋(只能做到近實時搜尋)?什麼時候更新索引?
完全實時搜尋:只要資料庫一變動,立刻執行indexWriter的commit()方法更新索引資料,不過這樣的做法效能非常的低。
近實時搜尋:當用戶做了修改之後,先將索引儲存到記憶體當中,在一個統一的時間,對記憶體中的所有索引進行統一的提交操作。
相關推薦
Lucene筆記36-Lucene運用到專案中-需求分析
一、需求分析 索引的目標 現在需要設計一個留言管理系統,我們需要對哪些欄位建立索引呢? 留言的內容 留言的標題 留言的附件 索引的物件 索引的物件,要存放什麼屬性呢? messageId title summary creat
Lucene筆記38-Lucene在專案中的實現分析
一、實時搜尋中存在的問題 上一節我們提到NRT實時搜尋,實時搜尋的提交併不是實時的,可能要好幾個小時才能提交一次,為什麼搜尋這麼快呢,因為索引資料更新都在記憶體中實現的,那麼,假設有這麼一種情況,還沒有提交,機器突然掛掉了,那硬碟上的資料還是舊的,就會存在資料不一致的問題了。現在有一個解決方
筆記:elasticsearch在專案中的使用需求
(摘抄自公司大牛的筆記,自己總結一下) 類比mysql,我們需要=、>、>=、<、<= 、or、and、in、like、count、sum、group by、order by、limit 在高版本的ES裡面使用了boolquery替換
Lucene筆記26-Lucene的使用-自定義QueryParser解決部分查詢的效能問題
一、使用自定義QueryParser的原因 對於某些QueryParser(FuzzyQuery、WildcardQuery)在查詢時會使得效能降低,所以考慮將這些查詢取消。 在具體的查詢時候,很可能有這樣一種需求:獲取的是一個數字查詢範圍,所以必須要擴充套件原有的QueryPa
Lucene筆記25-Lucene的使用-根據域進行評分設定
一、需求 根據檔名來設定評分規則,或者根據文件的修改時間,將最近一年的評分加倍,一年以外的評分降低,等等。 二、具體實現 這裡根據檔名來修改評分規則,檔名中包含“JRE”和“SYSTEM”的評分加倍,其餘減倍。重點就是怎麼獲取到檔名,在customScore()方法中,有一個doc變
Lucene筆記24-Lucene的使用-自定義評分簡介
一、自定義評分流程 有時候,Lucene提供的計算評分規則可能不符合業務需求,所以我們需要自定義評分規則,來實現自定義評分。自定義評分的流程:建立一個類繼承CustomScoreQuery、重寫getCustomScoreProvider()方法、建立CustomScoreProvider類
Lucene筆記23-Lucene的使用-簡單複習索引、檢索和分詞
一、索引 索引過程中的核心類:IndexWriter、Directory、Analyzer、Document、Field。 IndexWriter用來寫索引。 Directory用來定義索引的目標位置是硬碟上還是記憶體中。 Analyzer用來分詞,常用的分詞器有:SimpleA
Lucene筆記22-Lucene的使用-Filter
一、Filter應用場景 假如有人搜尋了一個關鍵詞,通過Lucene查出來了所有的文件,讀者比較關心最新的一些內容,因此需要將某些內容過濾掉。只顯示使用者敏感的文件資料即可。這就要用到過濾器。 二、程式碼演示 public void filter(String queryString
Lucene筆記21-Lucene的自定義排序
一、排序介紹 Lucene對文件搜尋完成後,顯示的結果是有一個順序的,如果沒有設定排序規則,那麼這個順序就是按照文件的評分降序排列,至於評分的計算,是一個比較複雜的公式,這裡不先研究了。可是有時候,我們需要根據需求,改變預設的排序規則,這時候就要用到自定義排序啦,下面來看一下自定義排序是怎麼
Lucene筆記20-Lucene的分詞-實現自定義同義詞分詞器-實現分詞器(良好設計方案)
一、目前存在的問題 在getSameWords()方法中,我們使用map臨時存放了兩個鍵值對用來測試,實際開發中,往往需要很多的這種鍵值對來處理,比如從某個同義詞詞典裡面獲取值之類的,所以說,我們需要一個類,根據key提供近義詞。 為了能更好的適應應用場景,我們先定義一個介面,其中定義一
Lucene筆記19-Lucene的分詞-實現自定義同義詞分詞器-實現分詞器
一、同義詞分詞器的程式碼實現 package com.wsy; import com.chenlb.mmseg4j.Dictionary; import com.chenlb.mmseg4j.MaxWordSeg; import com.chenlb.mmseg4j.analysis.MM
Lucene筆記18-Lucene的分詞-實現自定義同義詞分詞器-思路分析
一、實現自定義同義詞分詞器思路分析 前面文章我們提到同義詞分詞器,這裡我們先來分析下同義詞分詞器的設計思路。 首先我們有一個需要分詞的字串string,通過new StringReader(string)拿到Reader。 使用analyzer.tokenStream("co
Lucene筆記17-Lucene的分詞-中文分詞介紹
一、分詞器的作用 分詞器的作用就是得到一個TokenStream流,這個流中儲存了分詞相關的一些資訊,可以通過屬性獲取到分詞的詳細資訊。 二、自定義Stop分詞器 package com.wsy; import org.apache.lucene.analysis.*; impor
Lucene筆記16-Lucene的分詞-通過TokenStream顯示分詞的詳細資訊
一、通過TokenStream檢視分詞的詳細資訊 package com.wsy; import org.apache.lucene.analysis.*; import org.apache.lucene.analysis.standard.StandardAnalyzer; impor
Lucene筆記15-Lucene的分詞-通過TokenStream顯示分詞
一、展示分詞內容 package com.wsy; import org.apache.lucene.analysis.*; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.luc
Lucene筆記14-Lucene的分詞-分詞器的原理講解
一、分詞器原理 最主要的分詞器有SimpleAnalyzer、StopAnalyzer、WhitespaceAnalyzer、StandardAnalyzer。 先來研究一下SimpleAnalyzer。當一串資料傳進來之後,會被轉化成TokenStream這樣一個東西,這個TokenS
Lucene筆記13-Lucene的搜尋-基於searchAfter的實現
一、使用searchAfter完成分頁查詢 searchAfter()方法原理是獲取上一頁的最後一個元素和pageSize,再從最後一個元素的後一個開始取pageSize條資料,這就是需要展示的結果了。searchAfter()方法需要三個引數:ScoreDoc after, Query q
Lucene筆記12-Lucene的搜尋-複習和再查詢分頁搜尋
一、Lucene的分頁搜尋 Lucene的分頁不像資料庫中的limit的方式,而是提供了一種“再查詢”的方式。什麼是“再查詢”呢?就是第一次把所有的資料都取出來,第二次查詢再根據需求,從第幾條取到第幾條,分兩步進行查詢,所以叫“再查詢”。 二、測試程式碼 package com.ws
Lucene筆記11-Lucene的搜尋-基於QueryParser的搜尋
一、QueryParser查詢 QueryParser查詢功能是非常強大的,幾乎可以涵蓋前面所有的查詢,下面是方法體,它將query作為引數傳遞進來。 // 表示式查詢 public void searchByQueryParser(Query query, int number) {
Lucene筆記10-Lucene的搜尋-其他常用Query搜尋
一、字首搜尋 // 字首查詢 public void searchByPrefix(String field, String name, int number) { IndexSearcher indexSearcher = getIndexSearcher(); try {