【Elasticsearch】java读取与写入

ES

1 Elasticsearch是啥

它不仅仅是 Lucene,并且也不仅仅只是一个全文搜索引擎。 它可以被下面这样准确的形容:

  • 一个分布式的实时文档存储,每个字段 可以被索引与搜索
  • 一个分布式实时分析搜索引擎
  • 能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据

ElasticSearch有很多插件,还可以做向量的一些分析。bert, deepfm等等,都可以被支持。除此之外,可以支持多表联查,但是mongo不支持。另外,比mysql好在,索引快,因此select非常省时间

2 es API

2.1 常用获取信息的接口

query:
  1. search
GET /my-index-000001/_search

GET /my-index-000001/_search?from=40&size=20
{
  "query": {
    "term": {
      "user.id": "kimchy"
    }
  }
}
GET your_index/_search
{
  "query": {
    "bool": {
      "must": [
        {}
      ],
      "filter": [
        {}
      ],
      "must_not": [
        {}
      ]
    }
  }
}

返回的值,带”_“的参数是ES自动生成的,_source里面是hive打数据时自己定义的

java api 写入

使用bulk

因为入库和读取不一样,读取要是实时的,因此只能用mSearch,但是入库是非实时的,因此使用bulk来处理。(批量操作,可以支持异步)

存储方法:

完成一个esSaver,这个是一个生产消费:consumer(消费任务,写入ES) and offer(生成一个任务)

  • offer
esSaverImpl.offer("temp-index", EsId, routing, JSONObject.parseObject(JSONObject.toJSONString(ret)));

// 使用的是bulk方法,有updateRequest, IndexRequest, DeleteRequest
// 这里实现一个insert
IndexRequest indexRequest = new IndexRequest().index(index).id(esId).routing(routing).source(document);

UpdateRequest updateRequest = new UpdateRequest().index(index).id(esId).routing(routing).doc(document).upsert(indexRequest);

queue.offer(updateRequest); // 然后将这个任务加入到queue这个队列里

  • consumer
    消费是一个定时任务
@Scheduled(fixedDelay = 1000L)
public void consumer() {
   BulkRequest bulkRequest = new BulkRequest().timeout(TimeValue.timeValueMinutes(5));
   while (!queue.isEmpty()) {
      UpdateRequest element = queue.poll();
      ...
      bulkRequest.add(element); // 加入到request里
      // 判断如果达到100个,则统一写入
      BulkResponse bulkItemResponses = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
   }
}
java api 读取数据
// 1 接口数据传入
List<Pair<Integer, SearchResult>> result = esService.multiSearch(request, Collections.singletonList(triplet), 0L);

SearchTemplateRequest templateRequest = new SearchTemplateRequest();
templateRequest.setRequest(new SearchRequest(item.getValue1().getIndex()).preference(Math.abs(userId % 10) + ""));

templateRequest.setScript(item.getValue1().getConf()); // ES 的query
templateRequest.setScriptType(ScriptType.INLINE);

templateRequest.setScriptParams(item.getValue2()); // ES query的参数

multiSearchRequest.add(templateRequest);

上述自定义的方法multiSearch背后 将数据格式转化成 MultiSearchTemplateRequest格式,其中包括查询的type, query, 以及query需要的参数.

然后调用msearchTemplate 得到结果

// 2 得到结果
MultiSearchTemplateResponse templateResponse = restHighLevelClient.msearchTemplate(multiSearchRequest, RequestOptions.DEFAULT);

MultiSearchTemplateResponse.Item response = templateResponse.getResponses()[i];

SearchResponse searchResponse = response.getResponse().getResponse();

response.getHits()// 得到搜索结果
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值