我正在尝试使用Lucene.Net构建自定义搜索引擎。
一切似乎都很好,但我面临的问题,而循环命中对象返回的搜索功能。每当我搜索一个项目时,搜索函数大约需要0.07秒,循环到返回的对象需要20到90秒。
ex:(对于总共返回的11384个结果)
搜索用时0.068秒。
对象循环用时25.50秒。
现在我第二次循环这个对象,它花了更少的时间(对于上面相同的情况,它花了0.141秒)。
下面是搜索函数:
public List<SearchResultId> SearchId(string searchTerm)
{
IndexSearcher indexSearcher = new IndexSearcher(_indexDir);
List<SearchResultId> searchList = new List<SearchResultId>();
try
{
QueryParser queryParser = new QueryParser(_fieldName, new StandardAnalyzer());
Query query = queryParser.Parse(searchTerm);
Hits hits = indexSearcher.Search(query);
int numHits = hits.Length();
SearchResultId search;
for (int i = 0; i < numHits; ++i)
{
search = new SearchResultId();
search.score = hits.Score(i);
search.id = hits.Doc(i).Get(LuceneIndexer.DOC_ID_FIELD_NAME);
searchList.Add(search);
}
}
catch
{
indexSearcher.Close();
}
indexSearcher.Close();
return searchList;
}
这种情况正常吗?有没有办法优化这个过程?
谢谢
这是正常的,因为第二个查询总是更快,因为缓存。这里有很多有用的技巧可以帮助你进行优化。
对我帮助最大的是:
- 确保你正在使用最新版本的Lucene。
- 使用本地文件系统
- 打开readOnly=true的IndexReader
- 在非windows平台上,使用NIOFSDirectory代替FSDirectory
- 使用一个IndexSearcher实例