我在项目中使用Lucene
(和LINQ
)从Product的表中进行选择。
这就是我为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));
搜索将在Title
& Description
字段,我显示结果的解决方案是:
首先我使用Lucene按Term
(用户请求的)搜索,结果将是IDs
的列表,然后我使用此列表查询表单DB,并获取{{1}我需要向用户展示。
问题是,这样,我丢失了product's fields
,结果与Lucene's order
不匹配。
我如何解决这个问题?
请注意:Lucene没有错误或失败,一切正常,但结果的顺序。
更新
使用Lucene进行搜索的结果是找到的ID列表
Lucene's algorithm
然后我使用LINQ,就像这样:
foreach (var item in LUCENE_RESULT)
{
ids.Add(item.ID);
}
获取显示结果的字段,我没有在LINQ中使用var query = db.Products.Where(c => ids.Contains(c.ID))....
。
答案 0 :(得分:3)
您可以通过查询结果的linq join获取原始订单到您的ID集合:
var orderedResult = from i in ids
join a in query on i equals a.ID
select a;
领先的集合(在您的情况下" ID")将成为排序顺序的主人。