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



我正在尝试使用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;
    }

这种情况正常吗?有没有办法优化这个过程?

谢谢

这是正常的,因为第二个查询总是更快,因为缓存。这里有很多有用的技巧可以帮助你进行优化。

对我帮助最大的是:

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

最新更新