从DB重新选择后保持Lucene顺序,取决于Lucene结果

时间:2016-02-14 11:18:04

标签: c# linq lucene

我在项目中使用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))....

1 个答案:

答案 0 :(得分:3)

您可以通过查询结果的linq join获取原始订单到您的ID集合:

var orderedResult = from i in ids
                join a in query on i equals a.ID
                select a;

领先的集合(在您的情况下" ID")将成为排序顺序的主人。