【问题标题】:retrieving individual fields in elasticsearch在弹性搜索中检索单个字段
【发布时间】:2017-07-01 23:29:18
【问题描述】:

我目前正在学习一些关于弹性搜索的知识,现在我正在尝试从 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();

所以我想问的是如何从所有这些数据中获取特定字段,我的数据库包含 shakespeare.JsonElasticSearch documentation 中可用,并且格式如下

{
"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() 无济于事。那么我在提取这些字段时缺少什么?

【问题讨论】:

    标签: java rest elasticsearch intellij-idea spring-data


    【解决方案1】:

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

    Here 是它的 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();
    

    更新

    对于elasticsearch 5.2,您需要使用setFetchSource 方法来包含和排除字段(here 是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();
    

    【讨论】:

    • addfields方法没有出现在对话框中,我目前使用的是elasticsearch 5.2,我应该降级吗?还是有其他选择?提前致谢
    • 抱歉,我不知道您使用的是 elasticsearch 5.2。我已经更新了我的答案(基本上,你需要使用setFetchSource的方法。你可以再试一次吗?
    • 我像这样使用 fetchSource:.setFetchSource(new String[]{"text_entry", "speaker"},new String[]{"hits","score","id","scrollId","totalShards","succe‌​ssfulShards","shardF‌​ailures","hits"}) 我的 response.gethits 看起来像这样:{"scrollId":null,"totalShards":5,"successfulShards":5,"shardFailures":[],"took 等(扬声器和 text_entry 在那里)所以我仍然不知道如何提取来自所有来源的 2 个特定字段
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2020-09-11
      • 1970-01-01
      • 1970-01-01
      • 2022-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多