Elasticsearch:如何通过Java客户端发送JSON查询字符串?

4
我是一名新手使用 Elasticsearch。我阅读了 Elasticsearch 的 Java 客户端 API 并且能够通过传输客户端构建查询并将其发送到 Elasticsearch 服务器。
因为我的查询非常复杂,具有多级过滤器,而且我注意到通过 Java 客户端构建查询很繁琐。我觉得通过构建 JSON 查询字符串然后通过 Java 客户端发送到 Elasticsearch 服务器会更简单。
Elasticsearch 是否提供了这种功能?
我很喜欢 Elasticsearch Java API 在接收结果后所能做的事情,例如在结果上滚动。我想保留这些功能。
感谢任何意见和链接!
问候。
4个回答

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();

3
我只想感谢您的“<-- Query string in JSON format”评论 :) - MicNeo
SearchType.SCAN 不再是 API 的一部分(至少不在我目前使用的 5.1.2 版本中)。 - Giftiger Wunsch

3

现在你不能再将字符串传递给.setQuery函数,但是你可以使用WrapperQueryBuilder来实现:

WrapperQueryBuilder builder = QueryBuilders.wrapperQuery(searchQuery);
SearchRequestBuilder sr = client.prepareSearch().setIndices(index).setTypes(mapping).setQuery(builder);

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();
}

5
这并没有回答这个问题。 - R. van Twisk

1

ElasticSearch内置了按照你需要的方式进行组织的能力。

为了回答你的问题,请参阅此链接(elastic网站上的材料已经不存在,所以可能不再有效):

https://web.archive.org/web/20150906215934/https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/search.html

你需要做的就是构建一个简单的文件,其中包含你的搜索模板,即复杂的搜索查询。它可以是一个简单的json文件或文本文件。
现在,你只需通过你的java代码传递参数。请参考链接中的示例,它可以使事情更加清晰明了。
Bhargav.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接