elasticsearch,Java,elasticsearch" /> elasticsearch,Java,elasticsearch" />

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() );
        }