首页 > 解决方案 > 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 部分。一些帮助会很棒,谢谢

标签: javaelasticsearchelasticsearch-queryelasticsearch-rest-client

解决方案


推荐阅读