Elasticsearch应用的十二个小案例

导入依赖

     <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
        </dependency>
        <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>

        <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.58</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.9.8</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.8</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.9.8</version>
        </dependency>

连接所有方法都要用,提成公共方法

public TransportClient getClient() throws UnknownHostException {
        //步骤一:创建一个Settings对象,指定集群名字
        Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();
        //步骤二:创建一个Client连接对象
        TransportClient client = new PreBuiltTransportClient(settings);
        //步骤三:连接到ES服务器
        client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
        client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9301));
        client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9302));
        return client;
    }

  1.创建一个空的索引库

/**
     * 创建空的索引库
     */
    @Test
    public void createNullIndex() throws UnknownHostException {
        TransportClient client = getClient();
        //创建一个空的索引库  admin()管理权限    indices()索引库   prepareCreate()创建一个索引库   get()执行之前的操作请求
        client.admin().indices().prepareCreate("y2170").get();
        //关闭client对象
        client.close();
    }

2.索引库指定Mapping信息

                {
                        "hello":{
                            "properties":{
                                "id":{
                                    "type":"long",
                                    "store":true,
                                    "index":"not_analyzed"
                                },
                                "title":{
                                    "type":"text",
                                    "store":true,
                                    "index":"analyzed",
                                    "analyzer":"ik_max_word"
                                },
                                "content":{
                                    "type":"text",
                                    "store":true,
                                    "index":"analyzed",
                                    "analyzer":"ik_max_word"
                                }
                            }
                        }
                }
/**
                 * 指定索引库的Mapping信息
                 */
                @Test
                public void createMappingByIndex() throws IOException {
                    TransportClient client = getClient();
                    //创建一个XContentBuilder对象,用于拼接JSON格式字符串
                    XContentBuilder xContentBuilder = XContentFactory.jsonBuilder();
                    xContentBuilder.startObject().startObject("hello").startObject("properties")
                            .startObject("id").field("type","long").field("store",true).field("index","not_analyzed").endObject()
                            .startObject("title").field("type","text").field("store",true).field("index","analyzed").field("analyzer","ik_max_word").endObject()
                            .startObject("content").field("type","text").field("store",true).field("index","analyzed").field("analyzer","ik_max_word").endObject()
                            .endObject().endObject().endObject();
                    //指定索引库以及Type类型的Mapping映射信息  preparePutMapping代表向哪一个索引库指定mpiing信息     setType代表该索引库下的TYPE,与上方JSON创建的Type保持一致
                    //setSource 指定JSON字符串的存储对象   get执行
                    client.admin().indices().preparePutMapping("y2170").setType("hello").setSource(xContentBuilder).get();

                    //关闭资源
                    client.close();
                }

3.创建索引库同时指定Mapping信息

            /**
             * 创建索引库并且指定Mapping信息
             */
            @Test
            public void createIndexAndMapping() throws IOException {
                TransportClient client = getClient();
                //创建索引库
                client.admin().indices().prepareCreate("wdksoft").get();
                //创建Mapping信息
                //创建一个XContentBuilder对象,用于拼接JSON格式字符串
                XContentBuilder xContentBuilder = XContentFactory.jsonBuilder();
                xContentBuilder.startObject().startObject("article").startObject("properties")
                        .startObject("id").field("type","long").field("store",true).field("index","not_analyzed").endObject()
                        .startObject("title").field("type","text").field("store",true).field("index","analyzed").field("analyzer","ik_max_word").endObject()
                        .startObject("content").field("type","text").field("store",true).field("index","analyzed").field("analyzer","ik_max_word").endObject()
                        .endObject().endObject().endObject();

                client.admin().indices().preparePutMapping("wdksoft").setType("article").setSource(xContentBuilder).get();

                //关闭资源
                client.close();
            }

4.删除索引库

 /**
             * 删除索引库
             */
            @Test
            public void deleteIndex() throws UnknownHostException {
                 TransportClient client = getClient();
                 //删除索引库
                 client.admin().indices().prepareDelete("wdksoft").get();

                //关闭资源
                client.close();
            }

