Indexing Lucene:字段中的术语比文档多,但它';不可能在标记化字段上排序

Indexing Lucene:字段中的术语比文档多,但它';不可能在标记化字段上排序,indexing,lucene,tokenize,Indexing,Lucene,Tokenize,我的一个Lucene索引有问题。我试图运行一个基本的布尔搜索,当搜索在其他索引上运行时,对于我的产品索引,我得到了一个错误:“字段“Description”中的术语比文档多,但不可能在标记字段上排序。” 以下是我的查询代码: var luceneIndexDataContext = new BcsUsLuceneDataContext("rewardproducts", _dbName); string fieldToQuery = "description"; bool sortDirecti

我的一个Lucene索引有问题。我试图运行一个基本的布尔搜索,当搜索在其他索引上运行时,对于我的
产品
索引,我得到了一个错误:“字段“Description”中的术语比文档多,但不可能在标记字段上排序。”

以下是我的查询代码:

var luceneIndexDataContext = new BcsUsLuceneDataContext("rewardproducts", _dbName);
string fieldToQuery = "description";
bool sortDirection = query.sortDirection.ToLower().Equals("desc");

QueryParser parser = new QueryParser(fieldToQuery, new StandardAnalyzer());
Query q = parser.Parse("\"" + query.keywords.ToLower() + "\"");

var booleanQuery = new BooleanQuery();
booleanQuery.Add(q, BooleanClause.Occur.MUST);

return luceneIndexDataContext.BooleanQuerySearch(booleanQuery, fieldToQuery, sortDirection)
    .Where(i => i.Fields["eligibleforpurchase"] == "1");

private List BooleanQuerySearch(BooleanQuery查询、字符串sortField、bool sortReverse)
{
使用(QueryRunner runner=newqueryrunner(IndexName))
{
if(sortField!=string.Empty)
{
返回runner.RunQuery(query,false,sortField,sortReverse,0,1000);
}
其他的
{
返回runner.RunQuery(query,false);
}
}
}

我想我的索引一定有问题,但我不确定问题出在哪里。产品索引在其他环境(即QA环境)中工作,当我将索引从QA复制到本地时,它可以正常工作,但当我删除并重新生成它时,会出现错误。我想索引中的某些项或其他东西一定有问题,但我如何找到它?

基本上,问题隐藏在错误消息中:

Lucene无法对标记化字段进行排序。根据官方文件:

必须仔细选择用于确定排序顺序的字段。 文档必须在该字段中包含一个术语,并且 该术语应表示文档在给定文档中的相对位置 排序顺序。字段必须编制索引,但不应标记化, 并且不需要存储(除非您碰巧想要将其与 文档数据的其余部分)。换言之:

document.add(新字段(“byNumber”,Integer.toString(x), Field.Store.NO,Field.Index.未分析)

由于您使用
StandardAnalyzer
违反了规则,因此它不会进行排序,也不会对您起作用。我不知道您在QA或其他环境上做了什么,但问题应该是相同的(可能QA环境上没有任何问题?)

有关应选择哪些字段进行排序的其他信息-

private List<SkinnyItem> BooleanQuerySearch(BooleanQuery query, string sortField, bool sortReverse)
{
    using (QueryRunner runner = new QueryRunner(IndexName))
    {
        if (sortField != string.Empty)
        {
            return runner.RunQuery(query, false, sortField, sortReverse, 0, 1000);
        }
        else
        {
            return runner.RunQuery(query, false);
        }
    }
}