C# 全文查询结果按分数排序不正确
我有一个RavenDB数据库,其中有一些文档如下所示:C# 全文查询结果按分数排序不正确,c#,full-text-search,ravendb,lucene.net,C#,Full Text Search,Ravendb,Lucene.net,我有一个RavenDB数据库,其中有一些文档如下所示: public class TextDocument { public string Id { get; set; } public string IndexedText { get; set; } } 我还定义了全文索引,定义如下: public class TextIndex : AbstractIndexCreationTask<TextDocument> { public TextIndex()
public class TextDocument
{
public string Id { get; set; }
public string IndexedText { get; set; }
}
我还定义了全文索引,定义如下:
public class TextIndex : AbstractIndexCreationTask<TextDocument>
{
public TextIndex()
{
Map = docs =>
from doc in docs
select new { doc.IndexedText };
Analyze(x => x.IndexedText,
"Lucene.Net.Analysis.StopAnalyzer, Lucene.Net");
Indexes.Add(x => x.IndexedText, FieldIndexing.Analyzed);
}
}
我对每个搜索词执行一次搜索,并按顺序显示搜索结果的Lucene分数:
public void Search()
{
using (var ds = CreateMyDocumentStore())
using (var session = ds.OpenSession())
{
foreach (var criterion in _searchCriteria)
{
var results = session.Query<TextDocument, TextIndex>()
.Search(x => x.IndexedText, criterion)
.OrderByScore()
.ToList();
Console.WriteLine("--- Result scores for [{0}]:", criterion);
foreach (var textDocument in results)
{
var score = session.Advanced.GetMetadataFor(textDocument)
.Value<double>("Temp-Index-Score");
Console.WriteLine(score);
}
}
}
}
奇怪的是,尽管我要求按Lucene评分(降序)排序结果,但上面的输出显然没有排序
我还注意到,搜索词越长,我得到这些异常的频率就越高
- 结果不应该总是按分数递减吗
- 上面的代码中是否有我做错的地方李>
更新:根据他的建议,我尝试为每个查询打开不同的会话,这解决了问题
但是,我想知道:对多个查询重用一个会话实例有那么糟糕吗?在这种情况下,它会得到异常结果吗?它看起来像是在后台线程中评估Lucene分数和向用户显示分数之间的竞争条件(
.Value(“Temp Index Score”)
)。可能,有时会显示以前标准的分数。解决方案是为每个搜索条件都有自己的会话。可能类似于.Customize(x=>x.WaitForNonSaleResults())
()?@VladimirFrolov我也尝试过,但没有改变任何东西。或者尝试为每个条件打开新会话。@VladimirFrolov谢谢!你的建议解决了我的问题。我仍然很好奇重复使用会话是否有那么糟糕,我正在等待一个能够澄清这一点的答案。如果我没有得到这样的答案,我很乐意接受你的答案。也许是会话缓存了文档,尽管从未更新元数据(因此Temp Index Score
),是的,这一定是原因。谢谢
public void Search()
{
using (var ds = CreateMyDocumentStore())
using (var session = ds.OpenSession())
{
foreach (var criterion in _searchCriteria)
{
var results = session.Query<TextDocument, TextIndex>()
.Search(x => x.IndexedText, criterion)
.OrderByScore()
.ToList();
Console.WriteLine("--- Result scores for [{0}]:", criterion);
foreach (var textDocument in results)
{
var score = session.Advanced.GetMetadataFor(textDocument)
.Value<double>("Temp-Index-Score");
Console.WriteLine(score);
}
}
}
}