gpt4 book ai didi

java - Jest getSourceAsObject 总是返回 NULL

转载 作者:搜寻专家 更新时间:2023-11-01 03:21:27 25 4
gpt4 key购买 nike

我正在尝试来自 Jest 的几个示例用作 ElasticSearch 集成的 POC。

现在,我正在尝试基本的 GET。我创建了一个名为 Document 的 POJO。里面有一些基本的 setter 和 getter 是一些字段。我填充它,然后使用 GSON 生成 JSON 文本。

从这个生成的 JSON,我进入 ElasticSearch Sense 并执行以下操作:

PUT /reports/documents/3
{
// JSON code
}

这生成得很好。然后我尝试使用 Get从 Java 中提取值,如下所示:

JestClientFactory factory = new JestClientFactory();

factory.setHttpClientConfig(new HttpClientConfig
.Builder("http://localhost:9200")
.multiThreaded(true)
.build());

client = factory.getObject();

Get get = new Get.Builder("reports", "3").type("documents").build();

try {
JestResult result = client.execute(get);
String json = result.getJsonString();
System.out.println(json);

Document doc = null;
doc = result.getSourceAsObject(Document.class);
System.out.println("is doc null? " + doc == null);
}catch (Exception e) {
System.err.println("Error getting document");
e.printStackTrace();
}

字符串 json返回我所期望的(显示 _index、_type、_id,当然还有 _source)。然而,doc总是显示为 NULL。我不确定为什么会这样。

只是为了看看这是否只是一个获取问题,我继续尝试搜索。我做了以下代码片段:

try {
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchQuery("reportNumber", "101221895CRT-004"));

Search search = new Search.Builder(searchSourceBuilder.toString())
// multiple index or types can be added.
.addIndex("reports")
.addType("documents")
.build();

SearchResult result = client.execute(search);

//List<Document> results = result.getSourceAsObjectList(Document.class);

List<SearchResult.Hit<Document, Void>> hits = result.getHits(Document.class);

for (SearchResult.Hit hit : hits) {
Document source = (Document) hit.source;
Void ex = (Void) hit.explanation;

System.out.println();
}

System.out.println("Result size: " + hits.size());
}catch (Exception e) {
System.err.println("Error searching");
e.printStackTrace();
}

当查看 result 时,显示对象的 JSON。然而,List<Document> results结果为 NULL。使用 hits 时, hits 的大小是正确的,但是"source"和"ex"都是NULL。

关于我在这方面做错了什么有什么想法吗?

更新
阅读 Cihat 的评论后,我继续并添加了日志记录。事实证明我在尝试转换日期时遇到错误(因此它总是以 NULL 返回)。

我收到以下错误消息:

Unhandled exception occurred while converting source to the object .com.someCompanyName.data.Document
com.google.gson.JsonSyntaxException: java.text.ParseException: Unparseable date: "Nov 6, 2014 8:29:00 AM"

我尝试了所有不同的格式:

  • 11/06/2014 8:29:00 AM(没有时间,只让年份为 14)
  • 2014 年 11 月 6 日 8:29:00 AM(没有时间,只使年份为 14)
  • 2014-11-06 8:29:00 AM(时间和年份变化相同)
  • 2014-NOV-06 8:29:00 AM(时间和年份变化相同)
  • 06/11/2014 8:29:00 AM(同样的事情)

所有这些都失败了。我确定我尝试了一些其他格式,所以不确定日期应该采用什么格式。我什至尝试了 DateFormat 中的确切日期。 JavaDocs,它仍然失败。每次我进行搜索时,它都会说要在 GsonBuilder 中定义 Dateformat,但在 Jest 中我无权访问它。

最佳答案

此测试用例演示了使用 Jest 索引文档,然后取回相同的文档。不是一个完整的答案,但希望看到一些已知有效的东西是有用的。

import io.searchbox.client.JestClient;
import io.searchbox.client.JestClientFactory;
import io.searchbox.client.JestResult;
import io.searchbox.client.config.HttpClientConfig;
import io.searchbox.core.Get;
import io.searchbox.core.Index;
import static org.hamcrest.Matchers.*;
import static org.hamcrest.MatcherAssert.*;
import org.junit.Test;

public class JestRoundtripIT {

public static final String INDEX = "reports";
public static final String TYPE = "documents";
public static final String ID = "3";

@Test
public void documentRoundTrip() throws Exception {
JestClientFactory factory = new JestClientFactory();

factory.setHttpClientConfig(new HttpClientConfig
.Builder("http://localhost:9200")
.multiThreaded(true)
.build());

JestClient client = factory.getObject();

Document original = new Document()
.withAuthor("Shay Banon")
.withContent("You know, for search...");

JestResult indexResult = client.execute(
new Index.Builder(original)
.index(INDEX)
.type(TYPE)
.id(ID)
.build());
assertThat(indexResult.isSucceeded(), equalTo(true));

JestResult getResult = client.execute(
new Get.Builder(INDEX, ID)
.type(TYPE)
.build());
assertThat(getResult.isSucceeded(), equalTo(true));

Document fromEs = getResult.getSourceAsObject(Document.class);

assertThat(fromEs, notNullValue());
assertThat(fromEs.getAuthor(), equalTo(original.getAuthor()));
assertThat(fromEs.getContent(), equalTo(original.getContent()));
}

public static class Document {
protected String author;
protected String content;
public Document withAuthor( String author ) {
this.author = author;
return this;
}

public Document withContent( String content ) {
this.content = content;
return this;
}

public String getAuthor() {
return author;
}

public void setAuthor( String author ) {
this.author = author;
}

public String getContent() {
return content;
}

public void setContent( String content ) {
this.content = content;
}
}
}

关于java - Jest getSourceAsObject 总是返回 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29756202/

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