zoukankan      html  css  js  c++  java
  • ElasticSearch& ElasticSearch JAVA API

    ElasticSearch

    几个概念

    1.Elastic Search特点:分布式 、REstFul风格、数据分析引擎

    2.Elastic stack :包括Es、Kibana、Logstash、Beats (亦称为ELK Static)
    特点:任意数据来源和格式、实时分析、搜索、可视化

    3.类比


    相对于solr特点:易于安装、轻巧、json配置 、监控和指标

    安装和启动

    https://www.elastic.co/cn/downloads/elasticsearch
    Windows版本后解压缩后启动bin/elasticsearch.bat
    访问localhost:9200 如下信息:

    Es基础操作

    一、索引操作

    1.创建索引 put

    创建一个名为shopping 的索引
    Put http://127.0.0.1:9200/shopping Put具有幂等性

    2.获取索引信息 get

    3.查看所有索引信息 get

    http://127.0.01:9200/_cat/indices?v

    4.删除某个索引 delete

    二、文档操作

    1.创建文档post

    POST http://127.0.0.1:9200/shopping/_doc 数据写在请求body中 json格式
    自定义id http://127.0.0.1:9200/shopping/_doc/001,

    2.查询文档get

    ●通过ID查询
    Get http://127.0.0.1:9200/shopping/_doc/001

    ●获取所有数据
    Get http://127.0.0.1:9200/shopping/_search

    3.更新文档 put/post

    ●全局更新 更新整条json
    Post/put http://127.0.0.1:9200/shopping/_doc/001

    ●局部修改 只更新json的相应键的值
    Post http://127.0.0.1:9200/shopping/_update/001

    4.删除文档 delete

    Delete http://127.0.0.1:9200/shopping/_doc/001

    三、查询

    1.条件查询

    条件查询1 http://127.0.0.1:9200/shopping/_search?q=category:小米
    ●条件查询2(推荐)

    2.分页查询、选取想要的字段、排序

    From size分页 _source选取字段 sort 排序
    按照price(价格)倒序

    3.多条件查询和范围查询

    • Query中:
      • Bool:条件
        • Must:(与)
        • Should:(或)
    • filter 过滤
      • range 范围

    4.全文检索完全匹配、高亮查询

    match全文检索
    match_phrase完全匹配

    高亮查询

    5.聚合查询

    //term分组 avg平均值 max min sum ...

    6.映射关系

    为user索引创建映射关系

    四、---

    所有doc结构

    {
    "took": 541, #响应时间:ms
    "timed_out": false, #超时:false
    "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
    },
    "hits": { #命中的集合
    "total": { #数量
    "value": 1,
    "relation": "eq"
    },
    "max_score": 1.0, #集合中最大的权重
    "hits": [ #命中的集合
    {
    "_index": "user", #索引
    "_type": "_doc", #类型
    "_id": "001", #id
    "_score": 1.0, #权重
    "_source": { #记录详情
    "age": "23",
    "gender": "女",
    "name": "李啊"
    }
    }
    ]
    }
    }

    单条doc结构

    {
        "_index": "user",
        "_type": "_doc",
        "_id": "001",
        "_version": 1,
        "_seq_no": 0,
        "_primary_term": 1,
        "found": true,
        "_source": {
            "age": "23",
            "gender": "女",
            "name": "李康平"
        }
    }

    JAVA API

    1.pom.xml

            <!-- es-->
            <dependency>
                <groupId>org.elasticsearch</groupId>
                <artifactId>elasticsearch</artifactId>
                <version>7.8.0</version>
            </dependency>
            <!--es客户端-->
            <dependency>
                <groupId>org.elasticsearch.client</groupId>
                <artifactId>elasticsearch-rest-high-level-client</artifactId>
                <version>7.8.0</version>
            </dependency>
    
            <!--junit-->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
                <scope>test</scope>
            </dependency>
    
            <!--fastjson-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.53</version>
            </dependency>
    
            <!--log4j-->
            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-api</artifactId>
                <version>2.8.2</version>
            </dependency>
    

    2.实体类

    public class User {
        private String name;
        private Integer age;
        private String gender;
    
        public User(String name, Integer age, String gender) {
            this.name = name;
            this.age = age;
            this.gender = gender;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        public String getGender() {
            return gender;
        }
    
        public void setGender(String gender) {
            this.gender = gender;
        }
    }
    

    3.索引的操作

    /**
     * 索引的操作 新增、删除、查询
     */
    public class ES_Index {
        public static void main(String[] args) throws IOException {
            //ES客户端
            RestHighLevelClient esClient = new RestHighLevelClient(
                    RestClient.builder(new HttpHost("127.0.0.1", 9200, "http"))
            );
    
            //创建索引
    //         boolean flag=new ES_Index().createIndex(esClient,"user");
    //        System.out.println(flag);
    
            //查询
    //       String s=new ES_Index().searchIndex(esClient,"user").toString();
    //        System.out.println(s);
    
            //删除索引
    //        boolean b=new ES_Index().deleteIndex(esClient,"user");
    //        System.out.println(b);
    
    
            //关闭ES客户端
            esClient.close();
        }
    
        /**
         * 创建索引
         * @param client  RestHighLevelClient ES客户端
         * @param indexName  索引名称
         * @return  boolean 是否创建成功
         */
        public boolean createIndex(RestHighLevelClient client,String indexName) throws IOException {
            CreateIndexRequest userIndex = new CreateIndexRequest(indexName);
            CreateIndexResponse response= client.indices().create(userIndex, RequestOptions.DEFAULT);
            boolean acknowledged = response.isAcknowledged();
    
            return acknowledged;
        }
    
        /**
         *删除索引
         * @param client  RestHighLevelClient ES客户端
         * @param indexName  索引名称
         * @return boolean  是否删除成功
         * @throws IOException
         */
        public boolean deleteIndex(RestHighLevelClient client,String indexName) throws IOException {
            DeleteIndexRequest request= new DeleteIndexRequest(indexName);
            AcknowledgedResponse delete = client.indices().delete(request, RequestOptions.DEFAULT);
            return delete.isAcknowledged();
        }
    
    
        public Map searchIndex(RestHighLevelClient client,String indexName) throws IOException {
                GetIndexRequest request=new GetIndexRequest(indexName);
            GetIndexResponse getIndexResponse = client.indices().get(request, RequestOptions.DEFAULT);
            //这边对应的是 get Index返回的参数
            Map<String,Map> resMap=new HashMap();
            resMap.put("aliases",getIndexResponse.getAliases());
            resMap.put("mappings",getIndexResponse.getMappings());
            resMap.put("settings",getIndexResponse.getSettings());
            return resMap;
    
        }
    }
    
    

    4.文档的操作

    
    /**
     * 文档的操作
     *
     * 插入、更新  IndexRequest  request.source()    IndexResponse =client.index()
     * 局部更新    UpdateRequest    request.doc()   UpdateResponse=client.update()
     * 删除        DeleteReqeust
     * 查询       GetRequest
     *
     * 批量操作     BulkRequest.add(...Request);
     *
     */
    public class ES_Doc {
        /**
         * 插入/更新 User
         * @param client
         * @param indexName
         * @param user  实例类
         * @param id
         * @return
         * @throws IOException
         */
        public Map createDoc(RestHighLevelClient client, String indexName, User user, String id) throws IOException {
            IndexRequest request = new IndexRequest();
            //request index&id
            request.index(indexName).id(id);
            //request source
            String userJson = JSON.toJSONString(user);
            request.source(userJson, XContentType.JSON);
            //发送并响应
            IndexResponse response = client.index(request, RequestOptions.DEFAULT);
            Map<String, String> resMap = new HashMap();
            resMap.put("id", response.getId());
            resMap.put("result", response.getResult().toString());
            resMap.put("index", response.getIndex());
            return resMap;
        }
    
    
        /**
         * 局部修改文档-修改年龄
         * @param
         * @throws IOException
         */
        public Map updateDoc(RestHighLevelClient client,String indexName,String id,String age) throws IOException {
            UpdateRequest request=new UpdateRequest();
            //指定indexi&d
            request.index(indexName).id(id);
            //指定内容
            request.doc(XContentType.JSON,"age",age);
            //发送并响应
            UpdateResponse response = client.update(request, RequestOptions.DEFAULT);
            Map<String, String> resMap = new HashMap();
            resMap.put("id", response.getId());
            resMap.put("result", response.getResult().toString());
            resMap.put("index", response.getIndex());
            return resMap;
    
    
        }
    
        /**
         * 查询文档 返回json
         * @param client
         */
        public String  searchDoc(RestHighLevelClient client,String indexName,String id) throws IOException {
            GetRequest request=new GetRequest();
            request.index(indexName).id(id);
            GetResponse response = client.get(request, RequestOptions.DEFAULT);
            return response.getSourceAsString();
    
        }
    
        /**
         * 根据id删除文档
         * @param client
         * @param indexName
         * @param id
         */
        public  String deleteDoc(RestHighLevelClient client,String indexName,String id) throws IOException {
            DeleteRequest request=new DeleteRequest();
            request.index(indexName).id(id);
            DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);
           return  response.getResult().toString();
        }
    
    
        public void executebatch(RestHighLevelClient client,String indexName) throws IOException {
            BulkRequest bulkRrequest=new BulkRequest();
            //这里可以将多个 IndexRequestUpdateRequestDeleteRequest 放入
            for(int i=0;i<=7;i++){
                IndexRequest indexRequest=new IndexRequest();
                indexRequest.index(indexName).id("00"+i);
                User user=new User("张"+i,18+i,"男");
                String userJson=JSON.toJSONString(user);
                indexRequest.source(userJson, XContentType.JSON);
                bulkRrequest.add(indexRequest);
            }
            BulkResponse bulkResponse = client.bulk(bulkRrequest, RequestOptions.DEFAULT);
        }
    
    
        public static void main(String[] args) throws IOException {
            //ES客户端
            RestHighLevelClient client = new RestHighLevelClient(
                    RestClient.builder(new HttpHost("127.0.0.1", 9200, "http"))
            );
    
            //insert
    //        User user = new User("何必", 33, "男");
    //        Map<String,String> map=new ES_Doc().createDoc(client, "user", user, "003");
    //        System.out.println(map);
    
            //update
    //        Map<String,String> map=new ES_Doc().updateDoc(client,"user","001","31");
    //        System.out.println(map);
    
            //search By id
    //        String s=new ES_Doc().searchDoc(client,"user","002");
    //        System.out.println(s);
    
            //delete By id
    //        String dd=new ES_Doc().deleteDoc(client,"user","003");
    //        System.out.println(dd);
    
    
            new ES_Doc().executebatch(client,"user");
    
    
            //关闭ES客户端
            client.close();
        }
    }
    
    

    5.查询

    
    /**
     * 查询:
     *      全量、条件、组合、范围、模糊
     * 对查询结果:
     *      分页、排序、选取字段、高亮、聚合、分组
     */
    public class ES_Search {
        public static void main(String[] args) throws IOException {
            //ES客户端
            RestHighLevelClient esClient = new RestHighLevelClient(
                    RestClient.builder(new HttpHost("127.0.0.1", 9200, "http"))
            );
            //查询
            SearchRequest searchRequest=new SearchRequest();
            searchRequest.indices("user");
            //1.全量查询  matchAllQuery
    //        QueryBuilder query=  QueryBuilders.matchAllQuery();
    //        SearchSourceBuilder search=new SearchSourceBuilder().query(query);
    //        searchRequest.source(search);
    
            //2.条件查询 termQuery
    //        QueryBuilder query=QueryBuilders.termQuery("age",23);
    //        SearchSourceBuilder search=new SearchSourceBuilder().query(query);
    //        searchRequest.source(search);
    
            //3.组合查询 boolQuery
    //        BoolQueryBuilder query = QueryBuilders.boolQuery();
    //        query.must(QueryBuilders.matchQuery("age",23));
    //        query.should(QueryBuilders.matchQuery("gender","男"));
    //        query.mustNot(QueryBuilders.matchQuery("gender","女"));
    //        SearchSourceBuilder search = new SearchSourceBuilder().query(query);
    //        searchRequest.source(search);
    
            //4.范围查询  rangeQuery
    //        RangeQueryBuilder query = QueryBuilders.rangeQuery("age");
    //        query.gte(20);
    //        SearchSourceBuilder search=new SearchSourceBuilder().query(query);
    //        searchRequest.source(search);
    
            //5.模糊查询 fuzzyQuery
    //        FuzzyQueryBuilder query = QueryBuilders.fuzzyQuery("name", "张").fuzziness(Fuzziness.ONE);
    //        SearchSourceBuilder search=new SearchSourceBuilder().query(query);
    //        searchRequest.source(search);
    
    
            //a.分页
    //        QueryBuilder query = QueryBuilders.matchAllQuery();
    //        SearchSourceBuilder search = new SearchSourceBuilder().query(query);
    //        search.from(0);
    //        search.size(3);
    //        searchRequest.source(search);
    
            //b.排序-只能对数值型排序
    //           QueryBuilder query = QueryBuilders.matchAllQuery();
    //        SearchSourceBuilder search = new SearchSourceBuilder().query(query);
    //        search.sort("age", SortOrder.DESC);
    //        searchRequest.source(search);
    
            //c.过滤字段
    //         QueryBuilder query = QueryBuilders.matchAllQuery();
    //        SearchSourceBuilder search = new SearchSourceBuilder().query(query);
    //        search.fetchSource(new String[]{"name"},new String[]{});//String[] includes ,String[] excludes
    //        searchRequest.source(search);
    
            //d。高亮查询
    //        TermQueryBuilder query = QueryBuilders.termQuery("name", "张");
    //        SearchSourceBuilder search=new SearchSourceBuilder().query(query);
    //        HighlightBuilder highlighter = new HighlightBuilder();
    //        highlighter.preTags("<font color:'red'>");
    //        highlighter.postTags("</font>");
    //        highlighter.field("name");
    //        search.highlighter(highlighter);
    //        searchRequest.source(search);
    
            //e.聚合查询
    //        MatchAllQueryBuilder query = QueryBuilders.matchAllQuery();
    //        SearchSourceBuilder search=new SearchSourceBuilder().query(query);
    //        AggregationBuilder aggregationBuilder= AggregationBuilders.avg("avgAge").field("age");
    //        search.aggregation(aggregationBuilder);
    //        searchRequest.source(search);
    
            //f.分组查询
    //        MatchAllQueryBuilder query = QueryBuilders.matchAllQuery();
    //        SearchSourceBuilder search=new SearchSourceBuilder().query(query);
    //        AggregationBuilder aggregationBuilder= AggregationBuilders.terms("ageGroup").field("age");
    //        search.aggregation(aggregationBuilder);
    //        searchRequest.source(search);
    
    
    
            //结果
            SearchResponse searchResponse = esClient.search(searchRequest, RequestOptions.DEFAULT);
            Arrays.asList(searchResponse.getHits().getHits()).forEach(
                    a-> System.out.println(a)
            );
    
    
    
            //关闭ES客户端
             esClient.close();
    
        }
    }
    
    
  • 相关阅读:
    Comparable与Comparator
    【源码】String类、jdk1.6subString内存泄漏、字符串拼接几种区别、
    JAVA整型包装类的缓存策略
    通过tomcat把项目http请求转为https请求
    git rebase总结及git使用规范
    记一次对象序列化不打印value值为null的属性问题
    Layui-Tables+PHP分页
    Python操作字符串-截取IP地址
    命令行启动VMware虚拟机
    bat批处理备份桌面所有文档
  • 原文地址:https://www.cnblogs.com/mznsndy/p/15093131.html
Copyright © 2011-2022 走看看