ElasticSearch java使用接口
ES
1 Elasticsearch是啥
它不仅仅是 Lucene,并且也不仅仅只是一个全文搜索引擎。 它可以被下面这样准确的形容:
- 一个分布式的实时文档存储,每个字段 可以被索引与搜索
- 一个分布式实时分析搜索引擎
- 能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据
ElasticSearch有很多插件,还可以做向量的一些分析。bert, deepfm等等,都可以被支持。除此之外,可以支持多表联查,但是mongo不支持。另外,比mysql好在,索引快,因此select非常省时间
2 es API
2.1 常用获取信息的接口
query:
- 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()// 得到搜索结果