如何获取 Elasticsearch 评分结果详情?
How to get Elasticsearch score result detail?
我有一个弹性索引,可以保留一些项目。结构如下
public class items
{
public string item_no { get; set; }
public string category { get; set; }
public int campaign { get; set; }
public int in_stock { get; set; }
// Next properties only include [a-z0-9]. Not any other characters
public string score_item_no { get; set; }
public string score_group_one { get; set; }
public string score_group_two { get; set; }
public string score_description { get; set; }
public string score_all_fields { get; set; } /* score_item_no + score_group_one + score_group_two + score_description and something else */
}
public class ClassForScore
{
public int id { get; set; }
public string item_no { get; set; }
}
我必须从结果中过滤掉无用的记录。我决定使用 score 选项并创建一个函数来计算平均分。所以我首先调用 elasticsearch 来获取分数,然后调用 minscore 参数。我找不到过滤无用结果的任何解决方案对此有什么建议吗?这是第一个问题。
第二个:
第一个分数调用returns 7 条记录。每个记录都有不同的分数。例如,第一条记录有 1100 个分数。
但是我想知道这个1100是哪里来的?
score_item_no 中的 1000 个和 score_group_one 中的 100 个,或者 score_group_one 中的 500 个匹配 5 个部分,其中 500 个 score_group_two 匹配 5 个部分,score_description 中的 100 个匹配 2 个部分.
有没有办法找到乐谱详情?
QueryContainer queryContainsAnd = new WildcardQuery() { Field = "score_all_fields", Value = "*" + mykeyword + "*" };
QueryContainer queryEqualsOr = new TermQuery() { Field = "category", Value = *something1* };
queryEqualsOr |= new TermQuery() { Field = "category", Value = *something2* };
QueryContainer queryEqualsAnd = new TermQuery() { Field = "campaign", Value = 1 };
queryEqualsAnd &= new TermQuery() { Field = "in_stock", Value = 1 };
QueryContainer mainQuery = queryContainsAnd & queryEqualsAnd & queryEqualsOr;
Func<QueryContainerDescriptor<ClassForScore>, QueryContainer> fo = funcScoreParam(new ClassForScore(), filterItemNo, filterGroupOne, filterGroupTwo, filterDescription, mainQuery);
ISearchResponse<ClassForScore> srcSkor = elasticClient.Search<ClassForScore>(s => s
.RequestConfiguration(r => r.DisableDirectStreaming())
.Query(fo)
.Size(100)
);
IReadOnlyCollection<IHit<ClassForScore>> lstSkor = srcSkor.Hits;
double? dblSkorAvg = 0;
// Some calculation..
//.....
Func<QueryContainerDescriptor<items>, QueryContainer> fo2 = funcScoreParam(new ClassForScore(), filterItemNo, filterGroupOne, filterGroupTwo, filterDescription, mainQuery);
ISearchResponse<items> srcResult = elasticClient.Search<items>(s => s
.RequestConfiguration(r => r.DisableDirectStreaming())
.From(0)
.Size(100)
.Sort(S => S.Descending(SortSpecialField.Score).Ascending(r => r.item_no))
.MinScore(dblSkorAvg)
.Query(fo2)
);
private Func<QueryContainerDescriptor<T>, QueryContainer> funcScoreParam<T>(T nesne, QueryContainer filterItemNo, QueryContainer filterGroupOne, QueryContainer filterGroupTwo, QueryContainer filterDescription, QueryContainer mainQuery) where T : class
{
return new Func<QueryContainerDescriptor<T>, QueryContainer>(q => q
.FunctionScore(fsc => fsc
.BoostMode(FunctionBoostMode.Sum)
.ScoreMode(FunctionScoreMode.Sum)
.Functions(fu => fu
.Weight(w => w
.Weight(1000)
.Filter(wf => wf
.Bool(bb => bb
.Must(filterItemNo))
))
.Weight(w => w
.Weight(100)
.Filter(wf => wf
.Bool(bb => bb
.Must(filterGroupOne))
))
.Weight(w => w
.Weight(100)
.Filter(wf => wf
.Bool(bb => bb
.Must(filterGroupTwo))
))
.Weight(w => w
.Weight(50)
.Filter(wf => wf
.Bool(bb => bb
.Must(filterDescription))
))
)
.Query(q2 => q2
.Bool(b => b
.Should(mainQuery))
)
));
}
您可以在搜索中使用 explain
参数 API 到 return 有关每次命中的分数计算的详细信息
ISearchResponse<items> srcResult = elasticClient.Search<items>(s => s
.RequestConfiguration(r => r.DisableDirectStreaming())
.From(0)
.Size(100)
.Sort(S => S.Descending(SortSpecialField.Score).Ascending(r => r.item_no))
.MinScore(dblSkorAvg)
.Query(fo2)
.Explain() // <-- explain score computation for each hit
);
还有专门的explain API to understand how a specific document's score is calculated.
在 Python elasticsearch_dsl
库中,语法是
my_search.extra(explain=True).execute()
我有一个弹性索引,可以保留一些项目。结构如下
public class items
{
public string item_no { get; set; }
public string category { get; set; }
public int campaign { get; set; }
public int in_stock { get; set; }
// Next properties only include [a-z0-9]. Not any other characters
public string score_item_no { get; set; }
public string score_group_one { get; set; }
public string score_group_two { get; set; }
public string score_description { get; set; }
public string score_all_fields { get; set; } /* score_item_no + score_group_one + score_group_two + score_description and something else */
}
public class ClassForScore
{
public int id { get; set; }
public string item_no { get; set; }
}
我必须从结果中过滤掉无用的记录。我决定使用 score 选项并创建一个函数来计算平均分。所以我首先调用 elasticsearch 来获取分数,然后调用 minscore 参数。我找不到过滤无用结果的任何解决方案对此有什么建议吗?这是第一个问题。
第二个: 第一个分数调用returns 7 条记录。每个记录都有不同的分数。例如,第一条记录有 1100 个分数。 但是我想知道这个1100是哪里来的? score_item_no 中的 1000 个和 score_group_one 中的 100 个,或者 score_group_one 中的 500 个匹配 5 个部分,其中 500 个 score_group_two 匹配 5 个部分,score_description 中的 100 个匹配 2 个部分. 有没有办法找到乐谱详情?
QueryContainer queryContainsAnd = new WildcardQuery() { Field = "score_all_fields", Value = "*" + mykeyword + "*" };
QueryContainer queryEqualsOr = new TermQuery() { Field = "category", Value = *something1* };
queryEqualsOr |= new TermQuery() { Field = "category", Value = *something2* };
QueryContainer queryEqualsAnd = new TermQuery() { Field = "campaign", Value = 1 };
queryEqualsAnd &= new TermQuery() { Field = "in_stock", Value = 1 };
QueryContainer mainQuery = queryContainsAnd & queryEqualsAnd & queryEqualsOr;
Func<QueryContainerDescriptor<ClassForScore>, QueryContainer> fo = funcScoreParam(new ClassForScore(), filterItemNo, filterGroupOne, filterGroupTwo, filterDescription, mainQuery);
ISearchResponse<ClassForScore> srcSkor = elasticClient.Search<ClassForScore>(s => s
.RequestConfiguration(r => r.DisableDirectStreaming())
.Query(fo)
.Size(100)
);
IReadOnlyCollection<IHit<ClassForScore>> lstSkor = srcSkor.Hits;
double? dblSkorAvg = 0;
// Some calculation..
//.....
Func<QueryContainerDescriptor<items>, QueryContainer> fo2 = funcScoreParam(new ClassForScore(), filterItemNo, filterGroupOne, filterGroupTwo, filterDescription, mainQuery);
ISearchResponse<items> srcResult = elasticClient.Search<items>(s => s
.RequestConfiguration(r => r.DisableDirectStreaming())
.From(0)
.Size(100)
.Sort(S => S.Descending(SortSpecialField.Score).Ascending(r => r.item_no))
.MinScore(dblSkorAvg)
.Query(fo2)
);
private Func<QueryContainerDescriptor<T>, QueryContainer> funcScoreParam<T>(T nesne, QueryContainer filterItemNo, QueryContainer filterGroupOne, QueryContainer filterGroupTwo, QueryContainer filterDescription, QueryContainer mainQuery) where T : class
{
return new Func<QueryContainerDescriptor<T>, QueryContainer>(q => q
.FunctionScore(fsc => fsc
.BoostMode(FunctionBoostMode.Sum)
.ScoreMode(FunctionScoreMode.Sum)
.Functions(fu => fu
.Weight(w => w
.Weight(1000)
.Filter(wf => wf
.Bool(bb => bb
.Must(filterItemNo))
))
.Weight(w => w
.Weight(100)
.Filter(wf => wf
.Bool(bb => bb
.Must(filterGroupOne))
))
.Weight(w => w
.Weight(100)
.Filter(wf => wf
.Bool(bb => bb
.Must(filterGroupTwo))
))
.Weight(w => w
.Weight(50)
.Filter(wf => wf
.Bool(bb => bb
.Must(filterDescription))
))
)
.Query(q2 => q2
.Bool(b => b
.Should(mainQuery))
)
));
}
您可以在搜索中使用 explain
参数 API 到 return 有关每次命中的分数计算的详细信息
ISearchResponse<items> srcResult = elasticClient.Search<items>(s => s
.RequestConfiguration(r => r.DisableDirectStreaming())
.From(0)
.Size(100)
.Sort(S => S.Descending(SortSpecialField.Score).Ascending(r => r.item_no))
.MinScore(dblSkorAvg)
.Query(fo2)
.Explain() // <-- explain score computation for each hit
);
还有专门的explain API to understand how a specific document's score is calculated.
在 Python elasticsearch_dsl
库中,语法是
my_search.extra(explain=True).execute()