0

我有一个索引,其中对象内部有对象数组:

{
  "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": {}
}

我的查询需要工作的方式是:

  • 如果重要人物对象不为空,则匹配(字符串匹配)重要人物的全名。
  • 如果重要人物为空,则匹配(字符串匹配)“people”数组中人物的全名,角色为“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));
}

关于我如何做到这一点的任何想法?

java代码或查询将不胜感激。

谢谢!

4

1 回答 1

1
{
    "query": {
        "bool": {
            "should": [
                {
                    "bool": {
                        "must": {
                            "match": {"importantPerson.fullName": "fullname"}
                        }                         
                    }
                },
                {
                    "bool": {
                        "must": [
                            {"term": {"importantPerson.fullName": ""}},
                            {
                                "bool":{
                                "should":[
                                    {
                                        "term":{
                                            "people.role":"roleTARGET1"
                                        }
                                    },
                                    {
                                        "term":{
                                            "people.role":"roleTARGET2"
                                        }
                                    }
                                ]
                                }
                            }
                        ]
                    }
                }
            ]
        }
    }
}

它确实OR=should

importantPerson's full name匹配

OR

{ object empty

AND

`OR = role a or b`

} }

于 2020-06-25T10:41:31.247 回答