5.创建文档-通过XContentBuilder对象拼接JSON格式字符串
       (  {  ) 开头用.startObject()

  (  }  )结尾用.endObject()

  域用.field(键,值),多个就继续在后面追加

 /**
             * 创建文档-通过XContentBuilder对象拼接JSON字符串
             */
            @Test
            public void createDocumentByXC() throws IOException {
                TransportClient client = getClient();
                //构建文档信息
                XContentBuilder xContentBuilder = XContentFactory.jsonBuilder();
                xContentBuilder.startObject().field("id",1).field("title","Lucene是apache软件基金会4 jakarta项目组的一个子项目")
                        .field("content","Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的")
                        .endObject();
                //创建文档
                client.prepareIndex("y2170","hello","1").setSource(xContentBuilder).get();
                client.close();
            }

6.创建文档-通过对象转换为JSON字符串Hello类

public class Hello {
    private Integer id;     //属性要跟Type的域的名字一致
    private String title;
    private String content;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public Hello(Integer id, String title, String content) {
        this.id = id;
        this.title = title;
        this.content = content;
    }

    public Hello() {
    }
}
/**
             * 创建文档-通过对象转换成JSON字符串
             * fastjson  String helloJson = JSON.toJSONString(hello);
             * jackson
             *      ObjectMapper objectMapper=new ObjectMapper();
             *      String helloJson = objectMapper.writeValueAsString(hello);
             */
            @Test
            public void createDocumentByObject() throws UnknownHostException, JsonProcessingException {
                TransportClient client = getClient();

                //准备一个数据(文档)对象
                Hello hello=new Hello(3,"ElasticSearch是一个基于Lucene的搜索服务器","ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。ElasticSearch用");
                //将对象转换为JSON格式字符串  fastjson
                /*String helloJson = JSON.toJSONString(hello);
                System.out.println(helloJson);*/

                //利用jackson转换
                ObjectMapper objectMapper=new ObjectMapper();
                String helloJson = objectMapper.writeValueAsString(hello);
                //向索引库中添加文档数据
                client.prepareIndex("y2170","hello","3").setSource(helloJson, XContentType.JSON).get();
                client.close();
            }
   

7.删除文档

           /**
             * 删除文档
             */
            @Test
            public void deleteDocument() throws UnknownHostException, JsonProcessingException {
                TransportClient client = getClient();

                //删除文档
                client.prepareDelete("y2170","hello","4").get();

                client.close();
            }

8.查询文档-根据文档ID查询

/**
             * 根据文档ID进行查询
             */
            @Test
            public void getDocumentByID() throws UnknownHostException, JsonProcessingException {
                TransportClient client = getClient();
                //执行查询,可查询多个
                SearchResponse searchResponse = client.prepareSearch("y2170").setTypes("hello").setQuery(
                        QueryBuilders.idsQuery().addIds("1", "2")
                ).get();
                //获取到查询结果
                SearchHits hits = searchResponse.getHits();
                //如果返回数据较多,默认进行分页,默认10条数据
                System.out.println("获取到文档数据条目数:"+hits.getTotalHits());
                //获取到文档数据
                Iterator<SearchHit> iterator = hits.iterator();
                while (iterator.hasNext()){
                    SearchHit hit = iterator.next();
                    System.out.println(hit.getSourceAsString());
                    System.out.println("content:"+hit.getSource().get("content"));
                }

                client.close();
            }

9.查询文档-根据Term关键词查询

 /**
             * 根据Term分词进行查询
             */
            @Test
            public void getDocumentByTerm() throws UnknownHostException, JsonProcessingException {
                TransportClient client = getClient();
                //执行查询,可查询多个
                SearchResponse searchResponse = client.prepareSearch("y2170").setTypes("hello").setQuery(
                        QueryBuilders.termQuery("title","服务器")
                ).get();
                //获取到查询结果
                SearchHits hits = searchResponse.getHits();
                //如果返回数据较多,默认进行分页,默认10条数据
                System.out.println("获取到文档数据条目数:"+hits.getTotalHits());
                //获取到文档数据
                Iterator<SearchHit> iterator = hits.iterator();
                while (iterator.hasNext()){
                    SearchHit hit = iterator.next();
                    System.out.println(hit.getSourceAsString());
                    System.out.println("content:"+hit.getSource().get("content"));
                }

                client.close();
            }

