Elasticsearch按得分过滤

如何解决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 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

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

我的索引就是这样

例如,用户搜索“ c 001”,我查看search_all_fields并在两个文档中找到它。 (对所有搜索关键字“ c ”和“ 001 ”进行通配查询) 但是第二个是没有用的。因为第一个与item_no匹配。这更有价值。 第二个与group_one字段匹配。这是不太有价值的。 我必须过滤它。

但是,另一方面,有人搜索“ yyy 102”,则仅在group_one和group 2字段中发生。 所以我一定不要过滤它。

进行两次弹性得分是很昂贵的。但是我该如何实现呢?

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(),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))
                )
    ));
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?