【问题标题】:Java ElasticSearch API search multiple possible valuesJava ElasticSearch API 搜索多个可能的值
【发布时间】:2021-12-08 05:02:31
【问题描述】:

我在多个字段中搜索,如果记录匹配特定值 (entry.getValue()) 或字符串“ALL”,我想获得结果

这是我的代码,但它不起作用。

SearchRequest searchRequest = new SearchRequest(MY_INDEX);
final BoolQueryBuilder booleanQuery = QueryBuilders.boolQuery();
searchRequest.source().query(booleanQuery);
final BoolQueryBuilder booleanQuery= QueryBuilders.boolQuery();
for (Map.Entry<String, String> entry : params.entrySet()) {
              booleanQuery.should(QueryBuilders.termsQuery(entry.getKey(), entry.getValue(), "ALL");
        }

我正在使用 JDK 11 和 ES 7.1

【问题讨论】:

  • 您好 Lina,请提供有关您正在使用的 Elasticsearch 和 java 客户端的版本以及您要查找的文档结构的其他信息。查询周围的附加代码以及您执行查询的方式也可能是相关的。最好的萨米
  • 嗨@samy,我在最初的帖子中添加了一些信息,现在我得到一个内部服务器错误... :(
  • 嗨丽娜,你得到什么服务器错误?我建议您在问题中添加尽可能多的信息。

标签: java elasticsearch


【解决方案1】:

这是为国家索引编写的示例代码,用于搜索地图中提供的数据。根据您的需要进行自定义。

//using map for country
    Map<String, String> map = new HashMap<>();
    map.put("country" , "FRANCE");
    map.put("countryCode", "FR");
    //List of should queries this will go in should clause of bool query
    List<Query> shouldQueryList = new ArrayList<>();
    for (Map.Entry<String, String> entry :map.entrySet()) {
        //list of terms to match i.e value from map and all.
        List<FieldValue> list = Arrays.asList(FieldValue.of(entry.getValue()), FieldValue.of("ALL"));
        //Terms query
        Query query = new Query.Builder().terms(termsQueryBuilder -> termsQueryBuilder
                .field(entry.getKey())
                .terms(termQueryField -> termQueryField
                        .value(list))).build();
        shouldQueryList.add(query);
    }

    try {
        //running search from elastic search java client 7.16.3
        SearchResponse<Country> response = elasticsearchClient.search(searchRequest -> searchRequest
                        .query(qBuilder -> qBuilder
                                .bool(boolQueryBuilder -> boolQueryBuilder
                                        //using should query list here
                                        .should(shouldQueryList)))
                , Country.class);
        response.hits().hits().forEach(a -> {
            //Print matching country name in console
            System.out.println(a.source().getCountry());
        });
    } catch (IOException e) {
        log.info(e.getMessage());
    }

上面的代码会生成这样的查询:

{"query":{"bool":{"should":[{"terms":{"country":["FRANCE","ALL"]}},{"terms":{"countryCode":["FR","ALL"]}}]}}}

【讨论】:

    猜你喜欢
    • 2014-04-30
    • 2021-08-12
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多