1、使用multi get API可以通过索引名、类型名、文档id一次得到一个文档集合,文档可以来自同一个索引库,也可以来自不同索引库。示例如下:
MultiGetResponse multiGetItemResponses = client.prepareMultiGet()
.add("twitter", "tweet", "1") //注释1 .add("twitter", "tweet", "2", "3", "4") //注释2 .add("another", "type", "foo") //注释3 .get(); for (MultiGetItemResponse itemResponse : multiGetItemResponses) { //注释4 GetResponse response = itemResponse.getResponse(); if (response.isExists()) { //注释5 String json = response.getSourceAsString(); //注释6 } }
注释1: 通过单一的ID获取一个文档.
注释2:传入多个id,从相同的索引名/类型名中获取多个文档.
注释3:可以同时获取不同索引中的文档.
注释4:遍历结果集.
注释5:检验文档是否存在.
注释6:获取文档源.
2、要在Java中实现一个有三级父子关系的嵌套搜索,相关资料很少,发在stackoverflow上以后一个Switzerland的大神很快回复了我,google+stackoverflow很好使。对应的命令行query:
{
"query": { "has_child": { "type": "instance", "query": { "has_child": { "type": "instance_permission", "query": { "terms": { "uuid": { "index": "user", "type": "user", "id": "5", "path": "uuids" } } } } } } } }
Java api:
TermsLookupQueryBuilder terms = QueryBuilders
.termsLookupQuery("uuid") .lookupIndex("user") .lookupType("user") .lookupId("5") .lookupPath("uuids"); HasChildQueryBuilder hQuery = QueryBuilders .hasChildQuery("instance", QueryBuilders .hasChildQuery("instance_permission", terms)); System.out.println("Exectuing Query 1"); System.out.println(hQuery.toString()); SearchResponse searchResponse1 = client .prepareSearch("foo_oa_hr_askforleave") .setQuery(hQuery).execute().actionGet(); System.out.println("There were " + searchResponse1.getHits().getTotalHits() + " results found for Query 1."); System.out.println(searchResponse1.toString()); System.out.println();