我的某个 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复制到本地时,它工作正常,但是当我删除它并重建它时,我得到了错误。我认为索引中的某些项目或其他问题已成为问题,但我该如何找到它?
答案 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