使用Jest查询Elasticsearch数据

栏目: 后端 · 发布时间: 7年前

内容简介:不得不说,使用Elasticsearch的官方客户端在多个版本的时候很容易出现一些意想不到的问题,然而通过RESTful的方式可以尽可能的兼容多个版本的情况。下面我们通过Jest对Elasticsearch进行操作,这里使用的Jest版本是下面我们导入常用的包:

不得不说,使用Elasticsearch的官方客户端在多个版本的时候很容易出现一些意想不到的问题,然而通过RESTful的方式可以尽可能的兼容多个版本的情况。

下面我们通过Jest对Elasticsearch进行操作,这里使用的Jest版本是 6.3.1 ,而Elasticsearch版本是 6.3.1 。对应的依赖可以 访问 进行下载。

下面我们导入常用的包:

import java.util.*;  
import java.io.IOException;  
import com.google.gson.*;  
import io.searchbox.client.*;  
import io.searchbox.core.*;  
import io.searchbox.core.SearchResult.Hit;  
import io.searchbox.client.config.*;

接着我们定义1个客户端类,用于连接对应的客户端连接:

class ESClient {  
    private static final String ES_HOST = "http://127.0.0.1";  
    private static final int ES_HTTP_PORT = 9200;  
    private static JestClient client;  

    private static JestClient build(){  
        JestClientFactory factory = new JestClientFactory();  
        factory.setHttpClientConfig(new HttpClientConfig.Builder(ES_HOST+":"+ES_HTTP_PORT)  
                                   .multiThreaded(true) //设置为多线程  
                                   .defaultMaxTotalConnectionPerRoute(2)  
                                   .maxTotalConnection(2) //最大连接数  
                                   .connTimeout(10000)  //设置连接超时  
                                   .readTimeout(10000) //设置读取超时  
                                   .gson(new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create()) //设置日期的格式  
                                   .build());  
        client = factory.getObject();  
        return client;  
    }  

    public static synchronized JestClient getClient(){  
        if(client==null){  
            client = build();  
        }  
        return client;  
    }  
}

这里我们通过 JestClientFactory 的客户端工厂类的 getObject 方法得到对应的对象,并将其返回。

之后我们的调用的代码:

public class demo {  
    public static void main(String[] args){  
        JestClient client = new ESClient().getClient();  
        //构建JSON字符串  
        HashMap<String, Object> query_args = new HashMap<>();  
        HashMap<String, Object> match = new HashMap<>();  
        HashMap<String, Object> match_all = new HashMap<>();  
        match.put("match_all", match_all);  
        query_args.put("query", match);  
        GsonBuilder gsonBuilder = new GsonBuilder();  
        String query = gsonBuilder.serializeNulls().create().toJson(query_args);  
        //进行RESTful查询  
        Search.Builder searchBuilder = new Search.Builder(query).addIndex("demo").addType("person");  
        try{  
            SearchResult result = client.execute(searchBuilder.build());  
            List<Hit<JsonObject, Void>> hits = result.getHits(JsonObject.class);  
            for(Hit<JsonObject, Void> hit: hits){  
                JsonObject source = hit.source;  
                JsonPrimitive username = source.getAsJsonPrimitive("username");  
                JsonArray tags = source.getAsJsonArray("tags");  
                System.out.println(username);  
                System.out.println(tags);  
            }  
        } catch (IOException e){  
            e.printStackTrace();  
            e.getMessage();  
        }  

    }  
}

在这里,我们通过HashMap组装JSON对象,并通过之前介绍的Gson对其进行序列化为字符串,于是我们得到类似如下的字符串:

{"query":{"match_all":{}}}

接着,我们通过 Search.Builder 中传入1个字符串,然后通过 addIndex 指定我们要查询的index名称,还有对应的 doc_type 的名称。当我们执行ESClient客户端的execute提交后得到查询的结果。

而对应的结果类似如下组成的数组:

{"username":"王五","gender":"男","age":"21","region":"杭州","tags":["吃货","技术大牛"],"es_metadata_id":"1g3l82UB8TY7aIKswO1s"}

此时,我们通过搜索结果实例的getHits方法获取到对应的查询命中结果。在这里,我们在getHits方法中传入Gson中的JsonObject类。

最后,我们进行遍历,对于基础数据类型,我们需要设置其为 JsonPrimitive 类型,而对于数组则设置为 JsonArray ,同理对象或哈希表为 JsonObject 。这样我们就得到了对应的 Java 对象,进行组合并序列化后就可以返回到前端。

在这里,如果要获取记录的总条数,可以通过如下的2种方法来获取,首先最简单的方法是:

long total = result.getTotal();

我们直接调用搜索结果的 getTotal 方法即可。而第2种方法需要自行对JSON对象进行解析后才可以获取:

JsonObject hits = result.getJsonObject().getAsJsonObject("hits");  
int total = hits.get("total").getAsInt();

同样的,我们还有最大分数的获取,可以通过类似的方法来获得:

float score = result.getMaxScore();

下面我们进行手动解析的过程如下:

JsonObject hits = result.getJsonObject().getAsJsonObject("hits");  
if(hits!=null){  
    JsonArray response = hits.getAsJsonArray("hits");  
    for(JsonElement resp: response){  
    JsonObject source = new Gson().fromJson(resp, JsonObject.class).getAsJsonObject("_source");  
        JsonPrimitive username = source.getAsJsonPrimitive("username");  
        JsonArray tags = source.getAsJsonArray("tags");  
        System.out.println(username);  
        System.out.println(tags);  
    }  
}

可以看到这种方法,相比第1种方法需要编写更多的代码,反而显得不够简洁,不过对于理解其过程很有帮助。


以上所述就是小编给大家介绍的《使用Jest查询Elasticsearch数据》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

细节决定交互设计的成败

细节决定交互设计的成败

张亮 / 2009-3 / 49.00元

《细节决定交互设计的成败》是一本非常实用的有关软件界面的交互设计和可用性设计方面知识的书籍,通过采用一问一答的形式,你将会有针对性地学习到一些能够很快应用在自己软件开发工作中的细节知识和诀窍。例如,如何减轻用户的等待感,如何预防和减少用户的使用错误等。另外,你会发现阅读《细节决定交互设计的成败》时会非常轻松和愉悦;这是由于《细节决定交互设计的成败》写作上的两个特点:第一,采用较多日常生活中的例子来......一起来看看 《细节决定交互设计的成败》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试