繁体   English   中英

如何翻译 java 中的嵌套弹性搜索查询?

[英]how to translate nested elastic search query in java?

下面的查询将进行过滤和聚合,如何将其转换为 java 代码。 查询从 postman 开始,同样需要使用 java 客户端 Z8A5DA52ED1026447D8AAZE7C59 转换为 java。 我正在使用 rest 高级客户端作为弹性搜索客户端。 我尝试使用下面的 java 代码,但生成的查询与下面的实际代码有点不同,这是我尝试过的 java 代码。

BoolQueryBuilder booleanQuery = QueryBuilders.boolQuery();
booleanQuery.filter(QueryBuilders
        .queryStringQuery(String.join(" OR ", exactMatchThese))
        .field("events.recommendationData.exceptionId"));
QueryBuilder queryBuilder = QueryBuilders.nestedQuery("events.recommendationData", booleanQuery, ScoreMode.None); 

正在工作的搜索查询

GET <index-name>/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "nested": { --> note
            "path": "events.recommendationData",
            "query": {
              "query_string": {
                "query": "\"1\" OR \"2\"",
                "fields": [
                  "events.recommendationData.exceptionId"
                ],
                "type": "best_fields",
                "default_operator": "or",
                "max_determinized_states": 10000,
                "enable_position_increments": true,
                "fuzziness": "AUTO",
                "fuzzy_prefix_length": 0,
                "fuzzy_max_expansions": 50,
                "phrase_slop": 0,
                "escape": false,
                "auto_generate_synonyms_phrase_query": true,
                "fuzzy_transpositions": true,
                "boost": 1
              }
            }
          }
        }
      ]
    }
  },
  "size": 1,
  "aggs": {
            "genres": {
                "nested": {
                    "path": "events.recommendationData.recommendations"
                },
                "aggs": {
                    "nested_comments_recomms": {
                        "terms": {
                            "field": "events.recommendationData.recommendations.recommendationType"
                        }
                    }
                }
            }
        }
}

下面的搜索查询是从上面 java 代码生成的,我已经提到但它不起作用。

{
  "query": {
    "nested": {
      "query": {
        "bool": {
          "filter": [
            {
              "query_string": {
                "query": "\"1\" OR \"2\"",
                "fields": [
                  "events.recommendationData.exceptionId^1.0"
                ],
                "type": "best_fields",
                "default_operator": "or",
                "max_determinized_states": 10000,
                "enable_position_increments": true,
                "fuzziness": "AUTO",
                "fuzzy_prefix_length": 0,
                "fuzzy_max_expansions": 50,
                "phrase_slop": 0,
                "escape": false,
                "auto_generate_synonyms_phrase_query": true,
                "fuzzy_transpositions": true,
                "boost": 1
              }
            }
          ],
          "adjust_pure_negative": true,
          "boost": 1
        }
      },
      "path": "events.recommendationData",
      "ignore_unmapped": false,
      "score_mode": "none",
      "boost": 1
    }
  },
  "aggregations": {
    "recommendationTypes": {
      "terms": {
        "field": "events.recommendationData.recommendations.recommendationType",
        "size": 10,
        "min_doc_count": 1,
        "shard_min_doc_count": 0,
        "show_term_doc_count_error": false,
        "order": [
          {
            "_count": "desc"
          },
          {
            "_key": "asc"
          }
        ]
      }
    }
  }
}

您最里面的查询块是查询字符串,即

QueryStringQueryBuilder queryString = QueryBuilders
        .queryStringQuery(String.join(" OR ", exactMatchThese));

这是嵌套查询的查询部分,因此我们创建一个嵌套查询并将上面的查询分配给它,如下所示,

NestedQueryBuilder nestedQuery = QueryBuilders
    .nestedQuery("events.recommendationData", queryString, ScoreMode.None);

最后将上述查询添加到 bool 查询的过滤子句中,

BoolQueryBuilder boolQuery = QueryBuilders.boolQuery().filter(nestedQuery);

这一切加在一起,

QueryStringQueryBuilder queryString = QueryBuilders
    .queryStringQuery(String.join(" OR ", exactMatchThese));
NestedQueryBuilder nestedQuery = QueryBuilders
    .nestedQuery("events.recommendationData", queryString, ScoreMode.None);
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery().filter(nestedQuery);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM