【问题标题】:Elasticsearch: send JSON query string via Java client?Elasticsearch:通过Java客户端发送JSON查询字符串?
【发布时间】:2014-09-13 19:36:21
【问题描述】:

我是 Elasticsearch 的新手。我阅读了 Elasticsearch 的 Java 客户端 API,能够构建查询并通过传输客户端将其发送到 Elasticsearch 服务器。

因为我的查询对于多级过滤器非常复杂,而且我注意到通过 Java 客户端构建查询很麻烦。我觉得构建一个 JSON 查询字符串然后通过 Java 客户端将其发送到 Elasticsearch 服务器要简单得多。

这是 Elasticsearch 提供的吗?

我确实喜欢 Elasticsearch Java API 在收到结果后可以执行的操作,例如滚动结果。我想保留这些功能。

感谢任何输入和链接!

问候。

【问题讨论】:

    标签: java elasticsearch


    【解决方案1】:

    对 Elasticsearch API 进行了进一步研究,发现 Elasticsearch 确实提供了这种功能。方法如下:

    SearchResponse scrollResp = client.prepareSearch("my-index")
            .setTypes("my-type")
            .setSearchType(SearchType.SCAN)
            .setQuery(query) // **<-- Query string in JSON format**
            .execute().actionGet();
    

    【讨论】:

    • 我只想感谢“
    • SearchType.SCAN 不再是 API 的一部分(至少不在 5.1.2 中,这是我目前使用的)
    【解决方案2】:

    您不能再将字符串传递给 .setQuery 函数,但是您可以像这样使用 WrapperQueryBuilder:

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

    【讨论】:

      【解决方案3】:

      我推荐使用 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();
      }
      

      【讨论】:

      • 这不能回答问题。
      【解决方案4】:

      ElasticSearch 具有内置功能,可以以有组织的方式完全满足您的需求。

      要回答您的问题,请查看此链接(该材料已在 elastic 网站上消失,因此可能不再有效):

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

      您所要做的就是构建一个包含您的搜索模板的简单文件,即复杂的搜索查询。 可以是简单的json文件,也可以是文本文件。

      现在您只需通过 java 代码传入参数即可。 请参阅链接中的示例,它使事情变得非常清楚。

      巴尔加夫。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-01
        • 2020-07-06
        • 1970-01-01
        相关资源
        最近更新 更多