lucene過濾索引
『壹』 請教lucene indexsearcher查詢後不關閉引起的索引問題
看一下是不是建索引的問題(Field選取的不對,一般id欄位用Field.Index.NOT_ANALYZED),
我用lucene 3.6.2, IKAnalyzer2012_u6.jar測試的
import java.io.File;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import 搜索org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.wltea.analyzer.lucene.IKAnalyzer;
public class LucenDemo {
public static void main(String[] args) {
String id = "456";
createIndex();
printTotalHits(id);
deleteById(id);
printTotalHits(id);
}
static String indexPath = "E:\\lucene-demo-index\\";
public static void printTotalHits(String id) {
try {
Analyzer anal = new IKAnalyzer(true);
MultiFieldQueryParser parser = new MultiFieldQueryParser(Version.LUCENE_36, new String[] {"id"}, anal);
Query query = parser.parse(id);
Directory dir = FSDirectory.open(new File(indexPath));
IndexReader indexReader = IndexReader.open(dir);
IndexSearcher searcher = new IndexSearcher(indexReader);
System.out.println(searcher.search(query, 10).totalHits);
indexReader.close();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void deleteById(String id) {
try {
Analyzer anal = new IKAnalyzer(true);
MultiFieldQueryParser parser = new MultiFieldQueryParser(Version.LUCENE_36, new String[] {"id"}, anal);
Query query = parser.parse(id);
Directory dir = FSDirectory.open(new File(indexPath));
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_36,anal);
IndexWriter indexWriter = new IndexWriter(dir, config);
indexWriter.deleteDocuments(query);
indexWriter.commit();
indexWriter.close();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void createIndex() {
try {
Analyzer analyzer = new IKAnalyzer(true);
Directory dir = FSDirectory.open(new File(indexPath));
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_36, analyzer);
IndexWriter indexWriter = new IndexWriter(dir, config);
Document doc1 = new Document();
doc1.add(new Field("id", false, "123", Field.Store.YES, Field.Index.NOT_ANALYZED, Field.TermVector.NO));
indexWriter.addDocument(doc1);
Document doc2 = new Document();
doc2.add(new Field("id", false, "456", Field.Store.YES, Field.Index.NOT_ANALYZED, Field.TermVector.NO));
indexWriter.addDocument(doc2);
Document doc3 = new Document();
doc3.add(new Field("id", false, "789", Field.Store.YES, Field.Index.NOT_ANALYZED, Field.TermVector.NO));
indexWriter.addDocument(doc3);
indexWriter.commit();
indexWriter.close();
} catch(Exception e) {
e.printStackTrace();
}
}
}
『貳』 lucene對資料庫表建索引、索引更新及檢索,需考慮一對多、多對多等關系,最後檢索結果同行顯示,如何實現
建立視圖v(a_id,b_id,a2,a3,b2,b3),然後再根據v去建立索引
『叄』 使用 lucene 進行全文檢索,先建索引在搜索,求高手
修改queryByCondition方法:
public static List queryByCondition(String indexFile, String field, String queryString, int count){
List list = null;
Query querytemp=null;
Query query=new BooleanQuery();
try{
IndexReader reader = DirectoryReader.open(FSDirectory.open(new File(
indexFile)));
IndexSearcher searcher = new IndexSearcher(reader);
Analyzer analyzer = new IKAnalyzer();
Analyzer standardanalyzer=new StandardAnalyzer();
QueryParser parser = new QueryParser(Version.LUCENE_40, field,
analyzer);
querytemp = parser.parse(queryString);
parser=new QueryParser(Version.LUCENE_40, field,
standardanalyzer);
query.add(querytemp,parser.parse(queryString,should);
if(queryString.indexof("?")!=0||queryString.indexof("*")!=0){
query.add(new wildcardQuery(queryString),should);
System.out.println("Searching for: " + query.toString(field));
list = doSearch(searcher, query, count);
reader.close();
}catch(Exception e){
}
return list;
}
隨便寫的,不知道可不可以。
『肆』 lucene檢索,必須完全包含我篩選的關鍵字,只包含其中一個字的要過濾掉,怎麼設置
這個要看你的搜索關鍵詞是什麼,採用的分詞器是什麼,比如你搜索的關鍵詞是「搜索引擎內」,如果容採用的分詞器的分詞結果就包含「搜索引擎『這個詞,那麼採用TermQuery就可以了;如果採用的分詞器的分詞結果不是「搜索引擎『這個詞,而是」搜索「和」引擎「這兩個詞,那麼要採用PhraseQuery,setSlop(0),這樣就可以搜索出同時包含」搜索「和」引擎「這兩個詞並且這兩個詞緊挨著的所有文章了。
『伍』 lucene刪除索引的問題
直接刪除其中一條資料庫記錄是指手動去資料庫刪除?
如果是這樣你只能做個定時器,例如每天晚上12點去重新生成lucene索引
如果不是而是通過程序來作就很簡單啊,刪除oracle數據的時候根據id去刪掉
lucene的索引就可以了,注意生成索引的時候id要設為untoken才找的到
另外你為什麼不跳出這個思路呢?在查詢的時候來判斷資料庫有沒有這個值不可以么?把這個異常抓到就直接提示不存在不就可以了
『陸』 lucene中分詞和索引的區別
ucene中分詞和索引的區別如下:
1、分詞器,對文本資源進行切分,將字元文本串按照一定的規則切分為一個個可以進行索引的最小單位(關鍵詞),以便檢索時使用。
『柒』 用lucene創建索引後,在模糊匹配查詢出一千條數據後,該如何自定義查詢條數。只顯示前一百條數據呢。
SortField sortFieldByScore = new SortField(null, SortField.SCORE);
TopFieldCollector tfc = TopFieldCollector.create(new Sort(new SortField[] { sortFieldByScore }), 100, true, true, true, false);
searcher.search(output, tfc);//searcher是IndexSearcher對象
TopDocs results = tfc.topDocs();
『捌』 lucene搜索的時候可以去掉重復的索引只取一條嗎
這個可能抄是對資料庫里的同一條記錄建了多次索引就出現重復的了。 maxrocray 寫道 理論上當然是可以的。 不過你要寫個比較復雜的filter,對重復的索引的那個不同的field進行過濾。 過濾的規則,我想會根據你這個重復的索引的情況而定,可能會很復雜。 所以,常規來說,我們會對索引進行優化和整理,不允許重復的索引。
『玖』 [lucene]如何避免重復索引文件的方案
大概明白了,但這樣可以避免重復索引,可避免不了伺服器上被上傳了重復的原始文件,稍稍是個遺憾吧。
『拾』 海量數據環境下,Lucene 的索引性能如何優化
很多人會抱怨 Lucene 在數據量增加到一定規模的時候,性能會出現明顯下降,對於並發用戶訪問的支持能力也比較弱。其實在工程師所遇到的絕大多數環境下 Lucene 的性能問題,往往是因為系統沒有經過良好的調優。而非簡單的 Lucene 設計缺陷所造成。 當前使用 Lucene 的知名網站包括,Stack Exchange,旗下全球最大的事實性問答網站 StackOverFlow.com . 基於Lucene 文檔 「How to make indexing faster」,我們可以看到如下經驗可能可以應用於 Lucene 優化。 確定的確需要進行索引性能調優很多場景之下,性能問題其實表現為整體數據架構設計的問題,而不僅僅是通過索引所可以解決的。在決定進行索引性能調優之前,可能需要首先判斷,是否數據架構上出現了情況。 確定在使用最新版本的LuceneLucene也是在不斷發展之中。新版本的Lucene通常性能都會有些改善。 使用更快的硬體,例如,改善IO系統性能通常硬體性能的改善對於系統整體性能提升是立竿見影的。例如,通過SSD硬碟(Solid-State Disk,固態硬碟)取代通常的 SATA 或者 SAS 硬碟,將可以獲得明顯的系統性能提升。 在建立索引過程中,使用單例的 Writer基於內存執行 Flush 而不是基於 document count在Lucene 2.3 及其以上系統中,IndexWriter可以基於內存執行Flush操作。調用 writer.setRAMBufferSizeMB() 可以設置Buffer大小。 盡量多使用內存內存越多,Lucene應對海量數據的時候性能明顯加強。 關閉復合文件格式(Compound file format)調用setUseCompoundFile(false),可以關閉。建立復合文件,將可能使得索引建立時間被拉長,有可能達到7%-33%。而關閉復合文件格式,將可能大大增加文件數量,而由於減少了文件合並操作,索引性能被明顯增強。 重用文檔與欄位實例這是在 Lucene 2.3 之後才有的一個新技術。在之前如果要修改某個記錄,需要刪除掉索引中的文檔,然後重新添加。而新的方法通過 setValue 實現。這將有助於更有效的減少GC開銷而改善性能。 在存儲欄位數據以及執行 term vectors 的時候,使用同樣的欄位順序添加文檔這樣將有助於保證合並操作的性能。 在打開 IndexWriter 的時候,設置 autoCommit = false同傳統的資料庫操作一樣,批量提交事務性能總是比每個操作一個事務的性能能好很多。 同樣,對於實時性要求不是很強的系統。通過標記,並定時進行索引和優化,也將比隨時進行索引操作性能能改善很多。 不要使用太多的小欄位,如果欄位過多,嘗試將欄位合並到一個更大的欄位中,以便於查詢和索引適當增加 mergeFactor,但是不要增加的太多。關閉所有不需要的特性使用更快的 Analyzer特別是對於中文分詞而言,分詞器對於性能的影響更加明顯。 加快文檔的構造速度通常,從資料庫,文件系統,或者網路爬行過程中,都可能因為上遊程序處理的性能而影響 Lucene 文檔建立的速度。 除非真的需要改善索引性能,通常不要特別進行優化對於一個實例的 IndexWriter 可以使用多線程或者並發技術使用Java Profiler分析 Lucene 和調用程序的性能,並由此改善性能Index into separate indices then merge.If you have a very large amount of content to index then you can break your content into N "silos", index each silo on a separate machine, then use the writer.addIndexesNoOptimize to merge them all into one final index.