欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

一个C++的ElasticSearch Client

程序员文章站 2022-04-10 15:43:18
ElasticSearch官方是没有提供C++的client的;因此决定自己写一个,命名为ESClient https://github.com/ATinyAnt/ESClient(手下留星 star) 优势是简单易用: * 封装大幅度减少了直接写DSL的机会,避免了一些非逻辑错误 * 只需要包含头 ......

elasticsearch官方是没有提供c++的client的;因此决定自己写一个,命名为esclient https://github.com/atinyant/esclient(手下留星 star)

优势是简单易用:

* 封装大幅度减少了直接写dsl的机会,避免了一些非逻辑错误

* 只需要包含头文件 request.h即可以使用

* 复杂的语句,可支持用原生(raw)json嵌套

目前esclient只支持常用的搜索短语,暂不支持插入、更新、删除和响应处理;原因是我们做elasticsearch服务时,一般只会用到搜索,而数据一般由其它进程清洗后,插入到elasticsearch中。并不是由当前的服务来进行增、删、改。当然后续会陆续完善这一部分(也希望你们可以帮忙完善)。

这个client,我并不想加入http模块,因为我认为加入http,很容易会侵入了使用者原来的架构。因此,这只是做一个dsl的编码器;编码得到json,可由使用者当前架构的http模块调用。

以下是两个使用例子

#include "request.h"

using namespace es;
request r;
std::string dsl = r.size(10).source({ "id" }).query(regexp("name", ".*tiny.*"));
printf("%s\n",  dsl.c_str());
// {"size":10,"_source":["id"],"query":{"regexp":{"name":".*tiny.*"}}}
#include "request.h"

using namespace es;
request r;
std::string dsl = r.size(10).source({"name"}).sort(
    {makeobject("timestamp",makeobjectstring("order", "desc"))}
    ).query(
        range1(
        "id",
        makepair("lt",567)
    ));
printf("%s\n", dsl.c_str());
// {"size":10,"_source":["name"],"sort":[{"timestamp":{"order":"desc"}}],"query":{"range":{"id":{"lt":567}}}}