标签: elasticsearch-java-api

如何使用ElasticSearch Java API从JSON构建聚合

我的代码有一个ElasticSearch查询和JSON格式的聚合,并且想要调用ElasticSearch Java API.

对于Query部分,我可以使用WrapperQuery从JSON构建查询,如下所示:

val query = Json.obj(
  "query_string" -> Json.obj("query" -> "*"))

val aggs = Json.obj(
  "gender" -> Json.obj("terms" -> Json.obj("field": "gender")),
  "age"    -> Json.obj("terms" -> Json.obj("field": "age")))

val aggsRequestBuilder = new SearchRequestBuilder(client)
  .setIndices(index())
  .setQuery(QueryBuilders.wrapperQuery(query.toString())
  .addAggregation(AggregationBuilders.???(aggs.toString())
Run Code Online (Sandbox Code Playgroud)

但是,我也有聚合的JSON,我没有看到可以用来从JSON构建聚合对象的AggregationsBuilder.wrapperAggregation()函数.

我错过了什么吗?

elasticsearch elasticsearch-java-api

3
推荐指数
1
解决办法
801
查看次数

Elasticsearch RestHighLevelClient缺少传递依赖项

我试图通过这种依赖使用RestHighLevelClient

    <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>elasticsearch-rest-high-level-client</artifactId>
        <version>6.0.1</version>
    </dependency>
Run Code Online (Sandbox Code Playgroud)

但我一直在RestHighLevelClient课堂上获得ClassNotFoundExceptions .

当我尝试连接这个bean时(AwsAmsElasticsearchClientConfig.java:

@Bean(name = "elasticsearchRestClient")
public RestHighLevelClient getElasticsearchRestClient() {
    RestClientBuilder restClientBuilder = RestClient.builder(
            new HttpHost(HOST, PORT, SCHEME));

    restClientBuilder.setHttpClientConfigCallback(
            new RestClientBuilder.HttpClientConfigCallback() {
                @Override
                public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
                    httpClientBuilder.addInterceptorLast(buildAwsSigningRequestInterceptor());
                    // add SSL config if needed
                    //  httpClientBuilder.setSSLContext(null);
                    return httpClientBuilder;
                }
            }
    );

    return new RestHighLevelClient(restClientBuilder);
}
Run Code Online (Sandbox Code Playgroud)

我收到这些错误:

19:51:11.026 ERROR [           main]                SpringApplication - Application startup failed
java.lang.ClassNotFoundException: org.elasticsearch.common.CheckedConsumer
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) [1 skipped]
    at com.glassdoor.applicantManagement.aws.AwsAmsElasticsearchClientConfig.getElasticsearchRestClient(AwsAmsElasticsearchClientConfig.java:63) [2 skipped] …
Run Code Online (Sandbox Code Playgroud)

java dependencies maven elasticsearch elasticsearch-java-api

3
推荐指数
1
解决办法
3795
查看次数

使用Java在Elasticsearch 2.3.3中过滤后查询

我在elasticsearch(v2.3.3)之上构建了一个Web应用程序.要过滤查询,我使用的是elasticsearch的后置过滤器.但我开始知道,如果我使用后置过滤器,那么过滤的性能优势将会丢失,因为我没有使用任何聚合或差分过滤.(参考:https://www.elastic.co/guide/en/elasticsearch/guide/current/_post_filter.html)

这就是我的elasticsearch客户端的样子:

Client client = TransportClient.builder().build().addTransportAddress(
        new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),
            9300));
    SearchResponse response = client.prepareSearch("index_name")
        .setTypes("index_type")
        .setQuery(QueryBuilders.simpleQueryStringQuery(query)
            .field("newContent").field("T"))
        .setPostFilter(QueryBuilders.termQuery(Collection, true))
        .setFetchSource(new String[] { "U", "UE", "UD", "T" }, null)
        .setVersion(true).addHighlightedField("newContent").setFrom(0)
        .setSize(10).execute().actionGet();
Run Code Online (Sandbox Code Playgroud)

我还读过过滤查询在elasticsearch 2.x版本中被折旧了.有没有其他方法可以帮助我在执行查询之前应用过滤器?我可能会遗漏一些明显的东西.我很感激你的帮助.

elasticsearch elasticsearch-java-api

2
推荐指数
1
解决办法
1067
查看次数

使用java api进行Elasticsearch多条件查询

