如何获取Elasticsearch分数结果详细信息?

问题描述

我有一个弹性指数,可以保留一些物品。结构如下。

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; }
}

我必须从结果中筛选出无用的记录。我决定使用分数选项,并制作了一个函数来计算平均分数。因此,我首先调用elasticsearch获取得分,然后使用minscore参数调用。我找不到用于过滤无用结果的任何解决方案对此有何建议?这是第一个问题。

第二个: 第一次得分调用将返回7条记录。每条记录都有不同的分数。例如,第一条记录具有1100分。 但是我想知道这1100来自哪里? score_item_no为1000,score_group_one为100,score_group_one为500,匹配5个部分,其中score_group_two 500为匹配5的部分,score_description为匹配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(),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))
                    )
        ));
    }

解决方法

您可以使用搜索API上的A[_[_]]参数返回有关每次匹配的得分计算的详细信息

let getInventories = async () => {
  const result = await axios
    .get("/inventories")
    .catch((error) => console.log(error));
  // this.inventoryArray = result.data;
}

export {getInventories}

还有一个专用的explain API to understand how a specific document's score is calculated.

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...