1

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

我每天创建一个索引,使用别名。我试图找到一条简单的推文。但是当我尝试 a 时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”。也许是因为方法解析(看那里)。我正在寻找一种将我的 json“id_str”属性绑定到我的 idStr java 模型的方法。

4

1 回答 1

3

真正的问题是什么

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

解决方案

在那里,您有 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 + " }";
    }
}
于 2015-05-20T09:42:01.173 回答