ElasticSearch Java API:Mget操作

2021-11-10 17:54:40 浏览数 (1)

创建一个主查询请求对象:

代码语言:javascript复制
MultiGetRequest request = new MultiGetRequest();

然后依次使用主请求对象的add方法,将子查询对象加入到主查询中

代码语言:javascript复制
request.add(new MultiGetRequest.Item("index", "type", "id")); 

查询的文档内容不返回:fetchSourceContext(FetchSourceContext.DO_NOT_FETCH_SOURCE)

代码语言:javascript复制
request.add(new MultiGetRequest.Item("index", "type", "id").fetchSourceContext(FetchSourceContext.DO_NOT_FETCH_SOURCE));

指定查询哪些字段内容 或 过滤掉哪些字段:

代码语言:javascript复制
String[] includes = new String[] {"user", "*r"};
String[] excludes = Strings.EMPTY_ARRAY;
FetchSourceContext fetchSourceContext = new FetchSourceContext(true, includes, excludes);
request.add(new MultiGetRequest.Item("index", "type", "id").fetchSourceContext(fetchSourceContext));

指定查询的路由分片和版本等:

代码语言:javascript复制
// 指定去哪个分片上查询,如何指定分片上没有,不会再去其它分片查询,如果不指定,则依次轮询各个分片查询
request.add(new MultiGetRequest.Item("index", "type", "with_routing").routing("some_routing"));
request.add(new MultiGetRequest.Item("index", "type", "with_parent").parent("some_parent"));
request.add(new MultiGetRequest.Item("index", "type", "with_version")
                    .versionType(VersionType.EXTERNAL)
                    .version(10123L));
                    
注:以上设置无法在主请求中设置

对主请求的设置:preference, realtime and refresh 需要在主请求里设置,子请求中无法设置这些值

代码语言:javascript复制
request.preference("some_preference");
request.realtime(false);  // realtime的值默认为true
request.refresh(true);

代码语言:javascript复制
POST sphinx-doctor/_mget
{
  "ids": [
    "134588"
  ]
}

通过索引名 id查询文档

代码语言:javascript复制
/**
 * multiGet 查询
 * @param id
 * @param indexName
 * @return
 */
public String multiGet (String id, String indexName) throws IOException{

    // 构建 multi get
    MultiGetRequest request = new MultiGetRequest();
    // 为每个 id 构建查询语句
    request.add(new MultiGetRequest.Item(indexName, "_doc", id));
    // 查询
    MultiGetResponse response = restHighLevelClient.mget(request, RequestOptions.DEFAULT);

    // 解析
    for (MultiGetItemResponse itemResponse : response) {
        // 判断当前item获取是否成功
        if (itemResponse.getFailure() != null) {
            continue;
        }
        // 获取响应结果
        GetResponse getResponse = itemResponse.getResponse();
        // 判断结果是否存在
        if (getResponse.isExists()) {
            // 获得命中的信息
            String sourceAsString = getResponse.getSourceAsString();
            // 解析命中的信息
           return sourceAsString;
        }
    }
    return "么有查到你想要的数据...";
}

0 人点赞