ES

理解索引结构


逻辑结构部分是一个倒排索引表:
一、将要搜索的文档内容分词,全部不重复的词组成分词列表。
二、将搜索的文档最终以Document方式存储起来。
三、每一个词和docment都有关联。java

下面是Elasticsearch与MySQL数据库逻辑结构概念的对比数据库

索引(index) =数据库(databases)
类型(type) =表(table)
文档(document)= 行(row)缓存

字符串类型网络

text
当一个字段是要被全文搜索的,好比Email内容、产品描述,应该使用text类型。设置text类型之后,字段内容会被分析,在生成倒排索引之前,字符串会被分析器分红一个一个词项。text类型的字段不用于排序,不多用于聚合。
keyword
keyword类型适用于索引结构化的字段,好比email地址、主机名、状态码和标签。若是字段须要进行过滤(好比查找已发布博客中status属性为published的文章)、排序、聚合。keyword类型的字段只能经过精确值搜索到。elasticsearch

JavaRest 高级客户端简介

elasticsearch 存在三种Java客户端。性能

  1. Transport Client
  2. Java Low Level Rest Client(低级rest客户端)
  3. Java High Level REST Client(高级rest客户端)
    这三者的区别是:
    TransportClient没有使用RESTful风格的接口,而是二进制的方式传输数据。
    ES官方推出了Java Low Level REST Client,它支持RESTful。可是缺点是由于
    TransportClient的使用者把代码迁移到Low Level REST Client的工做量比较大。
    ES官方推出Java High Level REST Client,它是基于Java Low Level REST Client的封
    装,而且API接收参数和返回值和TransportClient是同样的,使得代码迁移变得容易
    而且支持了RESTful的风格,兼容了这两种客户端的优势。强烈建议ES5及其之后的
    版本使用Java High Level REST Client。
    准备工做:新建工程,引入依赖
<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();
相关文章
相关标签/搜索