我的代码有一个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()函数.
我错过了什么吗?
我试图通过这种依赖使用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
我在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版本中被折旧了.有没有其他方法可以帮助我在执行查询之前应用过滤器?我可能会遗漏一些明显的东西.我很感激你的帮助.
有多个文档,每个文档包含大约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的文档将被匹配
如何按照我提到的方式进行搜索?我一直在尝试各种不同的查询,似乎什么都没有用,有什么我想念的吗?
"_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
例:
|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) 我在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。正确的方法是什么?非常感谢你。