我是Elasticsearch的新手。我阅读了Elasticsearch的Java客户端API,并能够构建查询并通过传输客户端将其发送到Elasticsearch服务器。
因为我的查询对于多级过滤器非常复杂,我注意到通过Java客户端构建查询很麻烦。我觉得构建JSON查询字符串然后通过Java客户端将其发送到Elasticsearch服务器要简单得多。
这是Elasticsearch提供的吗?
我喜欢Elasticsearch Java API在收到滚动结果等结果后可以执行的操作。我想保留这些功能。
感谢您提供任何输入和链接!
问候。
答案 0 :(得分:9)
对Elasticsearch API进行了进一步的研究,发现Elasticsearch确实提供了这种功能。方法如下:
SearchResponse scrollResp = client.prepareSearch("my-index")
.setTypes("my-type")
.setSearchType(SearchType.SCAN)
.setQuery(query) // **<-- Query string in JSON format**
.execute().actionGet();
答案 1 :(得分:1)
我建议使用Java API,一旦你习惯它就非常好,在大多数情况下它不那么麻烦。如果您查看Elasticsearch源代码,您将看到Java API构建了JSON。以下是MatchAllQueryBuilder的一个示例:
@Override
public void doXContent(XContentBuilder builder, Params params) throws IOException {
builder.startObject(MatchAllQueryParser.NAME);
if (boost != -1) {
builder.field("boost", boost);
}
if (normsField != null) {
builder.field("norms_field", normsField);
}
builder.endObject();
}
答案 2 :(得分:1)
ElasticSearch内置了能够以有条理的方式完成您所需要的功能。
要回答您的问题,请参阅此链接(该材料已在弹性网站上删除,因此可能不再有效):
您所要做的就是构建一个包含搜索模板的简单文件,即复杂的搜索查询。 它可以是一个简单的json文件,也可以是文本文件。
现在您只需通过Java代码传递参数即可。 请参阅链接中的示例,它使事情变得非常明确。
Bhargav。
答案 3 :(得分:1)
您不能再将字符串传递给.setQuery函数,但是您可以像这样使用WrapperQueryBuilder:
WrapperQueryBuilder builder = QueryBuilders.wrapperQuery(searchQuery);
SearchRequestBuilder sr = client.prepareSearch().setIndices(index).setTypes(mapping).setQuery(builder);