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