elasticsearch,Java,elasticsearch" /> elasticsearch,Java,elasticsearch" />

Java 如何构建动态查询elasticsearch

Java 如何构建动态查询elasticsearch,java,elasticsearch,Java,elasticsearch,我想使用html表单中的搜索条件构建对elasticsearch的查询。我在html页面上有几个输入字段。例如,如果用户填写其中两个字段,我可以写: BoolQueryBuilder query = QueryBuilders.boolQuery() .must(QueryBuilders.termQuery("archivo", "archivo1")) .

我想使用html表单中的搜索条件构建对elasticsearch的查询。我在html页面上有几个输入字段。例如,如果用户填写其中两个字段,我可以写:

    BoolQueryBuilder query =  QueryBuilders.boolQuery()
                                .must(QueryBuilders.termQuery("archivo", "archivo1"))
                                .must(QueryBuilders.termQuery("nombre", "documento1"));  
但是。。。如果用户填写了我可以拥有的三个字段,该怎么办

    BoolQueryBuilder query =  QueryBuilders.boolQuery()
                        .must(QueryBuilders.termQuery("archivo", "archivo1"))
                        .must(QueryBuilders.termQuery("nombre", "documento1"))
                        .must(QueryBuilders.termQuery("third", "test"));

是否有任何方法可以生成此类查询?

BoolQueryBuilder.must()
添加一个谓词,它不会替换前一个谓词

因此,假设字段
archivo
的值在变量
inputArchivo
中,依此类推,您可以检查字段是否已填充,然后添加谓词:

 BoolQueryBuilder query = QueryBuilders.boolQuery();
 if(inputArchivo != null && !inputArchivo.isEmpty()) {
   query.must(QueryBuilders.termQuery("archivo", inputArchivo));
 }

 if(inputNombre != null && !inputNombre.isEmpty()) {
   query.must(QueryBuilders.termQuery("nombre", inputNombre));
 }

 if(inputThird != null && !inputThird.isEmpty()) {
   query.must(QueryBuilders.termQuery("third", inputThird));
 }
然而,如果您不知道会出现什么术语,您可以使用以下值在HashMap上迭代:

for (Map.Entry<String, Object> entry : map.entrySet()) {
    query.must(QueryBuilders.termQuery(entry.getKey, entry.getValue))
}
for(Map.Entry:Map.entrySet()){
query.must(QueryBuilders.termQuery(entry.getKey,entry.getValue))
}