前言
文本已收录至我的GitHub仓库,欢迎Star:github.com/bin39232820…
种一棵树最好的时间是十年前,其次是现在
絮叨
其实这个问题,也算不得是什么大问题,就是不知道的很坑,公司的搜索服务,本来不是我维护的,后面因为人员调动,给我维护了,然后他们用的竟然不是JPA,用的是RestHighLevelClient。这就很尴尬了,没有学过,然后稀里糊涂的用着。
前言 一个新功能的迭代,下面是迭代的原型
其实也很简单就是做一个听课卡的筛选出,可以使用的课程和免费的课程嘛,当时就大概看了看以前的代码,因为es这个也是自己新学的吧,但是以前学的时候用的是JPA,这次项目用的是RestHighLevelClient,然后搞来搞去,搞了很久。 因为,这个文章就是给自己的一个记录,所以也没打算说讲的很详细,就举个例子说明一下吧,具体怎么用es,我会写专门的es系列
问题
如在a=1且b=2的数据中,找出c=1或者d=2的数据
那我可能会这样写,如果你是按照sql的思维的话
{"query": { "bool": { "must": [ {"match": { "a": "1", "b": "2" }} ], "should": [ {"match": { "c": "1" }, {"match": { "d": "2" }} ] }}} 复制代码
这样写的时候should是没有用的,这是新手可能犯的错误之一。 在编写查询条件的时候,不能用口头上的逻辑进行编写,而是要换成数学逻辑才能进行执行(数据库同理)。 如上例,数学逻辑应该是 (a==1&&b==2&&c==1)||(a==1&&b==2&&d==2)(java and c语言版),这样的结构去查询。
解决
{"query": { "bool": { "should": [ {"match": { "a": "1", "b": "2", "c": "1" }} ], "should": [ {"match": { "a": "1", "b": "2", "d": "2" }} ] }}} 复制代码
或者这样
{ "query": { "bool": { "must": [ {"match": { "a": "1", "b": "2" }}, { "bool": { "should": [ {"match": {"c": 1}}, {"match": {"d": 2}} ] } } ] } } 复制代码
结尾
嗯,记录一下新手经常犯的错误,哈哈博主也是个新手菜鸡。