Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 根据Lucene结果,从DB中重新选择后保持Lucene顺序_C#_Linq_Lucene - Fatal编程技术网

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结果中有相同的唯一键。