ElasticSearch的原生操作CRUD以及高亮显示

至于ElasticSearch的介绍与安装在前面的文章已经介绍过,不了解的小伙伴可以去看看,此处就不在赘述,直接进入正题上代码
学习资料

  1. 引入maven坐标
 		<!--添加elasticsearch坐标-->
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>5.6.8</version>
        </dependency>
        <!--添加elasticsearch客户端坐标-->
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
            <version>5.6.8</version>
        </dependency>
        <!--fastjson-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.41</version>
        </dependency>
        <!--测试-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
  1. 测试 记得启动ElasticSearch
import com.alibaba.fastjson.JSONObject;
import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.Requests;
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.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
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.transport.client.PreBuiltTransportClient;
import org.junit.Before;
import org.junit.Test;

import java.net.InetAddress;
import java.util.Iterator;

public class ElasticsearchTest {
    TransportClient client;

    /**
     * 初始化客户端
     */
    @Before
    public void initClient() {
        try {
            // 创建Client连接对象
            Settings settings = Settings.builder()
                    //设置集群名字
                    .put("cluster.name", "elasticsearch")
                    .build();
            //获取客户端
            client = new PreBuiltTransportClient(settings)
                    //设置ip地址和端口号 此处端口号为9300  不是9200
                    .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
            System.out.println("获取客户端成功.....");
        } catch (Exception e) {
            System.out.println("获取客户端失败.....");
            e.printStackTrace();
        }
    }

     /**
     * 创建索引
     *  1. 在创建索引时 会默认分成5片,每片数据各不相同,5片数据联合起来才是一个完整的索引
     *  2. 每个分片都会有一个备份,如果当前分片挂掉,会启用备份分片
     *  3. 如果主分片和备份分片挂掉,那么当前索引将不再完整,则当前索引不可再用,建议使用集群
     */
    @Test
    public void createIndex() {
        try {
            //使用客户端获取到管理员权限
            client.admin()
                    //要对什么做操作   此处是对索引做操作
                    .indices()
                    //做什么操作   此处为创建索引操作   blog为索引的名字
                    .prepareCreate("blog")
                    //执行get请求
                    .get();
            //关闭客户端
            client.close();
            System.out.println("索引创建成功.....");
        } catch (Exception e) {
            System.out.println("索引创建失败.....");
            e.printStackTrace();
        }
    }

    /**
     * 设置mappings
     */
    @Test
    public void setMappings() {
        try {
            /**
             * {
             * 	"aticle": {
             * 		"properties": {
             * 			"id": {
             * 				"store": true,
             * 				"type": "long"
             *           },
             * 			"title": {
             * 				"analyzer": "ik_smart",
             * 				"store": true,
             * 				"type": "text"
             *            },
             * 			"content": {
             * 				"analyzer": "ik_smart",
             * 				"store": true,
             * 				"type": "text"
             *            }
             *       }
             *      }
             * }
             *
             * 不一定非要用XContentBuilder对象   只要能拼出上面的json字符串即可
             */
            //XContentBuilder对象  描述一个mappings  json字符串
            XContentBuilder content = XContentFactory.jsonBuilder()
                    //相当于 { 一个花括号
                    .startObject()
                    //设置一个type名 相当于aticle: {
                    .startObject("aticle")
                    //设置属性 properties: {
                    .startObject("properties")
                    .startObject("id")
                    //设置字段名id  类型为long
                    .field("type", "long")
                    //是否存储
                    .field("store", "yes")
                    //相当于 } 一个花括号
                    .endObject()
                    .startObject("title")
                    //string要全部小写  S大写会报错
                    .field("type", "string")
                    .field("store", "yes")
                    //设置分词器   使用ik分词器   默认标准分词器
                    .field("analyzer", "ik_smart")
                    .endObject()
                    .startObject("content")
                    .field("type", "string")
                    .field("store", "yes")
                    //设置分词器   使用ik分词器   默认标准分词器
                    .field("analyzer", "ik_smart")
                    .endObject()
                    .endObject()
                    .endObject()
                    .endObject();
            //创建映射  给索引名为blog 类型名为aticle 设置content
            PutMappingRequest mappingRequest = Requests.putMappingRequest("blog").type("aticle").source(content);
            //获取到管理员权限 给索引设置mappings
            client.admin().indices().putMapping(mappingRequest).get();
            //关闭客户端
            client.close();
            System.out.println("mapping设置成功");
        } catch (Exception e) {
            System.out.println("mapping设置失败");
            e.printStackTrace();
        }
    }

