java - Elasticsearch java api正确的查询构建方式
问题描述
我正在使用 elasticsearch java api,我对构建某些查询的方式有疑问。
我在java中有一个作为过滤器的实体,它有一些字段,这些字段必须匹配elasticserach元素。
例如:
public class FilterPerson{
private String name;
private String name2;
private String surname;
private String surname2;
...
}
还有一个类根据过滤器字段是否有数据来构建查询:
private BoolQueryBuilder generateQuery(FiltroActaReconocimiento filtro){
List<MatchQueryBuilder> list=new ArrayList();
if(!StringUtils.isBlank(filtro.getName())){
list.add(QueryBuilders.matchQuery("name", filtro.getName()));
}
if(!StringUtils.isBlank(filtro.getName2())){
list.add(QueryBuilders.matchQuery("name2", filtro.getName2()));
}
if(!StringUtils.isBlank(filtro.getSurname())){
list.add(QueryBuilders.matchQuery("surname", filtro.getSurname()));
}
....
if(!list.isEmpty()){
BoolQueryBuilder query = QueryBuilders.boolQuery();
for(MatchQueryBuilder a:list){
query.must(a);
}
return query;
}
如您所见,如果过滤器具有值 name="jhon" 和 surname="smith",则查询将类似于:获取 (name="jhon" 和 surname="smith") 的元素
现在你知道我的程序的逻辑我将解释我的问题:在弹性搜索中,我有一个索引:motherName,motherName2,motherSurname,motherSurname2,fatherName,fatherName2,fatherSurname,fatherSurname2
并且使用相同的 FilterPerson 过滤器(只有一组名称),我必须在弹性搜索中搜索字段名称、名称 2、姓氏和姓氏 2 可能来自父亲或来自母亲,例如 if name= 'Susan' and surname='Potts' 查询必须是这样的: ((motherName='Susan' OR FatherName='Susan')AND(motherSurname='Potts'OR FatherSurname='Potts'))
我知道用“应该”我可以做 OR 部分,比如:
(母亲姓名='苏珊'或父亲姓名='苏珊')
if(!StringUtils.isBlank(filtro.getName())){
List<MatchQueryBuilder> listName=new ArrayList();
listName.add(QueryBuilders.matchQuery("motherName", filtro.getName()));
listName.add(QueryBuilders.matchQuery("fatherName", filtro.getName()));
BoolQueryBuilder query = QueryBuilders.boolQuery();
for(MatchQueryBuilder a:listName){
query.should(a);
}
}
但我不知道如何做包含两个 OR 的 AND 部分。一些帮助会很棒,谢谢
解决方案
推荐阅读
- camera - 适配智能手机摄像头导出黑体温度
- python - 向数据框中添加一个新列,该列将指示另一列是否包含单词 pyspark
- python - 将python文件转换为可执行文件
- realm - Realm.io Todo 应用程序崩溃并且不保留用户凭据
- sql - 获取上个月的记录
- amazon-athena - Athena 嵌套数组结构查询
- javascript - 如何在 typescript 中捕获数据库插入(运行时)错误并在 chai 中编写合适的测试用例?
- javascript - 整洁的 UX 技巧不起作用。我该如何解决?
- sylius - 定制夹具套件
- python - 在 jupyter notebook 中运行代码时出现 BrokenProcessPool