• ElasticSearch入门案例


    1. 导入maven依赖

    <!--导入elasticsearch坐标-->
    
        <dependencies>
            <dependency>
                <groupId>org.elasticsearch</groupId>
                <artifactId>elasticsearch</artifactId>
                <version>5.6.8</version>
            </dependency>
            <dependency>
                <groupId>org.elasticsearch.client</groupId>
                <artifactId>transport</artifactId>
                <version>5.6.8</version>
            </dependency>
            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-to-slf4j</artifactId>
                <version>2.9.1</version>
            </dependency>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
                <version>1.7.24</version>
            </dependency>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-simple</artifactId>
                <version>1.7.21</version>
            </dependency>
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.12</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.10</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>RELEASE</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>RELEASE</version>
            </dependency>
    
            <!--jackson-->
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-core</artifactId>
                <version>2.8.1</version>
            </dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
                <version>2.8.1</version>
            </dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-annotations</artifactId>
                <version>2.8.1</version>
            </dependency>
    
        </dependencies>

    2. JavaAPI操作ElasticSearch

      2.1 创建索引库

      

    package com.pomelo.index;
    
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.itheima.domain.Article;
    import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
    import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequestBuilder;
    import org.elasticsearch.action.admin.indices.mapping.put.PutMappingResponse;
    import org.elasticsearch.action.delete.DeleteRequestBuilder;
    import org.elasticsearch.action.delete.DeleteResponse;
    import org.elasticsearch.action.index.IndexRequestBuilder;
    import org.elasticsearch.action.index.IndexResponse;
    import org.elasticsearch.action.update.UpdateRequestBuilder;
    import org.elasticsearch.action.update.UpdateResponse;
    import org.elasticsearch.client.transport.TransportClient;
    import org.elasticsearch.common.settings.Settings;
    import org.elasticsearch.common.transport.InetSocketTransportAddress;
    import org.elasticsearch.common.xcontent.XContentBuilder;
    import org.elasticsearch.common.xcontent.XContentFactory;
    import org.elasticsearch.common.xcontent.XContentType;
    import org.elasticsearch.transport.client.PreBuiltTransportClient;
    import org.junit.Test;
    
    import java.net.InetAddress;
    
    public class IndexManager {
    
        //创建连接对象
        public TransportClient getClient() throws Exception {
            /**
             * 1:配置es信息
             * 等价与:Settings settings1 = Settings.builder().put("cluster.name","elasticsearch").build();
             * 如果做集群,那么就必须使用这么上面这种定义,并且把集群名更改成自己自己设置的集群名。
             */
            Settings settings = Settings.EMPTY;
    
            //2: 创建客户端对象
            TransportClient transportClient = new PreBuiltTransportClient(settings);
            //3: 指定服务器的地址和ip
            transportClient.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9300));
    
            //返回
            return transportClient;
        }
    
        @Test  //创建索引库
        public void createIndex() throws Exception {
            //1. 获取连接
            TransportClient transportClient = this.getClient();
            //2. 创建索引库 http://localhost:9200/blog---put请求
            CreateIndexResponse indexResponse = transportClient.admin().indices().prepareCreate("blog").get();
            System.out.println(indexResponse.isShardsAcked());
            //3. 释放资源
            transportClient.close();
        }
    
        @Test //创建文档
        public void createIndexDocument() throws Exception {
            //1. 获取连接
            TransportClient transportClient = this.getClient();
            //2. 保存数据
            XContentBuilder contentBuilder = XContentFactory.jsonBuilder()
                    .startObject()
                    .field("id",1)
                    .field("title","elasticsearch是一个基于lucene的搜索服务")
                    .field("content","ElasticSearch是一个基于Lucene的搜索服务器。" +
                            "它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。" +
                            "Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布," +
                            "是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定," +
                            "可靠,快速,安装使用方便。")
                    .endObject();
            /**
             * 把json数据储存到es索引库中
             * 参数1:索引库
             * 参数2:类型/分类
             * 参数3:id
             * 如果没有指定id,就会用uuid生成的主键id
             */
            IndexRequestBuilder requestBuilder = transportClient.prepareIndex("blog", "content");
            IndexResponse indexResponse = requestBuilder.setSource(contentBuilder).get();
            System.out.println(indexResponse.status());
            //3. 释放资源
            transportClient.close();
        }
    
        @Test //基于实体类的方式创建文档数据
        public void createIndexDocumentByDomain() throws Exception {
            //1. 获取连接
            TransportClient client = this.getClient();
            //2. 保存数据
            Article article = new Article();
            article.setId(2);
            article.setTitle("solr是一个基于lucene的搜索服务");
            article.setContent("solr是一个基于Lucene的搜索服务器" +
                    " 它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。" +
                    " solr是用Java开发的,并作为Apache许可条款下的开放源码发布," +
                    " 是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定," +
                    " 可靠,快速,安装使用方便。");
    
            //转成json
            ObjectMapper mapper = new ObjectMapper();
            String json = mapper.writeValueAsString(article);
    
            IndexRequestBuilder requestBuilder = client.prepareIndex("blog", "content","1");
            IndexResponse indexResponse = requestBuilder.setSource(json, XContentType.JSON).get();
            System.out.println(indexResponse.status());
    
            //3. 释放资源
            client.close();
        }
    
        @Test //修改文档
        public void updateIndexDocument() throws Exception {
            //1. 获取连接
            TransportClient client = this.getClient();
            //2. 修改文档
            Article article = new Article();
            article.setId(3);
            article.setTitle("elasticsearch是一个基于lucene的搜索服务");
            article.setContent("elasticsearch是一个基于Lucene的搜索服务器" +
                    " 它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。" +
                    " elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布," +
                    " 是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定," +
                    " 可靠,快速,安装使用方便。");
    
            //转成json
            ObjectMapper mapper = new ObjectMapper();
            String json = mapper.writeValueAsString(article);
    
            UpdateRequestBuilder prepareUpdate = client.prepareUpdate("blog", "content", "1");
            UpdateResponse updateResponse = prepareUpdate.setDoc(json, XContentType.JSON).get();
            System.out.println(updateResponse.status());
    
            //3. 释放资源
            client.close();
        }
    
        @Test //删除文档
        public void deleteIndexDocument() throws Exception {
            //1. 获取连接
            TransportClient client = this.getClient();
            //2. 删除
            DeleteRequestBuilder deleteRequestBuilder = client.prepareDelete("blog", "content", "1");
            DeleteResponse deleteResponse = deleteRequestBuilder.get();
            System.out.println(deleteResponse.status());
            //3. 释放资源
            client.close();
        }
    
        /*
        //创建mapping规则
        "mappings": {
            "content": {
                "properties": {
                    "id": {
                        "store": true,
                        "type": "long"
                    },
                    "title": {
                        "analyzer": "ik_smart",
                        "store": true,
                        "type": "text"
                    },
                    "content": {
                        "analyzer": "ik_smart",
                        "store": true,
                        "type": "text"
                    }
                }
            }
        },
         */
        @Test
        public void createMapping() throws Exception {
            //1. 获取连接
            TransportClient client = this.getClient();
            //2. 创建索引库
            CreateIndexResponse indexResponse = client.admin().indices().prepareCreate("blog2").get();
            //3. 如果索引库存在,就创建mapping规则
            if(indexResponse.isAcknowledged()){
                XContentBuilder xContentBuilder = XContentFactory.jsonBuilder().startObject()
                        .startObject("content")
                        .startObject("properties")
                        .startObject("id").field("type","long").field("store",true).endObject()
                        //ik_max_word 最细切法(如果还能切继续切,切到没有为止) 和 ik_smart 最小切法
                        .startObject("title").field("type", "text").field("store", true).field("analyzer", "ik_smart").endObject()
                        .startObject("content").field("type", "text").field("store", true).field("analyzer", "ik_smart").endObject()
                        .endObject()
                        .endObject()
                        .endObject();
                PutMappingRequestBuilder mappingRequestBuilder = client.admin().indices().preparePutMapping("blog2").setType("content");
                PutMappingResponse mappingResponse = mappingRequestBuilder.setSource(xContentBuilder).get();
                System.out.println(mappingResponse.isAcknowledged());
            }
            //4. 关闭资源
            client.close();
        }
    
    }

      2.2 全文检索

      

    package com.pomelo.search;
    
    import org.elasticsearch.action.index.IndexRequestBuilder;
    import org.elasticsearch.action.index.IndexResponse;
    import org.elasticsearch.action.search.SearchResponse;
    import org.elasticsearch.client.transport.TransportClient;
    import org.elasticsearch.common.settings.Settings;
    import org.elasticsearch.common.text.Text;
    import org.elasticsearch.common.transport.InetSocketTransportAddress;
    import org.elasticsearch.index.query.QueryBuilder;
    import org.elasticsearch.index.query.QueryBuilders;
    import org.elasticsearch.search.SearchHit;
    import org.elasticsearch.search.SearchHits;
    import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
    import org.elasticsearch.search.sort.SortOrder;
    import org.elasticsearch.transport.client.PreBuiltTransportClient;
    import org.junit.Test;
    
    import java.net.InetAddress;
    import java.util.HashMap;
    import java.util.Map;
    
    public class SearchManager {
    
        //创建连接
        public TransportClient getClient() throws Exception {
            Settings settings = Settings.EMPTY;
            TransportClient client = new PreBuiltTransportClient(settings);
            client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
            return client;
        }
    
        @Test //创建索引库
        public void createIndexDocument() throws Exception {
            //1. 获取连接
            TransportClient client = this.getClient();
    
            //2. 创建文档
            Map<String, Object> map = new HashMap<>();
            for (int i = 1; i <= 30; i++) {
                map.put("id", i);
                map.put("title", i + " ,elasticsearch和solr都还行");
                map.put("content", i + " ,学习elasticsearch很快乐好难记");
                map.put("price", i + 100);
    
                IndexRequestBuilder requestBuilder = client.prepareIndex("blog3", "article", i + "");
                IndexResponse indexResponse = requestBuilder.setSource(map).get();
                System.out.println(indexResponse.status());
            }
            //3. 关闭资源
            client.close();
        }
    
        @Test //查询
        public void searchMain() throws Exception {
            //1. 获取连接对象
            TransportClient client = this.getClient();
    
            /**
             * 2. 查询条件:
             1:查询全部  QueryBuilders.matchAllQuery()
             2、字符串搜索 QueryBuilders.queryStringQuery(“elasticsearch”)
             3、词条搜索  QueryBuilders.termQuery(“content”,“elasticsearch”)
             4、根据ID搜索 QueryBuilders.idsQuery().addIds("1","2");
             *
             */
            //QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
             //QueryBuilder queryBuilder = QueryBuilders.queryStringQuery("elasticsearch好多API,字符串搜索会分词");
            //QueryBuilder queryBuilder = QueryBuilders.termQuery("content", "elasticsearch词条搜索不会分词");
            //QueryBuilder queryBuilder = QueryBuilders.idsQuery().addIds("1", "2", "3");
            QueryBuilder queryBuilder = QueryBuilders.termQuery("title", "solr");
    
    
            int pageNum = 1;  //当前页
            int pageSize = 10; //每页大小
    
            //高亮对象
            HighlightBuilder highlightBuilder = new HighlightBuilder();
            highlightBuilder.preTags("<span style='color:red'>");  //开始标签
            highlightBuilder.field("title");  //高亮字段
            highlightBuilder.postTags("</span>");  //结束标签
    
            //3. 执行查询
            SearchResponse searchResponse = client.prepareSearch("blog3")  //指定搜索库 多个用逗号分开
                    //  指定搜索的类型,多个用逗号分开
                    .setTypes("article")
                    // 排序
                    .addSort("price", SortOrder.ASC)
                    //  分页
                    .setFrom((pageNum - 1) * pageSize)
                    .setSize(pageSize)
                    //设置高亮
                    .highlighter(highlightBuilder)
                    //设置搜索条件
                    .setQuery(queryBuilder)
                    //  返回
                    .get();
    
            //4. 获取搜索结果
            SearchHits hits = searchResponse.getHits();
            System.out.println("搜索结果有:" + hits.getTotalHits() + "条数据");
            for (SearchHit hit : hits) {
    
                //索引库中的文档数据
                Map<String, Object> sourceAsMap = hit.getSourceAsMap();
                System.out.println("id: " + sourceAsMap.get("id"));
                System.out.println("content: " + sourceAsMap.get("content"));
                System.out.println("price: " + sourceAsMap.get("price"));
    
                //获取高亮内容
                if(hit.getHighlightFields() != null && hit.getHighlightFields().get("title") != null){
                    Text[] titles = hit.getHighlightFields().get("title").getFragments();
                    if(titles != null && titles.length > 0){
                        System.out.println("高亮内容是:" + titles[0].string());
                    }else {
                        System.out.println("title: " + sourceAsMap.get("title"));
                    }
                }else {
                    System.out.println("title: " + sourceAsMap.get("title"));
                }
                System.out.println("=========================================================");
            }
    
            //5. 释放连接
            client.close();
        }
    
    
    }
  • 相关阅读:
    两个jquery编写插件实例
    jquery编写插件(转)
    前后端分离
    理解流式布局
    元素外边距溢出(塌陷)
    超级有用的9个PHP代码片段
    php实现redis锁机制
    php程序守护进程
    SESSION机制
    php面试
  • 原文地址:https://www.cnblogs.com/pomelo-lemon/p/11431687.html
Copyright © 2020-2023  润新知