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 + " }";
}
}
我正在使用 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 + " }";
}
}