10.查询文档-根据QueryString查询文档

 @Test
            public void getDocumentByQueryString() throws UnknownHostException, JsonProcessingException {
                TransportClient client = getClient();
                //执行查询
                SearchResponse searchResponse = client.prepareSearch("y2170").setTypes("hello").setQuery(
                        QueryBuilders.queryStringQuery("Solr是一个独立的企业级搜索应用服务器")
                ).get();
                //获取到查询结果
                SearchHits hits = searchResponse.getHits();
                //如果返回数据较多,默认进行分页,默认10条数据
                System.out.println("获取到文档数据条目数:"+hits.getTotalHits());
                //获取到文档数据
                Iterator<SearchHit> iterator = hits.iterator();
                while (iterator.hasNext()){
                    SearchHit hit = iterator.next();
                    System.out.println(hit.getSourceAsString());
                    System.out.println("content:"+hit.getSource().get("content"));
                }

                client.close();
            

11.查询数据的分页检索
            ES当中默认检索数据是10条

 /**
             * 分页
             */
            @Test
            public void getDocumentByQueryStringlimit() throws UnknownHostException, JsonProcessingException {
                TransportClient client = getClient();
                //设置查询条件
                SearchRequestBuilder searchRequestBuilder = client.prepareSearch("y2170").setTypes("hello").setQuery(
                        QueryBuilders.queryStringQuery("服务器")
                );
                //加入分页规则       setFrom代表从那一条数据开始获取
                searchRequestBuilder.setFrom(0).setSize(5);
                SearchResponse searchResponse = searchRequestBuilder.get();
                //获取到查询结果
                SearchHits hits = searchResponse.getHits();
                //如果返回数据较多,默认进行分页,默认10条数据
                System.out.println("获取到文档数据条目数:" + hits.getTotalHits());
                //获取到文档数据
                Iterator<SearchHit> iterator = hits.iterator();
                while (iterator.hasNext()) {
                    SearchHit hit = iterator.next();
                    System.out.println(hit.getSourceAsString());
                    System.out.println("content:" + hit.getSource().get("content"));
                }

                client.close();
            }

12.查询数据的高亮显示执行查询数据之前设置高亮显示规则

                1.设置高亮显示的域
                2.设置高亮显示前缀
                3.设置高亮显示后缀
            执行查询
            获取到高亮显示的数据
          

  /**
                 * 高亮显示
                 */
                @Test
                public void getDocumentByQueryHight() throws UnknownHostException, JsonProcessingException {
                    TransportClient client = getClient();
                    //设置查询条件
                    SearchRequestBuilder searchRequestBuilder = client.prepareSearch("y2170").setTypes("hello").setQuery(
                            QueryBuilders.termQuery("title", "服务器")
                    );
                    //加入分页规则       setFrom代表从那一条数据开始获取
                    searchRequestBuilder.setFrom(0).setSize(5);
                    //设置高亮规则
                    HighlightBuilder highlightBuilder=new HighlightBuilder();
                    //指定高亮显示的域
                    highlightBuilder.field("title");
                    highlightBuilder.preTags("<span style=‘color:red‘>");
                    highlightBuilder.postTags("</span>");
                    searchRequestBuilder.highlighter(highlightBuilder);
                    //执行查询
                    SearchResponse searchResponse = searchRequestBuilder.get();
                    //获取到查询结果
                    SearchHits hits = searchResponse.getHits();
                    //如果返回数据较多,默认进行分页,默认10条数据
                    System.out.println("获取到文档数据条目数:" + hits.getTotalHits());
                    //获取到文档数据
                    Iterator<SearchHit> iterator = hits.iterator();
                    while (iterator.hasNext()) {
                        SearchHit hit = iterator.next();
                        System.out.println(hit.getSourceAsString());
                        /* System.out.println("content:" + hit.getSource().get("content"));*/

                        //获取高亮结果
                        Text[] titles = hit.getHighlightFields().get("title").getFragments();
                        for(Text text:titles){
                            System.out.println("高亮显示数据为:"+text);
                        }
                    }

                    client.close();
                }

原文地址:https://www.cnblogs.com/danxun/p/12394080.html

时间: 2024-08-05 20:25:15

Elasticsearch应用的十二个小案例的相关文章

十五道Python小案例,学会这些,Python基础已过关!

十五道Python的小案例,不知道各位都会了多少! 一.猜数字 1到4能组成多少个互不相同且不重复数字的三位数?分别是? 分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去 掉不满足条件的排列. 程序源代码: 二.公司发放的奖金的计算 分析:请利用数轴来分界,定位.注意定义时需把奖金定义成长整型. 程序源代码: 三.一个整数加上100后是一个完全平方数,再加168又是一个完全平方数,请问该数是多少? 分析: 程序源代码: 四.输入*年*月*日,判断这一天是这一年的第几天?

性能测试四十二:sql案例之联合索引最左前缀

联合索引:一个索引同时作用于多个字段 联合索引的最左前缀: A.B.C3个字段--联合索引 这个时候,可以使用的查询条件有:A.A+B.A+C.A+B+C,唯独不能使用B+C,即最左侧那个字段必须匹配到 联合索引最左前缀如果匹配不到,会造成索引失效,对性能影响非常大,所以联合索引的顺序很重要 看一下案例 Unique: 这种情况,单个cardNO.course.sex均允许重复,但是当这3个字段组到一起以后,就不允许任何两个重复,这里为了设计特别场景,把sex移到索引字段的最前面 接口:http

python基础(十二)--小知识点汇总及编码进阶

'''python2 python3 '''#python2#print()  print 'abc'#range()   xrange() 生成器# raw_input() #python3#print('abc')#range()# input() # = 赋值 == 比较值是否相等   is 比较,比较的是内存地址  id(内容)# li1 = [1,2,3]# li2 = li1# li3 = li2# print(id(li1),id(li2)) #数字,字符串 小数据池#数字的范围

JavaScript基础--小案例:在网页指定位置弹出错误信息(十二)

案例分析:点击按钮后,在网页上指定区域,提示错误信息!5秒后,错误信息提示自动消失! 1 <script languag="javascript" type="text/javascript"> 2 var clearId; 3 function test(){ 4 document.getElementById("showMsg").style.cssText="width:200px;height:50px;left:6

三十二、iptables filter表小案例、iptables nat表应用

一.iptables filter表小案例 需求:只针对filter表,预设策略INPUT链DROP,其他两个链ACCEPT,然后针对192.168.188.0/24开通22端口,对所有网段开放80端口,对所有网段开放21端口. 这个需求写一个脚本,内容如下: # vi /usr/local/sbin/iptables.sh #! /bin/bash ipt="/usr/sbin/iptables"      //ipt:定义了一个变量,应写绝对路径. $ipt -F $ipt -P

JAVA之旅(二十二)——Map概述,子类对象特点,共性方法,keySet,entrySet,Map小练习

JAVA之旅(二十二)--Map概述,子类对象特点,共性方法,keySet,entrySet,Map小练习 继续坚持下去吧,各位骚年们! 事实上,我们的数据结构,只剩下这个Map的知识点了,平时开发中,也是能看到他的,所以还是非常值得去学习的一个知识点的,我们直接开车了 一.Map概述 泛型< k,v> 键值对,映射关系 基本特点 该集合存储键值对,是一对一对往里存,而且要保证键的唯一性 1.添加 put(key ,values) putAll() 2.删除 clear() remove(ob

几个数据库的小案例(二):极其简单的省市联动

总用有两个文件(frmMain.cs SqlHelper.cs) //frmMain.cs//作者:Meusing System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace 省市联动

Cocos2dx 小技巧(十二) 一种可行的系列动画播放方式

定义: 将一个类(Adaptee)的接口转换成客户(Client)希望的另外一个接口(Target). 目标接口(Target):客户所期待的接口.目标可以是具体的或抽象的类,也可以是接口. 需要适配的类(Adaptee):需要适配的类或适配者类. 适配器(Adapter):使得一个东西适合另一个东西的东西.百度中定义为:接口转换器.通过包装一个需要适配的对象,把源接口转换成目标接口. 为什么要适配:需要的东西已做好,但是不能用,短时间又不能改造,想办法适配它. 作用: 使得原本由于接口不兼容而

十(4)iptables语法、iptables filter表小案例、iptables nat表应用

                                    iptables语法 filter表: INPUT链:作用于进入本机的包 OUTPUT链:作用于送出本机的包 FORWARD链:作用于和本机无关的包 nat表: PREROUTING链:作用是包在刚刚到达防火墙时改变包的目标地址 OUTPUT链:改变本地产生的包的目标地址 POSTROUTING链:作用是在包将离开防火墙时改变包源地址 1.查看iptables规则 iptables -nvL  (此时默认查看filter表,