Spring 数据 elasticSearch returns null with findOne

Spring data elasticSearch returns null with findOne

我正在使用 elasticSearch 测试 Spring 数据。 ES 服务器 运行 在同一房间的远程服务器上。

我每天在一个别名下创建一个索引。我试图找到一条简单的推文。但是当我尝试 findOne() 时,它似乎不起作用,因为它 returns 总是 null

此外,findAll(ids) 不起作用,因为我使用的是别名,但我在文档中找不到如何处理这个问题。

我想达到什么目标?

目前,只需检索带有给定 id_str 的推文。
count 方法有效,findOne 无效

这是我的问题
我应该怎么做才能让 findOne() 正常工作?
我应该使用哪种方式搜索此别名中的多个索引?

这是数据在 ES 中的样子

{
    "id_str" : "135131315100051",
    "..." : "...",
    "user" : {
        "id_str" : "15843643228"
        "..." : "..."
    }
}

我的模型

import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

@Document(indexName = "alias", type = "tweets")
public class Tweet
{
    @Id
    @Field(type = FieldType.String)
    private String idStr;

    public String getIdStr()
    {
        return idStr;
    }

    public void setIdStr(final String idStr)
    {
        this.idStr = idStr;
    }

    @Override
    public String toString()
    {
        return "{ id_str : " + idStr + " }";
    }
}

别名是 alias,索引是 alias_dd-mm-yyyy

我的存储库

import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

import com.thales.communications.osintlab.bigdata.webservices.models.Tweet;

public interface EsTweetRepository extends ElasticsearchRepository<Tweet, String>
{
    Tweet findByIdStr(String idStr);
}

我的测试

    @Test
    public void shouldReturnATweet()
    {

        //lets try to search same record in elasticsearch
        final Tweet tweet1 = tweetRepository.findOne("593768150975512576");
        //final Tweet tweet = tweetRepository.findByIdStr("593897683661824000");
        System.out.println("Count is " + tweet1);
        //System.out.println("Count is " + tweetRepository.count());
        //      System.out.println(tweet.toString());
    }

当然,测试Id的推文是存在的:)。 count() 工作正常。

感谢您的帮助


编辑

这是我的示例应用程序:https://github.com/ogdabou/es-Whosebug-sample

spring-data-elasticsearch 似乎在查找字段“_id”,而不是字段 "id_str"。可能是因为方法解析(看there)。我正在寻找一种方法将我的 json "id_str" 属性绑定到我的 idStr java 模型。

真正的问题是什么

我们在 Elasticsearch 中将推文的 _id 字段设置为推特提供的 id 字段。但它以另一种格式保存它(例如 132 变成 1.32E2)
当我去 findOne() 时,它正在搜索与 Elasticsearch _id 字段的匹配项,而不是我需要的 id_str

解决方案

There,你有 2 个提交,第一个是问题,第二个是解决方案。

新存储库

public interface EsTweetRepository extends ElasticsearchRepository<Tweet, String>
{
    @Query("{\"bool\" : {\"must\" : {\"term\" : {\"id_str\" : \"?0\"}}}}")
    Tweet findByIdStr(String idStr);
}

模特

@Document(indexName = "my_index_01", type = "tweets")
public class Tweet
{
    // Elasticsearch object internal id. Look at field "_id"
    @Id
    private String id;

    // Twitter internal id, saved under the "id_str" field
    @Field(type = FieldType.String)
    private String id_str;

    @Field(type = FieldType.String)
    private String text;

    public String getId_str()
    {
        return id_str;
    }

    public void setId_str(final String id_str)
    {
        this.id_str = id_str;
    }

    public String getText()
    {
        return text;
    }

    public void setText(final String text)
    {
        this.text = text;
    }

    public String getId()
    {
        return id;
    }

    public void setId(final String id)
    {
        this.id = id;
    }

    @Override
    public String toString()
    {
        return "{ _id : " + id + ", id_str :  " + id_str + ", text : " + text + " }";
    }
}