java - 如何构建动态查询elasticsearch

标签 java elasticsearch

我想使用 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))
}

关于java - 如何构建动态查询elasticsearch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36599392/

相关文章:

elasticsearch - 多个非嵌套聚合

solr - Solr等同于ElasticSearch映射类型

elasticsearch - Logstash-仅解析一个JSON事件

java - 在同一个应用程序中使用 TCP 和 UDP 有什么问题吗?

java - Java打印函数输出说明

java - 我安装了 OpenJDK,现在我正在安装 Tomcat。 JRE在哪里?

ruby-on-rails - Rails elasticsearch _geo_distance和自定义评分/排序

Java - JPanel - 使用数组列表绘制文本文件的内容 - 仅第一次有效

java - <context :annotation-config> and <context:component-scan> 之间的区别

elasticsearch - Logstash 将日期转换为有效的 joda 时间 (@timestamp)