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

标签 java elasticsearch resthighlevelclient

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

{
  "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”数组中人物的全名与role =“roleTARGET1”或“roleTARGET2”匹配(字符串匹配)

  • 我当时认为某种XOR结构可以在这种情况下工作。
    我解析和生成查询的方式是通过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代码或查询将不胜感激。
    谢谢!

    最佳答案

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

    关于java - ElasticSearch MultiMatchQuery匹配具有条件的对象列表上的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62571253/

    相关文章:

    python - 将 pandas DataFrame 转换为 JSON 字符串列表

    java - 返回带有对象列表的 ResponseEntity

    elasticsearch - mget 生成 : Unable to parse response body for Response

    elasticsearch - 使用RestHighLevelClient在具有多个值的同一字段上查询

    JavaFX 动画在时间轴中同时播放

    在 Eclipse Helios Java EE 中找不到 javax.net.ssl

    ruby-on-rails - 通过 searchkick 进行多语言搜索

    elasticsearch - Elasticsearch 查询空列表

    java - JUnit和Windows命令行的Javac编译问题

    java - 使用包的 Eclipse 问题