当前位置: 首页 > 知识库问答 >
问题:

在elasticsearch中检索单个字段

宋智明
2023-03-14

我目前正在学习一些关于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文档中的Shakespeare.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中删除两个特定字段“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,

我尝试返回responsereponse.gethits()response.gethits().gethits(),但没有成功。那么我在提取这些字段时遗漏了什么呢?

共有1个答案

薛宇
2023-03-14

可以使用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();

乌普特

对于ElasticSearch5.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();
 类似资料:
  • 问题内容: 我正在使用最新版本的elasticsearch-php以及最新版本的MongoDB和ElasticSearch。 我需要对可以包含一个或多个值的多个字段进行搜索。例: country_code应为NL,BE或DE,并且类别应包含AA01,BB01,CC02或ZZ11 我以为我会按照以下方式解决它(PHP): 但是结果甚至还不能接近我期望返回的数据。 有时 $ countries 和/或

  • 假设我们有一个ElasticSearch实例和一个索引。我现在要在整个索引中搜索包含特定值的文档。它与在多个字段上搜索该查询相关,因此我不想指定要在其中搜索的每个字段。 到目前为止我的尝试(使用NEST)如下: 在ConnectionString上应用以下调试后,我将获得以下输出: 我该怎么做?为什么我的查询是错误的?

  • 问题内容: 我曾经使用过django,haystack和elasticsearch。 我的search_index.py: 搜索表格: 模板: 看 ` 我得到所有的价值,那里有“老板”和“挡泥板” 当您在搜索框中输入“ boss fender”时,我没有结果。从搜索表单中,我只能得到一个单词的结果,例如“老板”。如何使搜索多个单词的能力? 问题答案: 这个月我陷入了这个问题。 为了执行正确的查询,

  • 我想请你帮忙。我想搜索一个词里面的标题和内容。下面是结构 查询字符串如下所示,我希望在类似“15-game”的文本中搜索“15-g”: 请接受我的道歉,如果我重复的问题,但我无法找到发生了什么,为什么它没有返回任何结果。 我已经看过了: 提前谢谢你!

  • 问题内容: 我有一些关于hibernate的查询, 表:Employee_Master ID号名称Varchar薪金长 POJO:EmployeeMaster.java 现在,我只想从此类ID中获取名称。 SQL查询像: 但是我们怎样才能在hibernate中实现以上相同的目的呢? 我知道这个解决方案,但是它将返回整个pojo列表。但是我只想要那个字段名称,那我该怎么办? 问题答案: 在HQL中,

  • 是否有一种方法可以使我在从索引中检索时,只获得文档的_source中的数据&而不是任何其他元数据,如_index、_type、_id和_score?