Spring数据elasticSearch使用findOne

时间:2015-05-12 15:52:58

标签: spring elasticsearch spring-data-elasticsearch

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

我在一个别名下创建了一天的索引。我正试着找一条简单的推文。但是当我尝试findOne()时,它似乎无法正常工作,因为它始终返回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-stackoverflow-sample

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

1 个答案:

答案 0 :(得分:2)

真正的问题是什么

我们使用twitter提供的_id字段在Elasticsearch中设置推文的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 + " }";
    }
}