繁体   English   中英

在 elasticsearch 中检索单个字段

[英]retrieving individual fields in elasticsearch

我目前正在学习一些有关 elasticsearch 的知识,现在我正在尝试从 searchResponse 中获取特定字段,我正在使用以下代码:

QueryBuilder qb = matchAllQuery();
    SearchResponse response = client.prepareSearch(ENTITY_INDEX_NAME)
            .setTypes(ENTITY_TYPE_NAME)
            .setSearchType(SearchType.QUERY_AND_FETCH)
            .setQuery(qb)
            .setFrom(0)
            .addSort("line_id", SortOrder.ASC)
            .setSize(MAX_SIZE_OF_ENTITIES_TO_RETURN)
            .execute().actionGet();
    client.close();
    return response.getHits();

所以我想问的是我如何从所有这些数据中获取特定字段,我的数据库由ElasticSearch 文档中的莎士比亚.Json aviable 组成,并且格式如下

{
"line_id": INT,
"play_name": "String",
"speech_number": INT,
"line_number": "String",
"speaker": "String",
"text_entry": "String",
}

这些是我正在使用的参数,以防有人感兴趣

{"hits":[{"score":"NaN","id":"2","type":"line","nestedIdentity":null,"version":-1,"source":{"play_name":"Henry IV","speech_number":"","line_number":"","text_entry":"Enter KING HENRY, LORD JOHN OF LANCASTER, the EARL of WESTMORELAND, SIR WALTER BLUNT, and others","speaker":"","line_id":3},"fields":{},"highlightFields":{},"sortValues":[3],"matchedQueries":[],"explanation":null,"shard":{"nodeId":"rxHxu9p_QSSc7K77NFUWQQ","index":"shakespeare","shardId":{"index":{"name":"shakespeare","uuid":"6C3R_1mIQlCVRZfn0XRogw"},"id":2,"indexName":"shakespeare"}},"innerHits":null,"index":"shakespeare","sourceRef":{"childResources":[]},"sourceAsString":"{\"line_id\":3,\"play_name\":\"Henry IV\",\"speech_number\":\"\",\"line_number\":\"\",\"speaker\":\"\",\"text_entry\":\"Enter KING HENRY, LORD JOHN OF LANCASTER, the EARL of WESTMORELAND, SIR WALTER BLUNT, and others\"}"},

这就是在浏览器中看到响应的方式任何答案或提示或任何东西都很好


编辑

我按照建议使用了setFetchSource(include,exclude) ,但仍然不知道如何从所有 _Source 中提取 2 个特定字段“text_entry”和“speaker”,我想要做的是返回一个只包含这两个字段的字符串,就像是:

KING HENRY IV,  Did lately meet in the intestine shock
KING HENRY IV,  The edge of war, like an ill-sheathed knife,
KING HENRY IV,  Whose soldier now, under whose blessed cross
KING HENRY IV,  Forthwith a power of English shall we levy;
KING HENRY IV,  Whose arms were moulded in their mothers womb
KING HENRY IV,  To chase these pagans in those holy fields
KING HENRY IV,  For our advantage on the bitter cross.
WESTMORELAND,   Whose worst was, that the noble Mortimer,

编辑 2

我尝试返回response reponse.getHits()response.getHits().getHits()无济于事。 那么我缺少什么来提取这些字段?

您可以使用SearchRequestBuilder类的addFields方法来指定一个或多个字段。

这里的它的Javadoc,这就是它说:

添加字段以作为搜索请求的一部分加载和返回。 如果没有指定,将返回文档的来源。

例如

SearchResponse response = client.prepareSearch(ENTITY_INDEX_NAME)
            .setTypes(ENTITY_TYPE_NAME)
            .addFields("field1", "field2") //fields
            .setSearchType(SearchType.QUERY_AND_FETCH)
            .setQuery(qb)
            .setFrom(0)
            .addSort("line_id", SortOrder.ASC)
            .setSize(MAX_SIZE_OF_ENTITIES_TO_RETURN)
            .execute().actionGet();

更新

对于setFetchSource 5.2,您需要使用setFetchSource方法来包含和排除字段( 这里是javadoc)。

例如

SearchResponse response = client.prepareSearch(ENTITY_INDEX_NAME)
            .setTypes(ENTITY_TYPE_NAME)
            .setFetchSource(new String[] {"field1"}, null) //fields
            .setSearchType(SearchType.QUERY_AND_FETCH)
            .setQuery(qb)
            .setFrom(0)
            .addSort("line_id", SortOrder.ASC)
            .setSize(MAX_SIZE_OF_ENTITIES_TO_RETURN)
            .execute().actionGet();

最后我使用了一个正则表达式来提取我正在寻找的子字符串

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM