Lucene:在字段中有更多的术语而不是文档,但是对标记化的字段进行排序是不可能的

时间:2017-01-12 18:28:17

标签: indexing lucene tokenize

我的某个 Lucene 索引出现问题。我试图运行一个基本的布尔搜索,当搜索在其他索引上运行时,对于我的products索引我收到错误:"条款多于文档字段'说明',但无法对标记化字段进行排序。"

这是我的查询代码:

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<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);
        }
    }
}

我认为我的索引一定存在问题,但我不确定问题是什么。产品索引正在其他环境(即QA环境)上工作,当我将索引从QA复制到本地时,它工作正常,但是当我删除它并重建它时,我得到了错误。我认为索引中的某些项目或其他问题已成为问题,但我该如何找到它?

1 个答案:

答案 0 :(得分:0)

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

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

  

必须谨慎选择用于确定排序顺序的字段。   文档必须在此类字段中包含单个术语,以及值   该术语应表明文件在给定中的相对位置   排序。该字段必须编入索引,但不应该被标记化,   而且不需要存储(除非你碰巧想要它   其余的文档数据)。换句话说:

     

document.add(new Field(&#34; byNumber&#34;,Integer.toString(x),   Field.Store.NO,Field.Index.NOT_ANALYZED));

并且由于您使用StandardAnalyzer违反规则,因此它不会排序,它将永远不会对您有用。我不知道你在质量保证或其他环境中做了什么,但问题应该是一样的(可能没有关于质量保证环境的消息吗?)

您应该选择哪些字段进行排序的其他信息 - https://lucene.apache.org/core/6_0_0/core/org/apache/lucene/search/Sort.html