Lucene.Net 4.8排序返回含NULL字段文档问题求助
Lucene.Net排序后部分文档字段返回NULL的解决方案
问题现象
使用Lucene.Net 4.8.0-beta00005时,创建lastname-sort排序字段(TextField类型,不存储),通过SortField按该字段排序搜索后,前约10个ScoreDocs对应的所有存储字段返回NULL,其余文档排序正常且字段可正常读取,索引时所有字段均非空。
解决方案
替换排序字段类型为StringField
TextField会对内容分词,不适合作为排序字段(排序需要完整字符串值),改为不分词的StringField:var doc = new Document { new StringField("lastname-sort", person.LastName.RemoveDiacritics(), Field.Store.NO), // 确保其他字段明确设置为存储 new StringField("uid", person.Uid, Field.Store.YES), new TextField("firstname", person.FirstName, Field.Store.YES), new TextField("lastname", person.LastName, Field.Store.YES) };确保NRT索引Reader已同步刷新
使用NRT Reader时可能存在索引未完全同步的情况,搜索前强制刷新:if (!_nrtIndexReader.IsCurrent) { _nrtIndexReader = _nrtIndexReader.Refresh(); } TopDocs hits = _indexSearcher.Search(query, _nrtIndexReader.NumDocs, sort);使用FieldSelector指定加载字段
避免全字段加载的异常,明确指定需要读取的字段:var fieldSelector = new MapFieldSelector(new[] { "uid", "firstname", "lastname" }); var indexedPersons = hits.ScoreDocs.Select(hit => _indexSearcher.Doc(hit.Doc, fieldSelector)) .Select(document => new IndexedPerson { Uid = document.Get("uid"), FirstName = document.Get("firstname"), LastName = document.Get("lastname") }).ToList();校验排序字段值非空
索引前检查排序字段生成值,避免空值导致排序逻辑异常:var sortLastName = person.LastName?.RemoveDiacritics() ?? string.Empty; doc.Add(new StringField("lastname-sort", string.IsNullOrEmpty(sortLastName) ? " " : sortLastName, Field.Store.NO));
内容的提问来源于stack exchange,提问作者Cromm
相关产品推荐
相关产品推荐

