首页 > 解决方案 > Api Java ElasticSearch | 通过传递列表并返回所有匹配项进行搜索

问题描述

我需要在弹性搜索上进行搜索,但我遇到了困难

BoolQueryBuilder query = boolQuery()
            .must(matchQuery(CLIENT_ID, clientId));

fieldValues
      .forEach(fieldValue -> query.must(boolQuery().should(matchQuery(FIELD_NAME, fieldValue))));

首先,我希望所有数据都与客户端匹配。没关系

fieldValues是一个字符串列表。我希望得到列表中所有值与 FIELD_NAME 字段匹配的结果。但是我实现它的方式,它总是结果为 0。

标签: javaelasticsearch

解决方案


这就是使用 Elasticsearch Query DSL 查询的样子

{
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "must": [
              {
                "match": {
                  "clientId": CLIENT_ID
                }
              }
            ],
            "should": [
              {
                "terms": {
                  "FIELD_NAME": [
                    YOUR_TERMS
                  ]
                }
              }
            ]
          }
        }
      ]
    }
  }
}

将其转换为 Java API 如下所示:

BoolQueryBuilder mainBoolQuery = boolQuery();
BoolQueryBuilder innerBoolQuery = boolQuery();
MatchQueryBuilder clientMatchQueryBuilder = matchQuery(CLIENT_ID, clientId);
innerBoolQuery.must(clientMatchQueryBuilder);
fieldValues.forEach(value -> {
    TermQueryBuilder fieldNamesTermQueryBuilder = termQuery(FIELD_NAME, value);
    innerBoolQuery.must(fieldNamesTermQueryBuilder);

});
mainBoolQuery.should(innerBoolQuery);

推荐阅读