Elasticsearch 返回空的 json 对象

Posted

技术标签:

【中文标题】Elasticsearch 返回空的 json 对象【英文标题】:Elasticsearch returns empty json-objects 【发布时间】:2020-03-14 02:55:31 【问题描述】:

我刚刚开始使用带有 spring 的 elasticsearch,这两种技术对我来说都是全新的。我已经使用 logstash 将数据上传到 elasticseach 索引,并且可以使用 kebana 成功搜索它。但是,当我尝试使用 spring 从索引返回到网页时,它只返回空的 json 对象,但会返回适量的空对象。是我错误地上传了数据还是我的代码有问题?我不明白为什么会发生这种情况,我希望能得到任何帮助。您可以在下面找到一些代码。

类型代码:

@Document(indexName="usmgbg_index", type="usmgbg_type")
public class Usmgbg 

    @Id
    private String ID;
    private String Source, Name, Profession, Country, FileName, LastModified, OwnerID;

存储库:

@Repository 
public interface UsmgbgRepository extends ElasticsearchRepository<Usmgbg, String>

控制器:

@RestController
public class UsmgbgController 
    @Autowired
    private UsmgbgRepository repository;
    
    @GetMapping("usmgbg/findall")
    public List<Usmgbg> findAllCustomers() 

        List<Usmgbg> items = new ArrayList<>();
        repository.findAll().forEach(items::add);
      
        return items;
     

我从 findAllCustomers 得到的输出如下:

[,,,,....]

【问题讨论】:

也许你的 _source 是假的? 这是配置文件的选项吗,因为我没有使用任何名为_source的字段,_source的默认选项是否为false? ***.com/questions/57308752/… 【参考方案1】:

我意识到这是一个老问题,但我遇到了同样的问题(可能出于不同的原因),我通过在模型中添加 getter 和 setter 解决了这个问题。

【讨论】:

【参考方案2】:

Iterable 从 findAll() 返回。

如果要获取列表,则应先获取内容。

改变

@Repository 
public interface UsmgbgRepository extends 
ElasticsearchRepository<Usmgbg, String>
     Page<Usmgbg> findAll();

然后

repository.findAll().getContent().forEach(items::add);

或者修复您的代码以迭代结果。

另一种解决方案是使用 QueryBuilders API 在 ElasticsearchRepository 中使用 search 方法。

  Iterable<Usmgbg>=
  repository.search(QueryBuilders.matchAllQuery);

【讨论】:

我试过这个,结果是一样的。我想我也可以提到如果我打印返回列表,它看起来像这样:[com.example.demo.usmgbg.Usmgbg@5025389, com.example.demo.usmgbg.Usmgbg@13dc7f1.....] 谢谢! 我已经尝试了你的两种方法,但它们给出了相同的结果?你还有什么想法吗? 不行,我换客户端的时候没有其他结果,明天还要多看!但是感谢您的帮助! 你可以随时切换到Java High Level Rest Client medium.com/@sourav.pati09/…【参考方案3】:

添加我的经验

spring-data 要求 getter 遵循 POJO 命名,即:getSomething()

所以它不起作用(当保存@Document时,spring-data没有向ElasticSearch发送任何字段,导致ES中的_source为空)当有Lombok @Accessors(fluent = true),因为它删除了 getter 上的 get 前缀 ...

【讨论】:

以上是关于Elasticsearch 返回空的 json 对象的主要内容,如果未能解决你的问题,请参考以下文章

返回一个空的 JSON 数组导致 Swift 中的越界错误

Elasticsearch 使用 Golang Beats 返回原始 JSON

Elasticsearch-PHP 处理JSON数组和对象

Branch.io initSession 返回空的引用参数 json

.NET(C#)通过JSON.NET反序列化Elasticsearch返回响应的结果

AlamofireObjectMapper 返回空的 jsonarray