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") 的元素

既然你知道了我的程序的逻辑,我将解释我的问题: 在 elasticsearch 中,我有一个索引,它有: 母亲姓名,母亲姓名 2,母亲姓氏,母亲姓氏 2 父亲姓名,父亲姓名2,父亲姓氏,父亲姓氏2

使用相同的 FilterPerson 过滤器(只有一组名称),我必须在 elasticsearch 中搜索,可能字段 name、name2、surname 和 surname2 可能来自父亲或来自母亲,例如如果 name='Susan' 和 surname='Potts' 查询必须是这样的: ((motherName='Susan' ORfatherName='Susan')AND(motherSurname='Potts'ORfatherSurname='Potts'))

我知道“应该”我可以做 OR 部分,例如:

(motherName='Susan' OR FatherName='Susan')

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 部分。 一些帮助会很棒,谢谢

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...