无法从弹性搜索SearchResponse获取数据

时间:2015-01-20 13:07:46

标签: java elasticsearch

我正在尝试使用上面的代码从SearchResponse类中检索数据:

SearchHits searchHits = searchResponse.getHits();
for (SearchHit searchHit : searchHits) {
    SearchHitField title = searchHit.field("title");
    System.out.println(title.getValue().toString());
}

但是我在title.getValue()函数中得到一个空指针异常。 "标题"字段肯定存在,我可以通过打印提供以下输出的搜索响应来验证:

{
  "took" : 13,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 1.0,
    "hits" : [ {
      "_index" : "myIndex",
      "_type" : "myTye",
      "_id" : "5c849b0f-d72d-4cc9-9b8c-e1201f888f94",
      "_score" : 2.4181843,
      "_source":{"esId":"100200153", "title":"Book 1"}
    }
}

我知道我可以使用searchHit.getSource()检索数据,但我想知道为什么上述解决方案也不起作用。

2 个答案:

答案 0 :(得分:0)

我认为您必须在请求中指定.fields(fields)才能访问fields部分。

例如,如果您有这样的查询:

{
  "query": {
    "match_all": {}
  }
}

您会在结果的hits部分中获得一些字段(_id_type ...,_source)。 但是,如果你有这样的事情:

{
  "query": {
    "match_all": {}
  },
  "fields": ["my_field"]
}

你得到了不同的结果:

   "hits": {
      "total": 2,
      "max_score": 1,
      "hits": [
         {
            "_index": "test_malformed",
            "_type": "test",
            "_id": "1",
            "_score": 1,
            "fields": {
               "my_field": [
                  "whatever"
               ]
            }
         },
         ...

您注意到,在hits您有fields,其中返回了搜索请求中指定的字段。

答案 1 :(得分:0)

看起来你几乎就在那里。在每次点击时,不是获取标题,而是获取_source对象,然后获取该源对象的标题字段。