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