gpt4 book ai didi

Spring数据elasticSearch使用findOne返回null

转载 作者:行者123 更新时间:2023-12-02 22:51:14 25 4
gpt4 key购买 nike

我正在使用 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”属性绑定(bind)到我的 idStr java 模型的方法。

最佳答案

真正的问题是什么

我们设置_id我们在 Elasticsearch 中的推文字段,使用 id twitter 给出的字段。但它以另一种格式保存(例如 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 + " }";
}
}

关于Spring数据elasticSearch使用findOne返回null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30195854/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com