elasticsearch,resthighlevelclient,Java,elasticsearch,Resthighlevelclient" /> elasticsearch,resthighlevelclient,Java,elasticsearch,Resthighlevelclient" />

Java ElasticSearch MultiMatchQuery具有条件的对象列表上的匹配值

Java ElasticSearch MultiMatchQuery具有条件的对象列表上的匹配值,java,elasticsearch,resthighlevelclient,Java,elasticsearch,Resthighlevelclient,我有一个索引,其中对象包含对象数组: { "id": "someID", "tags": [], "people": [ { "id": "userID", "role": "roleTARGET1", "firstName": "name",

我有一个索引,其中对象包含对象数组:

{
  "id": "someID",
  "tags": [],
  "people": [
    {
      "id": "userID",
      "role": "roleTARGET1",
      "firstName": "name",
      "lastName": "lastname",
      "fullName": "fullname"
    },
    {
      "id": "userID",
      "role": "role",
      "firstName": "name",
      "lastName": "lastname",
      "fullName": "fullname"
    },
    {
      "id": "userID",
      "role": "roleTARGET2",
      "firstName": "name",
      "lastName": "lastname",
      "fullName": "fullname"
    }
  ],
  "importantPerson": {
    "id": "userID",
    "role": "role",
    "firstName": "name",
    "lastName": "lastname",
    "fullName": "fullname"
  },
  "highlightedFields": {}
}
我的查询需要的工作方式是:

  • 如果重要人物对象不是空的,则匹配(字符串匹配)重要人物的全名
  • 如果重要人物为空,则将“人物”数组中人物的全名与roles=“roleTARGET1”或“roleTARGET2”匹配(字符串匹配)
我在想某种异或结构可以在这种情况下工作

我解析和生成查询的方式是通过Java中的RestHighLevelClient,下面是一个片段:

   private void addSearchQuery(BoolQueryBuilder query, List<Filter> filters) {

    String value = filters.get(0).getValues().get(0).getValue();
    String[] fields = new String[filters.size()];

    int i = 0;

    for (Filter filter : filters) {
        fields[i] = filter.getPath();
        i++;
    }

    addMultiMatchQuery(query, fields, value);
}

private void addMultiMatchQuery(BoolQueryBuilder query, String[] fields, String value) {
    query.filter(QueryBuilders.multiMatchQuery(value, fields).operator(Operator.AND).type(MultiMatchQueryBuilder.Type.BOOL_PREFIX));
}
private void addSearchQuery(BoolQueryBuilder查询,列表过滤器){
字符串值=过滤器.get(0).getValues().get(0).getValue();
String[]fields=新字符串[filters.size()];
int i=0;
用于(过滤器:过滤器){
字段[i]=filter.getPath();
i++;
}
addMultiMatchQuery(查询、字段、值);
}
私有void addMultiMatchQuery(BoolQueryBuilder查询,字符串[]字段,字符串值){
filter(QueryBuilders.multiMatchQuery(值、字段).operator(运算符.AND).type(MultiMatchQueryBuilder.type.BOOL_前缀));
}
你知道我怎样才能做到这一点吗

无论是java代码还是查询都将不胜感激

谢谢

{
    "query": {
        "bool": {
            "should": [
                {
                    "bool": {
                        "must": {
                            "match": {"importantPerson.fullName": "fullname"}
                        }                         
                    }
                },
                {
                    "bool": {
                        "must": [
                            {"term": {"importantPerson.fullName": ""}},
                            {
                                "bool":{
                                "should":[
                                    {
                                        "term":{
                                            "people.role":"roleTARGET1"
                                        }
                                    },
                                    {
                                        "term":{
                                            "people.role":"roleTARGET2"
                                        }
                                    }
                                ]
                                }
                            }
                        ]
                    }
                }
            ]
        }
    }
}
它确实应该或者=
应该

重要人员的全名
匹配

{
对象为空

AND

`OR = role a or b`
}
}

您是在寻找
java代码
还是
mongo查询
,如果您愿意,我们将不胜感激