有多个文档,每个文档包含大约100个字段.我想通过elasticsearch Java API 5.x执行以下搜索:

有3个字段我想用于此搜索,即

department
job
name
Run Code Online (Sandbox Code Playgroud)

我想搜索匹配"department:D1","department:D2","job:J1","job:J2""name:N1"等字段的返回文档

我一直试图这样做

String[] departments = ["d1","d2","d3"];
String[] jobs = ["j1","j2","j3"];
String[] names = ["n1"];

MultiSearchRequestBuilder requestbuilder; 

requestBuilder.add(client.prepareSearch().setQuery(QueryBuilders.termsQuery("department", departments)));
requestBuilder.add(client.prepareSearch().setQuery(QueryBuilders.termsQuery("job", jobs)));
requestBuilder.add(client.prepareSearch().setQuery(QueryBuilders.termsQuery("name", names)));

MultiSearchResponse response = requestBuilder.get();
Run Code Online (Sandbox Code Playgroud)

但是,执行查询就好像每个查询都是单个查询一样,即在本例中当d4中存在j3时,带有d4的文档将被匹配

如何按照我提到的方式进行搜索?我一直在尝试各种不同的查询,似乎什么都没有用,有什么我想念的吗?

java elasticsearch elasticsearch-java-api

2
推荐指数
1
解决办法
5505
查看次数

Elasticsearch 根据搜索查询更新整个“_source”字段

"_source": {
         "id": "5b1676493d21784208c36041",
         "label": "name",
         "properties": {
           "name": "patrick"
         },
         "updatedAt": 1528259039542
       }
Run Code Online (Sandbox Code Playgroud)

我想根据id(而不是_id)使用新文档更新此文档。

像这样的东西:

    "_source": {
             "dataSource": "ELASTIC",
             "entity": "vertices",
             "label": "vertices",
             "id": "5b1676493d21784208c36041",
             "properties": {
                     "name": "patrick"
                  },
             "updatedAt": 1528259039542
           }
Run Code Online (Sandbox Code Playgroud)

elasticsearch版本:6.2,ES Java api:6.2

elasticsearch elasticsearch-java-api

2
推荐指数
1
解决办法
4422
查看次数

我可以使用Elastic Search Java API搜索多个字段吗?

例:

|studentname | maths | computers |
++++++++++++++++++++++++++++++++++
|s1          |78     |90         |
==================================
|s2          |56     |75         |
==================================
|s3          |45     |50         |
==================================
Run Code Online (Sandbox Code Playgroud)

上表表示Elasticsearch中存在的数据.

考虑到用户输入60 and above然后Elasticsearch应该只能显示s1,因为他是唯一一个在两个科目中得分超过60的学生.

如何使用Java API解决它?

注意:我能够通过以下方式找到个别科目:

    QueryBuilder query = QueryBuilders.boolQuery()
            .should(
                     QueryBuilders.rangeQuery(maths)
                    .from(50)
                    .to(100)
            )
Run Code Online (Sandbox Code Playgroud)

java elasticsearch elasticsearch-java-api

1
推荐指数
1
解决办法
1134
查看次数

如何在Java API的应/必须方法内添加布尔查询?

我在elasticsearch中有这样的查询:

"query": {
        "bool": {
            "should": [
             {"bool": {
                   "must": [
                       {"term": {
                           "field1": "value1"
                       }},
                       {"term": {
                           "field2": "value2"
                       }}
               ]}
               },
               {"bool": {
                   "should": [
                       {"term":{                  
                           "field1": "value3"
                       }}
               ]}       
               }
            ]
        }
    }
Run Code Online (Sandbox Code Playgroud)

基本上是((field1 == value1 AND field2 == value2) OR (field1 == value3))。但是我还没有找到在Java API中实现该方法的方法。我已经尝试过这样的事情:

 BoolQueryBuilder filter = new BoolQueryBuilder()
                    .should(QueryBuilders.termQuery(field1, value3)
                    .should(QueryBuilders.boolQuery().must(QueryBuilders.termQuery(field1, value1))
                             .must(QueryBuilders.termQuery(field2, value2)))
                    );
Run Code Online (Sandbox Code Playgroud)

但该should方法不需要BoolQueryBuilder。正确的方法是什么?非常感谢你。

elasticsearch elasticsearch-java-api

0
推荐指数
1
解决办法
6337
查看次数