C# 根据Lucene结果,从DB中重新选择后保持Lucene顺序
我在项目中使用C# 根据Lucene结果,从DB中重新选择后保持Lucene顺序,c#,linq,lucene,C#,Linq,Lucene,我在项目中使用Lucene(和LINQ)从产品表中进行选择。 这是我为Lucene创建索引字段的方式: var document = new Document(); document.Add(new Field("ID", HeaderSearchModel.ID.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED)); document.Add(new Field("Summary", H
Lucene
(和LINQ
)从产品表中进行选择。
这是我为Lucene创建索引字段的方式:
var document = new Document();
document.Add(new Field("ID", HeaderSearchModel.ID.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));
document.Add(new Field("Summary", HeaderSearchModel.Summary, Field.Store.YES, Field.Index.NOT_ANALYZED));
document.Add(new Field("Picture", HeaderSearchModel.Picture, Field.Store.YES, Field.Index.NOT_ANALYZED));
var title = new Field("Title", HeaderSearchModel.Title, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS);
title.Boost = 3;
document.Add(title);
document.Add(new Field("Description", HeaderSearchModel.Description.RemoveHtmlTags(), Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS));
搜索将在标题
和说明
字段上进行,我显示结果的解决方案是:
首先,我使用Lucene通过术语
(用户请求)进行搜索,结果将是ID的列表
,然后我使用此列表查询表单数据库,并获取产品的字段
,而不需要向用户显示
问题是,以这种方式,我丢失了Lucene的顺序
,结果与Lucene的算法
不匹配
我怎样才能解决这个问题
请注意:Lucene没有错误或失败,一切正常,但结果的顺序不同
更新
使用Lucene搜索的结果是找到的ID的列表
foreach (var item in LUCENE_RESULT)
{
ids.Add(item.ID);
}
然后我使用LINQ,如下所示:
var query = db.Products.Where(c => ids.Contains(c.ID))....
并获取用于显示结果的字段,我没有在LINQ中使用
OrderBy
。您可以通过LINQ将查询结果连接到ids集合来获取原始订单:
var orderedResult = from i in ids
join a in query on i equals a.ID
select a;
领先的集合(在您的例子中是“ids”)将是排序顺序的主集合。您如何使用lucene的结果列表进行查询?这对最终结果顺序可能很重要!您能提供代码吗?您是否尝试过根据您已有的标识符列表重新排序返回的产品?您可以通过“ID”重新排序您的db结果,以匹配lucene订单。或者你可以解决这个db问题:@SimonSvensson我没有得到你的答案,但是如果我在重新选择表单db之前记录
lucene
结果,一切都很好,但是我需要重新选择,因为我不能用lucene索引所有字段。我的意思是:你可以把你的LINQ结果作为列表或数组放在主内存中,并将其重新排序到原来的lucene顺序,因为你在lucene列表和LINQ结果中有相同的唯一键。