逻辑结构部分是一个倒排索引表:
一、将要搜索的文档内容分词,全部不重复的词组成分词列表。
二、将搜索的文档最终以Document方式存储起来。
三、每一个词和docment都有关联。java
下面是Elasticsearch与MySQL数据库逻辑结构概念的对比数据库
索引(index) =数据库(databases)
类型(type) =表(table)
文档(document)= 行(row)缓存
字符串类型网络
text
当一个字段是要被全文搜索的,好比Email内容、产品描述,应该使用text类型。设置text类型之后,字段内容会被分析,在生成倒排索引之前,字符串会被分析器分红一个一个词项。text类型的字段不用于排序,不多用于聚合。
keyword
keyword类型适用于索引结构化的字段,好比email地址、主机名、状态码和标签。若是字段须要进行过滤(好比查找已发布博客中status属性为published的文章)、排序、聚合。keyword类型的字段只能经过精确值搜索到。elasticsearch
elasticsearch 存在三种Java客户端。性能
<dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch‐rest‐high‐level‐client</artifactId> <version>6.5.3</version> </dependency>
插入单条数据:ui
HttpHost : url地址封装
RestClientBuilder: rest客户端构建器url
IndexRequest: 新增或修改请求
IndexResponse:新增或修改的响应结果rest
//1.链接rest接口 HttpHost http=new HttpHost("127.0.0.1",9200,"http"); RestClientBuilder builder= RestClient.builder(http);//rest构建器 RestHighLevelClient restHighLevelClient=new RestHighLevelClient(builder);//高级客户端对象 //2.封装请求对象 IndexRequest indexRequest=new IndexRequest("sku","doc","3"); Map skuMap =new HashMap(); skuMap.put("name","华为p30pro"); skuMap.put("saleNum",101021); skuMap.put("commentNum",10102321); Map spec=new HashMap(); spec.put("网络制式","移动4G"); spec.put("屏幕尺寸","5"); skuMap.put("spec",spec); indexRequest.source(skuMap); //3.获取响应结果 IndexResponse response = restHighLevelClient.index(indexRequest,RequestOptions.DEFAULT); int status = response.status().getStatus(); System.out.println(status); restHighLevelClient.close();
若是ID不存在则新增,若是ID存在则修改。
批处理请求:
BulkRequest: 批量请求(用于增删改操做)
BulkResponse:批量请求(用于增删改操做)code
//1.链接rest接口 HttpHost http=new HttpHost("127.0.0.1",9200,"http"); RestClientBuilder builder= RestClient.builder(http);//rest构建器 RestHighLevelClient restHighLevelClient=new RestHighLevelClient(builder);//高级客户端对象 //2.封装请求对象 BulkRequest bulkRequest=new BulkRequest(); IndexRequest indexRequest=new IndexRequest("sku","doc","4"); Map skuMap =new HashMap(); skuMap.put("name","华为p30pro 火爆上市"); skuMap.put("brandName","华为"); Map spec=new HashMap(); spec.put("网络制式","移动4G"); spec.put("屏幕尺寸","5"); skuMap.put("spec",spec); indexRequest.source(skuMap); bulkRequest.add(indexRequest);//能够屡次添加 //3.获取响应结果 BulkResponse response =restHighLevelClient.bulk(bulkRequest,RequestOptions.DEFAULT); int status = response.status().getStatus(); System.out.println(status); String message = response.buildFailureMessage(); System.out.println(message); restHighLevelClient.close();
SearchRequest: 查询请求对象
SearchResponse:查询响应对象
SearchSourceBuilder:查询源构建器
MatchQueryBuilder:匹配查询构建器
示例:查询商品名称包含手机的记录。
//1.链接rest接口 HttpHost http=new HttpHost("127.0.0.1",9200,"http"); RestClientBuilder builder= RestClient.builder(http);//rest构建器 RestHighLevelClient restHighLevelClient=new RestHighLevelClient(builder);//高级客户端对象 //2.封装查询请求 SearchRequest searchRequest=new SearchRequest("sku"); searchRequest.types("doc"); //设置查询的类型 SearchSourceBuilder searchSourceBuilder=new SearchSourceBuilder(); MatchQueryBuilder matchQueryBuilder= QueryBuilders.matchQuery("name","手机"); searchSourceBuilder.query(matchQueryBuilder); searchRequest.source(searchSourceBuilder); //3.获取查询结果 SearchResponse searchResponse = restHighLevelClient.search(searchRequest,RequestOptions.DEFAULT); SearchHits searchHits = searchResponse.getHits(); long totalHits = searchHits.getTotalHits(); System.out.println("记录数:"+totalHits); SearchHit[] hits = searchHits.getHits(); for(SearchHit hit:hits){ String source = hit.getSourceAsString(); System.out.println(source); } restHighLevelClient.close();
BoolQueryBuilder:布尔查询构建器
TermQueryBuilder:词条查询构建器
QueryBuilders:查询构建器工厂
示例:查询名称包含手机的,而且品牌为小米的记录
//1.链接rest接口 同上...... //2.封装查询请求 SearchRequest searchRequest=new SearchRequest("sku"); searchRequest.types("doc"); //设置查询的类型 SearchSourceBuilder searchSourceBuilder=new SearchSourceBuilder(); BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();//布尔查询构建器 MatchQueryBuilder matchQueryBuilder= QueryBuilders.matchQuery("name","手机"); boolQueryBuilder.must(matchQueryBuilder); TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("brandName","小米"); boolQueryBuilder.must(termQueryBuilder); searchSourceBuilder.query(boolQueryBuilder); searchRequest.source(searchSourceBuilder); //3.获取查询结果 同上......
过滤是针对搜索的结果进行过滤,过滤器主要判断的是文档是否匹配,不去计算和判断文档的匹配度得分,因此过滤器性能比查询要高,且方便缓存,推荐尽可能使用过滤器去实现查询或者过滤器和查询共同使用。
示例:筛选品牌为小米的记录
//1.链接rest接口 同上..... //2.封装查询请求 SearchRequest searchRequest=new SearchRequest("sku"); searchRequest.types("doc"); //设置查询的类型 SearchSourceBuilder searchSourceBuilder=new SearchSourceBuilder(); BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();//布尔查询构建器 TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("brandName","小米"); boolQueryBuilder.filter(termQueryBuilder); searchSourceBuilder.query(boolQueryBuilder); searchRequest.source(searchSourceBuilder); //3.获取查询结果 同上....
示例:按分组名称聚合查询,统计每一个分组的数量
GET /sku/_search { "size" : 0, "aggs" : { "sku_category" : { "terms" : { "field" : "categoryName" } } } } size为0 不会将数据查询出来,目的是让查询更快。
结果:
{ "took": 6, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": 5, "max_score": 0, "hits": [] }, "aggregations": { "sku_category": { "doc_count_error_upper_bound": 0, "sum_other_doc_count": 0, "buckets": [ { "key": "手机", "doc_count": 3 }, { "key": "电视", "doc_count": 2 } ] } } }
AggregationBuilders:聚合构建器工厂
TermsAggregationBuilder:词条聚合构建器
Aggregations:分组结果封装
Terms.Bucket: 桶
示例:按商品分类分组查询,求出每一个分类的文档数
//1.链接rest接口 HttpHost http=new HttpHost("127.0.0.1",9200,"http"); RestClientBuilder builder= RestClient.builder(http);//rest构建器 RestHighLevelClient restHighLevelClient=new RestHighLevelClient(builder);//高级客户端对象 //2.封装查询请求 SearchRequest searchRequest=new SearchRequest("sku"); searchRequest.types("doc"); //设置查询的类型 SearchSourceBuilder searchSourceBuilder=new SearchSourceBuilder(); TermsAggregationBuilder termsAggregationBuilder =AggregationBuilders.terms("sku_category").field("categoryName"); //这个field是真正的列,terms是定义的临时别名 searchSourceBuilder.aggregation(termsAggregationBuilder); searchSourceBuilder.size(0);//不会将数据查询出来,目的是让查询更快。 searchRequest.source(searchSourceBuilder); //3.获取查询结果 SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); Aggregations aggregations = searchResponse.getAggregations(); Map<String, Aggregation> asMap = aggregations.getAsMap(); Terms terms = (Terms) asMap.get("sku_category"); List<? extends Terms.Bucket> buckets = terms.getBuckets(); for(Terms.Bucket bucket:buckets){ System.out.println(bucket.getKeyAsString()+":"+ bucket.getDocCount() ); } restHighLevelClient.close();