Elasticsearch入门之常用编程操纵(三)

本文详细介绍了Elasticsearch的基本操作,包括创建和删除索引,定义映射,以及如何创建、修改和删除文档。通过具体示例,展示了如何使用XContentBuilder和Jackson进行文档管理,同时提供了查询文档的分页和高亮显示方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.索引

1.创建索引

  private String host = "127.0.0.1";
    private Integer port = 9300;
    //创建索引
    @Test
    public void testItemSearch()throws Exception{
        //1.创建客户端
        TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY)
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(host), port));
        //2.创建索引为blog2
        transportClient.admin().indices().prepareCreate("blog2").get();

        //关闭客户端,释放资源
        transportClient.close();

    }

我们创建的索引的Mapping中没有内容,我们需要自己定义

2.删除索引

//删除索引
    @Test
    public void deleteIndex()throws Exception{
        //1.创建客户端
        TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY)
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(host), port));
        //2.删除索引
        transportClient.admin().indices().prepareDelete("blog2").get();

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

二.映射

创建映射

 //创建映射
    @Test
    public void createMappering() throws  Exception{
        //1.创建客户端
        TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY)
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(host), port));
        //2.创建索引
        transportClient.admin().indices().prepareCreate("blog2").get();
        //2.创建映射
        /*
                        * 格式:
                * "mappings" : {
                "article" : {
                "properties" : {
                "id" : { "type" : "string" },
                "content" : { "type" : "string" },
                "author" : { "type" : "string" }
                }
                }
                }
         */
        XContentBuilder builder = XContentFactory.jsonBuilder()
                .startObject()
                .startObject("article")
                .startObject("properties")
                .startObject("id")
                .field("type", "string").field("store", "yes")
                .endObject()
                .startObject("content")
                .field("type", "string").field("store", "yes").field("analyzer", "ik_smart")
                .endObject()
                .startObject("autoor")
                .field("type", "string").field("store", "yes").field("analyzer", "ik_smart")
                .endObject()
                .endObject()
                .endObject()
                .endObject();
        //创建映射
        PutMappingRequest mapping = Requests.putMappingRequest("blog2")
                .type("article")
                .source(builder);
        transportClient.admin().indices().putMapping(mapping).get();

        //关闭资源
        transportClient.close();


    }

三.文档

1.通过XContentBuilder创建文档

.

 //通过XContentBuilder创建文档实体
    @Test
    public void createDocument()throws Exception{
        //1.创建客户端
        TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY)
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(host), port));
        //2.创建文档信息
        XContentBuilder builder = XContentFactory.jsonBuilder()
                .startObject()
                .field("id", 1)
                .field("title", "ElasticSearch是一个基于Lucene的搜索服务器")
                .field("content", "它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是\n" +
                        "用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。")
                .endObject();
        //3.创建文档对象
        transportClient.prepareIndex("blog2","article","1")
                .setSource(builder).get();


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

2.通过Jackson转化为实体

   //通过映射的方式创建文档  jackson转化
    @Test
    public void createDocument2()throws Exception{
        //1.创建客户端
        TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY)
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(host), port));
        //2.创建文档信息
        Article article = new Article();
        article.setId(2);
        article.setTitle("搜索工作其实很快乐");
        article.setContent("我们希望我们的搜索解决方案要快,我们希望有一个零配置和一个完全免费的搜索模\n" +
                "式,我们希望能够简单地使用JSON通过HTTP的索引数据,我们希望我们的搜索服务器始终可用,我们希望能够一台开\n" +
                "始并扩展到数百,我们要实时搜索,我们要简单的多租户,我们希望建立一个云的解决方案。Elasticsearch旨在解\n" +
                "决所有这些问题和更多的问题。");
        ObjectMapper objectMapper = new ObjectMapper();
        transportClient.prepareUpdate("blog2", "article", article.getId().toString())
                .setDoc(objectMapper.writeValueAsString(article)).get();
        //关闭资源
        transportClient.close();
    }

3.修改文档

//修改文档
    @Test
    public void updateDocument()throws Exception{
        //1.创建客户端
        TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY)
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(host), port));
        //2.创建文档信息
        Article article = new Article();
        article.setId(1);
        article.setTitle("搜索工作其实很快乐");
        article.setContent("我们希望我们的搜索解决方案要快,我们希望有一个零配置和一个完全免费的搜索模\n" +
                "式,我们希望能够简单地使用JSON通过HTTP的索引数据,我们希望我们的搜索服务器始终可用,我们希望能够一台开\n" +
                "始并扩展到数百,我们要实时搜索,我们要简单的多租户,我们希望建立一个云的解决方案。Elasticsearch旨在解\n" +
                "决所有这些问题和更多的问题。");
        ObjectMapper objectMapper = new ObjectMapper();
        transportClient.prepareUpdate("blog2", "article", article.getId().toString())
                .setDoc(objectMapper.writeValueAsString(article)).get();
        //关闭资源
        transportClient.close();
    }

直接用update修改

4.删除文档

第一种 prepareDelete

//删除文档  两种方式 prepareDelete    delete
    @Test
    public void deleteDocument() throws Exception{
        //1.创建客户端
        TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY)
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(host), port));
        transportClient.prepareDelete("blog2","article","1").get();
        transportClient.close();
    }

第二种delete

//删除blog2下的类型是article中的id为1的数据
client.delete(new DeleteRequest("blog2", "article", "1")).get();

四.查询文档分页操作

1.分页查询和排序

// 搜索数据
        SearchRequestBuilder searchRequestBuilder =
                transportClient.prepareSearch("blog2").setTypes("article")
                        .setQuery(QueryBuilders.matchAllQuery());//默认每页10条记录
        //setFrom():从第几条开始检索,默认是0。
//setSize():每页最多显示的记录数。
        searchRequestBuilder.setFrom(20).setSize(20);
// 排序
        searchRequestBuilder.addSort("id", SortOrder.DESC);
        SearchResponse searchResponse = searchRequestBuilder.get();

        SearchHits hits = searchResponse.getHits(); // 获取命中次数,查询结果有多少对象
        System.out.println("查询结果有:" + hits.getTotalHits() + "条");
        Iterator<SearchHit> iterator = hits.iterator();

 

五.查询结果高亮显示

  //查询结果高亮显示,我们一般我们在service
    @Test
    public void findHighter() throws Exception{
        //1.创建客户端
        TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY)
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(host), port));
        // 搜索数据
        SearchRequestBuilder searchRequestBuilder = transportClient
                .prepareSearch("blog2").setTypes("article")
                .setQuery(QueryBuilders.termQuery("title", "搜索"));//默认每页10条记录
        //设置高亮数据
        HighlightBuilder hiBuilder=new HighlightBuilder();
        hiBuilder.preTags("<font style='color:red'>");
        hiBuilder.postTags("</font>");
        hiBuilder.field("title");
        searchRequestBuilder.highlighter(hiBuilder);

        //获得查询数据
        SearchResponse searchResponse = searchRequestBuilder.get();
        //获取查询结果集
        SearchHits searchHits = searchResponse.getHits();
        System.out.println("共搜到:"+searchHits.getTotalHits()+"条结果!");
//遍历结果
        for(SearchHit hit:searchHits) {
            System.out.println("String方式打印文档搜索内容:");
            System.out.println(hit.getSourceAsString());
            System.out.println("Map方式打印高亮内容");
            System.out.println(hit.getHighlightFields());
            System.out.println("遍历高亮集合,打印高亮片段:");
            Text[] text = hit.getHighlightFields().get("title").getFragments();
            for (Text str : text) {
                System.out.println(str);
            }
        }
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奋斗的小巍

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值