如何在Lucene.Net中优化Hits对象循环

时间:2014-07-05 16:46:02

标签: lucene lucene.net

我正在尝试使用Lucene.Net构建自定义搜索引擎。

所有似乎都很顺利,但我在循环搜索功能返回的Hits对象时遇到了问题。每当我搜索一个项目时,搜索功能需要大约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;
    }

这是正常的吗?有没有办法优化这个过程?

由于

1 个答案:

答案 0 :(得分:1)

这是正常的,因为第二个查询因缓存而总是更快。 here提供了很多有用的提示,可以帮助您进行优化。

对我帮助最大的是:

  1. 确保您使用的是最新版本的Lucene。
  2. 使用本地文件系统。
  3. 使用readOnly = true打开IndexReader。
  4. 在非Windows平台上,使用NIOFSDirectory而不是FSDirectory。
  5. 使用IndexSearcher的一个实例。