ElasticSearch中的SearchHits不包含使用Java API的字段
我正在运行此代码以返回匹配项ElasticSearch中的SearchHits不包含使用Java API的字段,java,
elasticsearch,Java,
elasticsearch,我正在运行此代码以返回匹配项 public ArrayList<InnerText> suggest(String text, boolean isPersonal){ TransportClient transportClient = new TransportClient(); Client ESclient = transportClient.addTransportAddress(new InetSocketTrans
public ArrayList<InnerText> suggest(String text, boolean isPersonal){
TransportClient transportClient = new TransportClient();
Client ESclient = transportClient.addTransportAddress(new InetSocketTransportAddress("localhost", 9300));
OrientGraph graph = new OrientGraph(ConnectionStrings.dbConnection);
Map<String, Object> template_params = new HashMap<>();
template_params.put("innerText", text);
SearchResponse response = ESclient.prepareSearch()
.setTemplateName("innerText_match")
.setTemplateType(ScriptService.ScriptType.FILE)
.setTemplateParams(template_params)
.execute()
.actionGet();
int index = 0;
ArrayList<InnerText> list = new ArrayList<InnerText>();
for (SearchHit hit : response.getHits()) {
//String uuid = hit.field(InnerTextProps.uuid).toString();
//InnerText innerText = vertexToInnerText(graph.getVertexByKey("InnerText.uuid",uuid),false);
//list.add(null);
//hit fields map is org.elasticsearch.util.collect.EmptyImmutableMap
}
return list;
}
公共数组列表建议(字符串文本,布尔值个人){
TransportClient TransportClient=新的TransportClient();
Client-ESclient=transportClient.addTransportAddress(新的InetSocketTransportAddress(“localhost”,9300));
OrientGraph图形=新的OrientGraph(ConnectionString.dbConnection);
Map template_params=new HashMap();
模板参数put(“innerText”,text);
SearchResponse=ESclient.prepareSearch()
.setTemplateName(“内部文本匹配”)
.setTemplateType(ScriptService.ScriptType.FILE)
.setTemplateParams(模板参数)
.execute()
.actionGet();
int指数=0;
ArrayList=新建ArrayList();
for(SearchHit:response.getHits()){
//字符串uuid=hit.field(InnerTextProps.uuid.toString();
//InnerText InnerText=VertextInnerText(graph.getVertexByKey(“InnerText.uuid”,uuid),false);
//list.add(空);
//命中域映射为org.elasticsearch.util.collect.EmptyImmutableMap
}
退货清单;
}
我得到了一些回击,但是每个SearchHits的字段映射都是空的(org.elasticsearch.util.collect.EmptyImmutableMap)。当使用Sense插件时,我发现使用相同的查询可以正确地存储和检索内容。我做错了什么
谢谢 经过对不同方法的探索,我发现:
将允许您在未请求特定字段的情况下访问数据SearchHit.sourceAsMap()
将允许您使用SearchHit.getFields()
SearchResponse.addFieldDataField(String)
Map
对象将包含String
值或后续的Map
值:
Map<String,Object> contents = hit.sourceAsMap();
for ( String name : contents.keySet() )
{
Object value = contents.get(name);
System.out.println( "Hit field: "+name+ " object: "+value.getClass().getName() );
if ( contents.get(name) instanceof java.util.HashMap )
{
// Handle map object
}
else
{
// Handle string value
}
}
对于本例中的值,将只生成null
。待续
EDIT2:最终解决方案
首先,只有在指定要检索的原始字段时,addFieldDataField()
方法才有效。使用分析的字段将导致错误“禁止在
上加载字段数据”
其次,当您使用addField()
检索字段时,始终指定叶字段,否则查询将失败
- 使用
SearchResponse.addFieldDataField(.raw)
- 使用
SearchResponse.addField()
SearchHitField.getValue()
检索该字段的内容。
祝你好运。我也面临同样的问题?你能修复它吗?不,我没有,所以我做的是获取id并再次访问数据库:/同时你找到了一些解决方案吗?我也有同样的问题(在2.1.1中),我可以看到,
hit.getSourceAsString()
返回了hit的完整内容-因此返回了数据。没有。不幸的是,我一般都在重构我的代码,我没有研究这一部分。。我仍在进行黑客身份查询:(.请向上投票,以便其他人可以看到它.)。。
Map<String,SearchHitField> fields = hit.getFields();
System.out.println( "Hit fields: "+fields.size() );
for ( SearchHitField field : fields.values() )
{
System.out.println( " Hit field: "+field.getName() );
System.out.println( " Value: "+field.getValue() );
}