ElasticSearch编程
参考文档(本文中省略了一些设置,具体请参考官方文档):
JavaRest客户端 官方文档(7.9)
1 - ElasticSearch高级Rest客户端
TransportClient API在7.x中已经删除,目前主要使用REST Client API。
而Rest Client Api又分为低级Rest客户端和高级Rest客户端。
High Client 基于 Low Client, 主要目的是暴露一些 API,这些 API 可以接受请求对象为参数,返回响应对象,而对请求和响应细节的处理都是由 client 自动完成的。
1.1 - 高级Rest客户端 - Maven
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.9.1</version> <!-- 版本按照安装的Es版本即可 -->
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.9.1</version> <!-- 同上 -->
</dependency>
1.2 - 高级Rest客户端 - 初始化
一个高级Rest客户端实例,需要基于一个低级Rest客户端生成器来构建。
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("localhost", 9200, "http"),
new HttpHost("localhost", 9201, "http")));
高级客户端将基于提供的构建器在内部创建用于执行请求的低级客户端。这个低级客户端会维护一个连接池并启动一些线程。
在关闭高级客户端时,高级客户端内部会自动释放低级客户端,采用以下命令即可:
client.close();
2 - ElasticSearch High Api
2.1 - 索引Api
2.1.1 - 创建索引
// “twitter” : 要创建的索引名称
CreateIndexRequest request = new CreateIndexRequest("twitter");
// 给创建的索引添加设置
// number_of_shards:是数据分片数,默认为5,有时候设置为3
// number_of_replicas:是数据备份数,如果只有一台机器,设置为0
request.settings(Settings.builder()
.put("index.number_of_shards", 3)
.put("index.number_of_replicas", 2));
// 创建索引的映射
// 第一个参数 是要定义的类型
// 第二个参数 表示此类型的映射,以JSON字符串形式提供
// 除此之外还以采用Map或者XContentBuilder,
// Map它会自动转换为JSON格式
// XContentBuilder对象提供的映射源,Elasticsearch内置帮助器可生成JSON内容
request.mapping(
"{\n" +
" \"properties\": {\n" +
" \"message\": {\n" +
" \"type\": \"text\"\n" +
" }\n" +
" }\n" +
"}",XContentType.JSON);
// 此处采用同步执行的方式,在执行完成前,程序会等待结果,直到程序结束。
// 此处也可采用异步模式,根据使用情况决定。
CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);
2.1.2 - 删除索引
// “twitter”:要删除的索引名称
DeleteIndexRequest request = new DeleteIndexRequest("twitter");
//超时,以等待所有节点确认索引删除 TimeValue
request.timeout(TimeValue.timeValueMinutes(2));
//超时,以等待所有节点确认索引删除 String
request.timeout("2m");
// 连接到主节点的超时 String,这个同样支持TimeValue的方式,两种采用一种即可
request.masterNodeTimeout("1m");
// 设置IndicesOptions控制如何解决不可用的索引以及如何扩展通配符表达式
request.indicesOptions(IndicesOptions.lenientExpandOpen());
// 同步执行模式
AcknowledgedResponse deleteIndexResponse = client.indices().delete(request, RequestOptions.DEFAULT);
2.2 - 文档Api
2.2.1 - 创建文档
// 存到哪个索引,以及文件编号
IndexRequest request = new IndexRequest("blog").id("1");
XContentBuilder builder = XContentFactory.jsonBuilder()
.startObject()
.field("id", 1)
.field("title", "ElasticSearch是一个基于Lucene的搜索服务器")
.field("content", "它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用 Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到 实时搜索,稳定,可靠,快速,安装使用方便。")
.endObject();
// 作为XContentBuilder对象提供的文档源,Elasticsearch内置帮助器可生成JSON内容
request.source(builder);
// 同步执行
IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT);
2.2.2 - 删除文档
// 索引,以及要删除的文档编号
DeleteRequest request = new DeleteRequest("blog", "1");
2.2.3 - 更新文档
// 指定要更新哪个索引的哪个文档
UpdateRequest request = new UpdateRequest("blog", "1");
// 将部分文档和现有文档合并,如果文档不存在会自动创建一个新的文档
String jsonString = "{" +
"\"updated\":\"2017-01-01\"," +
"\"reason\":\"daily update\"" +
"}";
request.doc(jsonString, XContentType.JSON);
// 同步执行
UpdateResponse updateResponse = client.update(request, RequestOptions.DEFAULT);
2.3 - 搜索Api
2.3.1 - 按关键字查询文档
// 创建搜索,指定要在哪个索引当中搜索
SearchRequest request = new SearchRequest("blog");
// 创建搜索条件,
SearchSourceBuilder searchSourceBuilder= new SearchSourceBuilder();
// 指定关键字搜索
searchSourceBuilder.query(QueryBuilders.termQuery("content", "搜索"));
// 从索引的开始位置搜索
searchSourceBuilder.from(0);
// 设置返回的搜索结果个数,默认为10
searchSourceBuilder.size(5);
// 设置搜索时间
searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
// 加载搜索设置
request.source(searchSourceBuilder);
// 同步执行
SearchResponse searchResponse = client.search(request, RequestOptions.DEFAULT);
// 获得搜索的结果
SearchHits hits = searchResponse.getHits();
System.out.println("查询结果有:" + hits.getTotalHits() + "条");
// 将每个搜索结果抽离出来,迭代
SearchHit[] searchHits = hits.getHits();
for (SearchHit hit : searchHits) {
// 将json格式的搜索结果,转化为Map格式
Map<String, Object> sourceAsMap = hit.getSourceAsMap();
// 指定获取某一项
String documentTitle = (String) sourceAsMap.get("title");
System.out.println(documentTitle + "\n");
// 直接打印搜索结果
String title1 = hit.getSourceAsString();
System.out.println(title1);
}
2.3.2 - 按字符串查询文档
// 修改一个关键方法即可,其余与上面相同
sourceBuilder.query(QueryBuilders.queryStringQuery( "搜索"));
2.3.3 - 按文档id查询文档
// 修改一个关键方法即可,其余与上面相同
sourceBuilder.query(QueryBuilders.idsQuery().addIds("1"));
2.3.4 - 模糊查询文档
// 创建一个搜索对象
MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("content", "搜");
// 设置为模糊搜索
matchQueryBuilder.fuzziness(Fuzziness.AUTO);
// 在匹配查询中设置前缀长度选项
matchQueryBuilder.prefixLength(3);
// 设置最大扩展选项以控制查询的模糊过程
matchQueryBuilder.maxExpansions(10);
// 最后还是要添加到SearchSourceBulider对象当中,
// 修改一个关键参数即可,其余与上面相同
searchSourceBuilder.query(matchQueryBuilder);
--------------------------------------------------------------
// 还可以用流式语句来创建
QueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("content", "搜索")
.fuzziness(Fuzziness.AUTO)
.prefixLength(3)
.maxExpansions(10);
2.3.5 - 分页查询
根据之前使用过的SearchScoureBulider的size设置和from设置完成分页查询。
通过size设置查询数量,如果每页10条数据则设置为10.
通过from设置从哪开始查,如果一页为10条数据,则从最后一条数据加一开始查。