    /**
     * 创建文档
     */
    @Test
    public void createDocument() {
        try {
            /**
             *{"id":6,"title":"孟子","content":"富贵不能淫,贫贱不能移,威武不能屈,此之谓大丈夫"}
             */
            //此处舍弃XContentBuilder对象  改用fastjson
            JSONObject json = new JSONObject();
            json.put("id", 6L);
            json.put("title", "孟子");
            json.put("content", "富贵不能淫,贫贱不能移,威武不能屈,此之谓大丈夫");
            /**
             * 创建文档对象
             * 参数一: 索引对象  blog
             * 参数二: 类型名   aticle
             * 参数三: id  建立id   可以不写,系统默认生成   但是推荐写上并与上面的文档id一致
             */
            client.prepareIndex("blog", "aticle", "6").setSource(json).get();
            //关闭客户端
            client.close();
            System.out.println("文档创建成功......");
        } catch (Exception e) {
            System.out.println("文档创建失败......");
            e.printStackTrace();
        }
    }


    /**
     * id查询
     */
    @Test
    public void idQuery() {
        try {
            //设置索引和类型
            SearchResponse searchResponse = client.prepareSearch("blog").setTypes("aticle")
                    //设置搜索条件  并执行条件
                    .setQuery(QueryBuilders.idsQuery().addIds("2")).get();
            //遍历结果集
            traverseResult(searchResponse);
            //关闭客户端
            client.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 关键词查询
     */
    @Test
    public void termQuery() {
        try {
            //设置索引和类型
            SearchResponse searchResponse = client.prepareSearch("blog").setTypes("aticle")
                    //设置搜索条件  并执行条件
                    .setQuery(QueryBuilders.termQuery("title", "李白")).get();
            //遍历结果集
            traverseResult(searchResponse);
            //关闭客户端
            client.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 字符串查询
     */
    @Test
    public void stringQuery() {
        try {
            //设置索引和类型
            SearchResponse searchResponse = client.prepareSearch("blog").setTypes("aticle")
                    //设置搜索条件  并执行条件
                    .setQuery(QueryBuilders.queryStringQuery("大丈夫")).get();
            //遍历结果集
            traverseResult(searchResponse);
            //关闭客户端
            client.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 分页查询
     */
    @Test
    public void stringQueryByPage() {
        try {
            //设置索引和类型
            SearchRequestBuilder searchRequestBuilder = client.prepareSearch("blog").setTypes("aticle")
                    //设置搜索条件
                    .setQuery(QueryBuilders.queryStringQuery("人"));
            //设置分页 从第几条开始   每页显示多少条
            searchRequestBuilder.setFrom(0).setSize(5);
            //执行条件
            SearchResponse searchResponse = searchRequestBuilder.get();
            //遍历结果集
            traverseResult(searchResponse);
            //关闭客户端
            client.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 设置高亮
     */
    @Test
    public void setHighlight() {
        try {
            //设置索引和类型
            SearchRequestBuilder searchRequestBuilder = client.prepareSearch("blog").setTypes("aticle")
                    //设置搜索条件
                    .setQuery(QueryBuilders.termQuery("title", "孟子"));
            //获取高亮对象
            HighlightBuilder hiBuilder = new HighlightBuilder();
            hiBuilder.preTags("<font style='color:red'>");
            hiBuilder.postTags("</font>");
            hiBuilder.field("title");
            //设置高亮
            searchRequestBuilder.highlighter(hiBuilder);
            //执行条件
            SearchResponse searchResponse = searchRequestBuilder.get();
            //遍历结果集
            //获取命中次数
            SearchHits hits = searchResponse.getHits();
            //获取命中对象
            Iterator<SearchHit> iterator = hits.iterator();
            //遍历搜索结果数据
            while (iterator.hasNext()) {
                // 每个查询对象
                SearchHit searchHit = iterator.next();
                //得到对象将对象转为字符串
                String sourceAsString = searchHit.getSourceAsString();
                System.out.println(sourceAsString);
                //获取高亮数据
                Text[] text = searchHit.getHighlightFields().get("title").getFragments();
                //遍历高亮数据
                for (Text str : text) {
                    System.out.println(str);
                }
            }
            //关闭客户端
            client.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 遍历输出结果集
     */
    public void traverseResult(SearchResponse searchResponse) {
        //获取命中次数
        SearchHits hits = searchResponse.getHits();
        //获取命中对象
        Iterator<SearchHit> iterator = hits.iterator();
        //遍历搜索结果数据
        while (iterator.hasNext()) {
            // 每个查询对象
            SearchHit searchHit = iterator.next();
            //得到对象将对象转为字符串
            String sourceAsString = searchHit.getSourceAsString();
            System.out.println(sourceAsString);
        }
    }

}

如有不对欢迎大家批评指正!!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值