首页 > 解决方案 > 我正在使用 Java 通过在我的代码中动态生成查询来从弹性搜索中获取一些记录。查询需要一个字符串

问题描述

我有一个从 ES 获取一些记录的 JAVA 代码。JAVA代码如下:

public Map<String, Object> getRiskDetailsFromEventIds(final String eventId) {
    try {
        String elasticBaseUrl = elasticsearchConfig.getEsUrl();
        String esIndexName = elasticsearchConfig.getHitsIndex();
        String endpointUrl = elasticBaseUrl + "/" + esIndexName + "/_search";
        String queryTemplate = IOUtils.toString(ESRepositary.class.getClassLoader().getResourceAsStream(
                "querytemplates/hits_search_event_es_query_template.json"), Charset.defaultCharset());
        String query = String.format(queryTemplate, eventId);
        return getResultsFromElastic(endpointUrl, query);
    } catch (IOException ex) {
        throw new UncheckedIOException(ex);
    }
}

我的 hits_search_event_es_query_template.json 看起来像这样

{

  "_source": [
   "hitNumber","eventId","hitScore","severityLevel","priority","hitType.typeCode","targetOwner","hitType.search","recommendedAction","referralId"
  ],
  "query": {
    "bool": {
      "must": [
        {
          "terms": {
            "eventId": ["%s"]
          }
        }
      ]
    }
  },
  "size" : "50"
}

现在,这需要一个字符串。我的 eventId 是:“A,B,C,D”

我需要传递给查询模板的字符串应该是:“A”,“B”,“C”,“D” 有人可以帮我以这种方式分解我的字符串,或者如果有人可以帮我将我的 ES 查询修改为利用我所拥有的。

标签: stringelasticsearchjava

解决方案


Getting a List of the eventIds, I am able to do the following :

String eventId = eventIds.stream().map(event -> "\""+event+"\"").collect(Collectors.joining(","));

where eventIds is the List

Also I have changed my query as below :

{

  "_source": [
   "hitNumber","eventId","hitScore","severityLevel","priority","hitType.typeCode","targetOwner","hitType.search","recommendedAction","referralId"
  ],
  "query": {
    "bool": {
      "must": [
        {
          "terms": {
            "eventId": [%s]
          }
        }
      ]
    }
  },
  "size" : "50"
}

This gives me the required query which I need.


推荐阅读