我的Lucene索引中的每個文檔都與stackoverflow中的文章類似,我試圖通過索引(其中包含數百萬個文檔)進行搜索。每個用戶只能搜索用戶的公司帖子。我無法控制數據是如何編制索引的,我只需要在它上面實現一個簡單的搜索(可以工作)。在Java中實現Lucene搜索的最佳實踐
這是我的第一稿:
String q = "mysql"
String companyId = "1001"
String[] fields = { "body", "subject", "number", "category", "tags"};
Float float10 = new Float(10);
Float float5 = new Float(5);
Map<String, Float> boost = new HashMap<String, Float>();
boost.put("body", float10);
boost.put("subject", float10);
boost.put("number", float5);
boost.put("category", float5);
boost.put("tags", float5);;
MultiFieldQueryParser mfqp = new MultiFieldQueryParser(fields, new StandardAnalyzer(), boost);
mfqp.setAllowLeadingWildcard(true);
Query userQuery = mfqp.parse(q);
TermQuery companyQuery = new TermQuery(new Term("company_id", companyId));
BooleanQuery booleanQuery = new BooleanQuery();
BooleanQuery.setMaxClauseCount(50000)
booleanQuery.add(userQuery, BooleanClause.Occur.MUST);
booleanQuery.add(companyQuery, BooleanClause.Occur.MUST);
FSDirectory directory = FSDirectory.getDirectory(new File("/tmp/index"));
IndexSearcher searcher = SearcherManager.getIndexSearcherInstance(directory);
Hits hits = searcher.search(booleanQuery);
其主要工作功能,但我看到了一些內存問題。每4,5天我會發生Out of Memory錯誤,並且我使用堆轉儲,並看到Lucene Term和TermInfo對象位於列表的首位。我正在使用IndexSearcher的單例實例,我只能在堆中看到它的一個實例。
任何評論我在做的方式?我做錯了什麼,我能做得更好嗎?
設置沒問題,但問題無可救藥。你的意思是說有內存泄漏?你怎麼知道的?你有什麼證據? – 2009-12-10 20:48:00
已編輯。希望它現在更清楚。 – Langali 2009-12-10 20:56:41
您是否使用http://www.eclipse.org/mat/進行分析? – akuhn 2009-12-11 00:59:56