我正在使用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模型。
答案 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 + " }";
}
}