为什么lucene.net查询(有效)突然抛出“索引超出范围”?

时间:2015-01-16 06:51:50

标签: c# .net lucene

这不是What is an "index out of range" exception, and how do I fix it?的副本 鉴于符合搜索条件的记录数

,此处的索引绝对不应超出范围

好的,所以我有一个查询我正在运行:两个字段被搜索,然后在三个(其他)字段上排序。我只返回前两个结果,所以我的endIndex显然是2。

现在这种情况已经好几个月了,但突然之间它的指数超出了范围"例外。 如果我删除了第二个和第三个排序字段,则异常停止。 有近700条记录与两个搜索字段匹配。

查询再次正常工作(未更改)!

索引发生时没有写锁定。

我能想到的唯一变量是所有三个排序字段都根据用户输入(评论,讨论和关注者的数量)进行更新,但这些只会增加。

所以我真的只是想了解为什么会发生这种情况以及我可以采取哪些措施来防止它再次发生。

以下是发生这种情况的页面:www.ekcko.com在页面底部有三个标签。有问题的查询是填充"最讨论的"标签 提前感谢任何输入

更新 只是一个有趣的注释,我忘了添加:我下载了索引并在本地测试。相同的结果,没有write.lock,绝对没有写入。 "指数超出范围"有三个排序字段,但没有一个排序字段(相同的搜索)

更新2 我将其缩小到评论字段,该字段在排序中包含异常时抛出异常。通过其他两个字段中的任一个或两个进行排序产生约。 700次点击。我已经查询了Luke中的数据,所有记录在评论字段中都有5,4,3,2,1,0或空值。实时索引(当前没有抛出异常)具有相同的注释值。只是很奇怪...


跳过 = 0;

采取 = 2;

qry =" +(ParentId:zzz)+(IsPrivate:false)" (zzz替代NULL)

查询代码:

int endIndex = skip + take;
endIndex = endIndex > 0 ? endIndex : 1000;

StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);
QueryParser parser = new QueryParser(Version.LUCENE_30, "", analyzer);
Query query = parseQuery(qry, parser);

Sort sort = null;
TopDocs results;
List<SortField> fields = new List<SortField>();
if (sortFields.IsNotNull())
{
    foreach (string field in sortFields)
    {
        fields.Add(new SortField(field, comparator, sortDesc));
    }
    sort = new Sort(fields.ToArray());
    results = searcher.Search(query, null, endIndex, sort);
}
else
    results = searcher.Search(query, null, endIndex);

ScoreDoc[] scoreDocs = results.ScoreDocs;
endIndex = results.TotalHits < endIndex ? results.TotalHits : endIndex;
List<Document> luceneDocuments = new List<Document>();

for (int i = skip; i < endIndex; i++)
{
    if (i > (skip + take) - 1)
        break;
    luceneDocuments.Add(searcher.Doc(scoreDocs[i].Doc));
}
analyzer.Close();
return luceneDocuments;

0 个答案:

没有答案