数据检索的应用场景中,经常出现高级检索的功能需求,指定不同的字段与不同的逻辑关系,对数据进行检索。在某些应用场景中,会要求按照检索条件的顺序进行数据查找。
为解决按照检索添加出现的顺序进行检索的需求,本文使用 Elasticsearch 的 DSL 进行数据测试。
按照高级检索中检索条件出现的顺序进行条件处理,并约定如果两个检索条件之间选择‘与’关系,则取交集, 如果两个检索条件之间选择‘或’关系,则取并集。
下面优先初始化信息,并根据不同的检索条件,编写对应的 DSL 脚本,并同时满足上述约定。
数据初始化
public Student(String id, String studentName, String studentNo, Integer studentAge, String studentBirth, String studentIntro, String studentTags, BigDecimal gradePoint) {
this.id = id;
this.studentName = studentName;
this.studentNo = studentNo;
this.studentAge = studentAge;
this.studentBirth = studentBirth;
this.studentIntro = studentIntro;
this.studentTags = studentTags;
this.gradePoint = gradePoint;
}
Student student28 = new Student("28", "酒精", "1234567890", 80, StringUtilss.now(), "酒精", "杀毒、消菌", new BigDecimal("10"));
studentRepository.save(student28);
Student student29 = new Student("29", "酒精", "1234567890", 81, StringUtilss.now(), "酒精", "杀毒、消菌", new BigDecimal("11"));
studentRepository.save(student29);
Student student30 = new Student("30", "酒精", "1234567890", 82, StringUtilss.now(), "酒精", "杀毒、消菌", new BigDecimal("12"));
studentRepository.save(student30);
Student student31 = new Student("31", "白酒", "1234567890", 90, StringUtilss.now(), "白酒", "饮用、聚餐", new BigDecimal("20"));
studentRepository.save(student31);
Student student32 = new Student("32", "白酒", "1234567890", 91, StringUtilss.now(), "白酒", "饮用、聚餐", new BigDecimal("21"));
studentRepository.save(student32);
Student student33 = new Student("33", "白酒", "1234567890", 92, StringUtilss.now(), "白酒", "饮用、聚餐", new BigDecimal("22"));
studentRepository.save(student33);
复制代码
条件:A 与 B
理解为将满足条件 A 的结果与满足条件 B 的结果求交集。
举一个实际的场景,假设条件为: (studentName = 酒精) 与 (studentName = 白酒) ,那么将没有任何数据进行返回。
使用如下命令进行数据查找,返回 0 条数据。 hits.total.value = 0
{"size":0,"query":{"bool":{"must":[{"bool":{"must":[{"match":{"studentName":{"query":"酒精"}}},{"match":{"studentName":{"query":"白酒"}}}]}}]}}}
复制代码
条件:A 或 B
理解为将满足条件 A 的结果和满足条件 B 的结果求并集。
举一个实际的场景,假设条件为: (studentName = 酒精) 或 (studentName = 白酒) ,那么将返回如上 6 条数据。
使用如下命令进行数据查找,返回 6 条数据。 hits.total.value = 6
{"size":0,"query":{"bool":{"must":[{"bool":{"should":[{"match":{"studentName":{"query":"酒精"}}},{"match":{"studentName":{"query":"白酒"}}}]}}]}}}
复制代码
条件:(A 与 B)或 C
理解为将满足条件 A 的结果和满足条件 B 的结果求交集,之后再与条件 C 求并集。
举一个实际的场景,假设条件为: ((studentName = 酒精) 与 (studentName = 白酒)) 或 (studentAge in [ 80, 90 ]) ,那么将返回如上 4 条数据。
使用如下命令进行数据查找,返回 4 条数据。 hits.total.value = 4
{"size":0,"query":{"bool":{"should":[{"bool":{"must":[{"bool":{"must":[{"match":{"studentName":{"query":"酒精"}}},{"match":{"studentName":{"query":"白酒"}}}]}}]}},{"range":{"studentAge":{"gte":80,"lte":90}}}]}}}
复制代码
条件:(A 与 B)与 C
理解为将满足条件 A 的结果和满足条件 B 的结果求交集,之后再与条件 C 求交集。
举一个实际的场景,假设条件为: ((studentName = 酒精) 与 (studentName = 白酒)) 与 (studentAge in [ 80, 90 ]) ,那么将返回如上 0 条数据。
使用如下命令进行数据查找,返回 0 条数据。 hits.total.value = 0
{"size":0,"query":{"bool":{"must":[{"bool":{"must":[{"bool":{"must":[{"match":{"studentName":{"query":"酒精"}}},{"match":{"studentName":{"query":"白酒"}}}]}}]}},{"range":{"studentAge":{"gte":80,"lte":90}}}]}}}
复制代码
条件:(A 或 B)或 C
理解为将满足条件 A 的结果和满足条件 B 的结果求并集,之后再与条件 C 求并集。
举一个实际的场景,假设条件为: ((studentName = 酒精) 并 (studentName = 白酒)) 并 (studentAge in [ 80, 90 ]) ,那么将返回如上 6 条数据。
使用如下命令进行数据查找,返回 6 条数据。 hits.total.value = 6
{"size":0,"query":{"bool":{"should":[{"bool":{"must":[{"bool":{"should":[{"match":{"studentName":{"query":"酒精"}}},{"match":{"studentName":{"query":"白酒"}}}]}}]}},{"range":{"studentAge":{"gte":80,"lte":90}}}]}}}
复制代码
条件:(A 或 B)与 C
理解为将满足条件 A 的结果和满足条件 B 的结果求并集,之后再与条件 C 求交集。
举一个实际的场景,假设条件为: ((studentName = 酒精) 并 (studentName = 白酒)) 与 (studentAge in [ 80, 90 ]) ,那么将返回如上 4 条数据。
使用如下命令进行数据查找,返回 4 条数据。 hits.total.value = 4
{"size":0,"query":{"bool":{"must":[{"bool":{"must":[{"bool":{"should":[{"match":{"studentName":{"query":"酒精"}}},{"match":{"studentName":{"query":"白酒"}}}]}}]}},{"range":{"studentAge":{"gte":80,"lte":90}}}]}}}
复制代码
条件:((A 与 B)或 C)与 D
理解为将满足条件 A 的结果和满足条件 B 的结果求交集,之后再与条件 C 求并集,最后再与条件 D 求交集。
举一个实际的场景,假设条件为: (((studentName = 酒精) 与 (studentName = 白酒)) 并 (studentAge in [ 80, 90 ])) 与 (studentTags = 饮用、聚餐) ,那么将返回如上 1 条数据。
使用如下命令进行数据查找,返回 1 条数据。 hits.total.value = 1
{"size":0,"query":{"bool":{"must":[{"bool":{"should":[{"bool":{"must":[{"bool":{"must":[{"match":{"studentName":{"query":"酒精"}}},{"match":{"studentName":{"query":"白酒"}}}]}}]}},{"range":{"studentAge":{"gte":80,"lte":90}}}]}},{"match":{"studentTags":{"query":"饮用、聚餐"}}}]}}}
复制代码
条件:((A 与 B)或 C)或 D
理解为将满足条件 A 的结果和满足条件 B 的结果求交集,之后再与条件 C 求并集,最后再与条件 D 求并集。
举一个实际的场景,假设条件为: (((studentName = 酒精) 与 (studentName = 白酒)) 并 (studentAge in [ 80, 90 ])) 并 (studentTags = 饮用、聚餐) ,那么将返回如上 6 条数据。
使用如下命令进行数据查找,返回 6 条数据。 hits.total.value = 6
{"size":0,"query":{"bool":{"should":[{"bool":{"should":[{"bool":{"must":[{"bool":{"must":[{"match":{"studentName":{"query":"酒精"}}},{"match":{"studentName":{"query":"白酒"}}}]}}]}},{"range":{"studentAge":{"gte":80,"lte":90}}}]}},{"match":{"studentTags":{"query":"饮用、聚餐"}}}]}}}
复制代码
条件:(((A 与 B)或 C)与 D)与 E
理解为将满足条件 A 的结果和满足条件 B 的结果求交集,之后再与条件 C 求并集,接下来再与条件 D 求交集,最后再与条件 E 求交集。
举一个实际的场景,假设条件为: ((((studentName = 酒精) 与 (studentName = 白酒)) 并 (studentAge in [ 80, 90 ])) 与 (studentTags = 饮用、聚餐) ) 与 (gradePoint = 10),那么将返回如上 1 条数据。
使用如下命令进行数据查找,返回 1 条数据。 hits.total.value = 1
{"size":0,"query":{"bool":{"must":[{"bool":{"must":[{"bool":{"should":[{"bool":{"must":[{"bool":{"must":[{"match":{"studentName":{"query":"酒精"}}},{"match":{"studentName":{"query":"白酒"}}}]}}]}},{"range":{"studentAge":{"gte":80,"lte":90}}}]}},{"match":{"studentTags":{"query":"杀毒、消菌"}}}]}},{"match":{"gradePoint":{"query":"10"}}}]}}}
复制代码
评论