elasticsearch,nest,C#,elasticsearch,Nest" /> elasticsearch,nest,C#,elasticsearch,Nest" />

C# Elasticsearch按分数筛选

C# Elasticsearch按分数筛选,c#,elasticsearch,nest,C#,elasticsearch,Nest,我找不到类似的问题。要么我做错了什么,要么我不知道如何搜索 我的索引就是这样 例如,用户搜索“c001”,我查看search_all_字段并在两个文档中找到它。(所有搜索关键字“c”和“001”的通配符查询) 但第二个是无用的。因为第一个与项目号匹配。这更有价值。 第二个字段与第一组字段匹配。这就没那么值钱了。 我必须过滤它 但另一方面,有人搜索“yyy102”,然后它只发生在第一组和第二组字段中。 所以我不能过滤它 两次去弹性边得分是昂贵的。但我怎样才能做到这一点呢 public class

我找不到类似的问题。要么我做错了什么,要么我不知道如何搜索

我的索引就是这样

例如,用户搜索“c001”,我查看search_all_字段并在两个文档中找到它。(所有搜索关键字“c”和“001”的通配符查询) 但第二个是无用的。因为第一个与项目号匹配。这更有价值。 第二个字段与第一组字段匹配。这就没那么值钱了。 我必须过滤它

但另一方面,有人搜索“yyy102”,然后它只发生在第一组和第二组字段中。 所以我不能过滤它

两次去弹性边得分是昂贵的。但我怎样才能做到这一点呢

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 search_item_no { get; set; }   
    public string search_group_one { get; set; }
    public string search_group_two { get; set; }
    public string search_description { get; set; }
    public string search_all_fields { get; set; } /* search_item_no + search_group_one + search_group_two + search_description and something else */
}

public class ClassForScore
{
        public int id { get; set; }
        public string item_no { get; set; }
}

item_no # category # campaign # in_stock # search_item_no # search_group_one # search_group_two # search_description # search_all_fields
p-C-001 # cat1     # 1        # 1        # pc001          # aaaa@bbb@ccc     # kkkkk@llllllll   # red@metal@light    # pc001@aaaa@bbb@ccc@kkkkk@llllllll@red@metal@light
p-F-002 # cat1     # 1        # 1        # pf002          # ck001@www@zza    # yyy@rrrr@mmplp   # bold@plastic@ss    # pf002@ck001@www@zza@yyy@rrrr@mmplp@bold@plastic@ss
p-SW102 # cat2     # 0        # 1        # psw102         # psw102@777@ooo   # yyy@rrrr@mmplp   # bold@plastic@cc    # psw102@777@ooo@www@zza@yyy@rrrr@mmplp@bold@plastic@cc
QueryContainer queryContainsOr=new WildcardQuery(){Field=“score\u all\u fields”,Value=“*yyy*”};
queryContainsOr |=新的通配符查询(){Field=“score_all_fields”,Value=“*102*”};
QueryContainer queryEqualsOr=newtermquery(){Field=“category”,Value=“cat1”};
queryEqualsOr |=新术语查询(){Field=“category”,Value=“cat2”};
QueryContainer queryEqualsAnd=newtermquery(){Field=“campaign”,Value=1};
queryEqualsAnd&=newtermquery(){Field=“in_stock”,Value=1};
QueryContainer mainQuery=queryContainsOr&queryEqualsAnd&queryEqualsOr;
Func fo=funcScoreParam(新的ClassForCore(),filterItemNo,filterGroupOne,filterGroupTwo,filterDescription,mainQuery);
ISearchResponse srcSkor=elasticClient.Search(s=>s
.RequestConfiguration(r=>r.DisableDirectStreaming())
.查询(fo)
.尺寸(100)
);
IReadOnlyCollection lstSkor=srcSkor.Hits;
双重的dblSkorAvg=0;
//一些计算。。
//.....
Func fo2=funcScoreParam(新的ClassForCore(),filterItemNo,filterGroupOne,filterGroupTwo,filterDescription,mainQuery);
ISearchResponse srcResult=elasticClient.Search(s=>s
.RequestConfiguration(r=>r.DisableDirectStreaming())
.从(0)
.尺寸(100)
.Sort(S=>S.Descending(SortSpecialField.Score)。升序(r=>r.item_no))
.MinScore(dblSkorAvg)
.查询(fo2)
);
私有函数funcScoreParam(T nesne、QueryContainer filterItemNo、QueryContainer filterGroupOne、QueryContainer filterGroupTwo、QueryContainer filterDescription、QueryContainer mainQuery),其中T:class
{
返回新函数(q=>q
.FunctionScore(fsc=>fsc
.BoostMode(函数BoostMode.Sum)
.ScoreMode(FunctionScoreMode.Sum)
.函数(fu=>fu
.重量(w=>w
.重量(1000)
.Filter(wf=>wf
.Bool(bb=>bb
.Must(filterItemNo))
))
.重量(w=>w
.重量(100)
.Filter(wf=>wf
.Bool(bb=>bb
.Must(filterGroupOne))
))
.重量(w=>w
.重量(100)
.Filter(wf=>wf
.Bool(bb=>bb
.Must(过滤器组二))
))
.重量(w=>w
.重量(50)
.Filter(wf=>wf
.Bool(bb=>bb
.Must(过滤器描述))
))
)
.Query(q2=>q2
.Bool(b=>b
.Should(mainQuery))
)
));
}
QueryContainer queryContainsOr = new WildcardQuery() { Field = "score_all_fields", Value = "*yyy*" };
queryContainsOr |= new WildcardQuery() { Field = "score_all_fields", Value = "*102*" };
QueryContainer queryEqualsOr =  new TermQuery() { Field = "category", Value = "cat1" };
queryEqualsOr |=  new TermQuery() { Field = "category", Value = "cat2" };
QueryContainer queryEqualsAnd = new TermQuery() { Field = "campaign", Value = 1 };
queryEqualsAnd &= new TermQuery() { Field = "in_stock", Value = 1 };
        
        
QueryContainer mainQuery = queryContainsOr & 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))
                )
    ));
}