【问题标题】:Elasticsearch returns empty json-objectsElasticsearch 返回空的 json 对象
【发布时间】: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?

标签: spring spring-boot elasticsearch spring-data logstash


【解决方案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 前缀 ...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-31
      • 1970-01-01
      • 2020-03-06
      • 2015-08-27
      • 1970-01-01
      • 2015-05-14
      • 1970-01-01
      • 2021-06-30
      相关资源
      最近更新 更多