使用 java api 的 Elasticsearch 多条件查询
Elasticsearch multiple condition query using java api
有多个文档,每个文档包含大约 100 个字段。我想通过 elasticsearch Java API 5.x:
执行以下搜索
我想将 3 个字段用于此搜索,即
department
job
name
我想搜索与 "department: D1"、"department: D2"、"job: J1"、"job: J2" "name: N1" 等字段匹配的 return 文档
我一直在尝试这样做
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();
然而,查询的执行就像每个查询都是一个单独的查询一样,即在这个例子中,当 j3 存在于 d4 中时,具有 d4 的文档也将被匹配
如何按照我说的方式进行搜索?我一直在尝试许多不同的查询,但似乎没有任何效果,我是否遗漏了什么?
您不想使用 MultiSearchRequestBuilder
,您只需要在 bool/filter
查询中组合您的三个约束:
BoolQueryBuilder query = QueryBuilders.boolQuery()
.filter(QueryBuilders.termsQuery("department", departments))
.filter(QueryBuilders.termsQuery("job", jobs))
.filter(QueryBuilders.termsQuery("name", names));
SearchResponse resp = client.prepareSearch().setQuery(query).get();
对于使用HighRestClient的Elasticsearch 5.6.4,添加所需数量的sourcebuilder...
static RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));
public static void multisearch() throws IOException{
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.termQuery("name", "vijay1"));
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices("posts-1","posts-2").source(sourceBuilder);
SearchResponse searchResponse = client.search(searchRequest);
RestStatus status = searchResponse.status();
System.out.println(searchResponse.toString());
有多个文档,每个文档包含大约 100 个字段。我想通过 elasticsearch Java API 5.x:
执行以下搜索我想将 3 个字段用于此搜索,即
department
job
name
我想搜索与 "department: D1"、"department: D2"、"job: J1"、"job: J2" "name: N1" 等字段匹配的 return 文档
我一直在尝试这样做
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();
然而,查询的执行就像每个查询都是一个单独的查询一样,即在这个例子中,当 j3 存在于 d4 中时,具有 d4 的文档也将被匹配
如何按照我说的方式进行搜索?我一直在尝试许多不同的查询,但似乎没有任何效果,我是否遗漏了什么?
您不想使用 MultiSearchRequestBuilder
,您只需要在 bool/filter
查询中组合您的三个约束:
BoolQueryBuilder query = QueryBuilders.boolQuery()
.filter(QueryBuilders.termsQuery("department", departments))
.filter(QueryBuilders.termsQuery("job", jobs))
.filter(QueryBuilders.termsQuery("name", names));
SearchResponse resp = client.prepareSearch().setQuery(query).get();
对于使用HighRestClient的Elasticsearch 5.6.4,添加所需数量的sourcebuilder...
static RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));
public static void multisearch() throws IOException{
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.termQuery("name", "vijay1"));
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices("posts-1","posts-2").source(sourceBuilder);
SearchResponse searchResponse = client.search(searchRequest);
RestStatus status = searchResponse.status();
System.out.println(searchResponse.toString());