Java操作索引库

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.12</version>
    </dependency>
</dependencies>

创建索引index

 @Test
    public void createIndex() throws Exception{
        //1.创建一个settings对象 相当于配置信息
        //连接集群
        Settings settings= Settings.builder()
                .put("cluster.name","my-elasticsearch")
                .build();
        //2.创建一个客户单Client对象
        TransportClient client =new PreBuiltTransportClient(settings);
        //设置节点
        client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9300));
        client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9400));
        client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9500));
        //3.使用Client对象创建一个索引库  创建一个名weeindexhello的索引
        client.admin().indices().prepareCreate("index_hello")
                //.get执行操作
                .get();
        //4.关闭Client
        client.close();
    }

创建映射mapping

 @Test
    public void setMappings() throws Exception{
      //创建一个mapping信息

       XContentBuilder builder= XContentFactory.jsonBuilder()
               .startObject()
                 .startObject("article")
                   .startObject("properties")
                      .startObject("id")
                       .field("type","long")
                       .field("store",true)
                       .endObject()
                      .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();
      //使用client把Mapping信息设置到索引库中
       client.admin().indices()
               //设置要映射的索引
               .preparePutMapping("index_hello")
               //设置要做映射的type
               .setType("article")
               //mapping信息 可以是XContentBuilder对象 可以是json格式的字符串
               .setSource(builder)
               //执行操作
               .get();
         //关闭连接
       client.close();
    }

建立文档document

 @Test
    public void testAddDocument() throws Exception{
        //创建一个Client对象
        //创建一个文档对象
        XContentBuilder builder=XContentFactory.jsonBuilder()
                .startObject()
                   .field("id",1L)
                   .field("title","春天要来了")
                   .field("content","一切好像刚睡醒的样子")
                .endObject();
        //使用client把文档对象添加到索引库 设置索引名称   设置type    设置id   如果不设置id 会自动生成一个
         // 建立文档对象
    /**
         * 参数一blog1:表示索引对象
         * 参数二article:类型
         * 参数三1:建立id
         */
        client.prepareIndex("index_hello","article","1")
                //设置文档信息        执行操作
                .setSource(builder).get();
        //关闭客户端
        client.close();

        }

建立文档(使用Jackson转换实体)
实体类

   private Long id;
    private String title;
    private String Content;

   @Test
    public void testAddDocument2() throws Exception{
        //创建一个Article 实体类对象
        Article article=new Article();
        //设置对象的属性
       article.setId(2L);
       article.setTitle("大国工匠");
       article.setContent("我们要大力弘扬与传承工匠精神");
       //把Article对象转换成json格式的字符串
       ObjectMapper objectMapper=new ObjectMapper();
       String jsonDocument = objectMapper.writeValueAsString(article);
       System.out.println(jsonDocument);
       //使用Client对象把文档写入索引库
       client.prepareIndex("index_hello","article","3")
               .setSource(jsonDocument, XContentType.JSON)
       .get();
       //关闭客户端
     client.close();
   }

添加json转换器坐标

<dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.6</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.9.0</version>
        </dependency>

查询文档操作

抽取配置代码

    @Before
    public void init() throws Exception{
        Settings settings= Settings.builder()
                .put("Cluster.name","my-elasticsearch")
                .build();
        //创建一个TransPortClient对象
        TransportClient client=new PreBuiltTransportClient(settings)
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9301))
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9302))
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9303));
    }
   private TransportClient client;
    private String field;

    /**
     *抽取查询方法
     * @param queryBuilder
     * @throws Exception
     */
    private void search(QueryBuilder queryBuilder) throws Exception{
        //执行查询
        SearchResponse searchResponse = client.prepareSearch("index_hello")
                //设置查询的type
                .setTypes("article")
                .setQuery(queryBuilder)
                //设置分页信息
                //起始行号
                .setFrom(0)
                //每页显示行数
                .setSize(5)
                .get();
        //取查询结果
        SearchHits hits = searchResponse.getHits();
        //取查询结果的总记录条数
        System.out.println("查询结果的总记录数"+hits.totalHits);
        //查询结果列表
        Iterator<SearchHit> iterator = hits.iterator();
        //迭代结果集
        while (iterator.hasNext()){
            SearchHit searchHit = iterator.next();
            //打印文档对象 以json格式输出
            System.out.println(searchHit.getSourceAsString());
            //也可以取文档的属性
            System.out.println("--文档的属性--");
            Map<String, Object> document = searchHit.getSource();
            System.out.println(document.get("id"));
            System.out.println(document.get("title"));
            System.out.println(document.get("content"));
        }

        //关闭Clien
        client.close();
    }
    @Test
    /**
     * 跟据id查询
     */
    public void TestSearchById() throws Exception{
         //创建一个client对象

        //创建一个查询对象
        QueryBuilder queryBuilder=QueryBuilders.idsQuery().addIds("1","2");
        search(queryBuilder);
    }
    @Test
    /**
     * 跟据关键词查询
     */
    public void testQueryByTerm() throws Exception{
   //创建一个QueryBuilder            参数一 要搜索的字段    参数二  要搜索的关键词
        QueryBuilder queryBuilder=QueryBuilders.termQuery("content","工匠");
        //调用search方法传递queryBuilder参数
        search(queryBuilder);
    }

    @Test
    /**
     *分析查询
     */
    public void testQueryStringQuery() throws Exception{
       //创建一个QueryBuilder对象
        QueryBuilder queryBuilder=QueryBuilders.queryStringQuery("工匠精神")
                //设置默认搜索域  不指定的话会在所有域上查询
                .defaultField("title");
        //执行查询
        search(queryBuilder);
    }

分页显示

 /**
     *抽取查询方法
     * @param queryBuilder
     * @throws Exception
     */
    private void search(QueryBuilder queryBuilder) throws Exception{
        //执行查询
        SearchResponse searchResponse = client.prepareSearch("index_hello")
                //设置查询的type
                .setTypes("article")
                .setQuery(queryBuilder)
                //设置分页信息
                //起始行号
                .setFrom(0)
                //每页显示行数
                .setSize(5)
                .get();
        //取查询结果
        SearchHits hits = searchResponse.getHits();
        //取查询结果的总记录条数
        System.out.println("查询结果的总记录数"+hits.totalHits);
        //查询结果列表
        Iterator<SearchHit> iterator = hits.iterator();
        //迭代结果集
        while (iterator.hasNext()){
            SearchHit searchHit = iterator.next();
            //打印文档对象 以json格式输出
            System.out.println(searchHit.getSourceAsString());
            //也可以取文档的属性
            System.out.println("--文档的属性--");
            Map<String, Object> document = searchHit.getSource();
            System.out.println(document.get("id"));
            System.out.println(document.get("title"));
            System.out.println(document.get("content"));
        }

        //关闭Clien
        client.close();
    }
    @Test
    /**
     * 查询分页显示设置
     * 需要在Client执行查询之前设置
     *  //执行查询
     *         SearchResponse searchResponse = client.prepareSearch("index_hello")
     *                 //设置查询的type
     *                 .setTypes("article")
     *                 .setQuery(queryBuilder)
     *                 //设置分页信息
     *                 //起始行号
     *                 .setFrom(0)
     *                 //每页显示行数
     *                 .setSize(5)
     *                 //执行操作
     *                 .get();
     * 分页需要设置两个值 一个from 一个size
     * from: 起始行号 ,从0开始
     * size: 每一页显示的记录数
     */
    public void testQueryStringQuery2() throws Exception{
       QueryBuilder queryBuilder=QueryBuilders.queryStringQuery("大国工匠")
               .defaultField("title");
       //执行查询
        //在查询执行之前设置分页信息
       search(queryBuilder);
    }

查询结果高亮

什么是高亮显示

在进行关键字搜索时,搜索出的内容中的关键字会显示不同的颜色,称之为高亮。

ElasticSearch可以对查询出的内容中关键字部分进行标签和样式的设置,但是你需要告诉ElasticSearch使用什么标签对高亮关键字进行包裹

代码

    private void search(QueryBuilder queryBuilder,String highlightField) throws Exception{
        HighlightBuilder highlightBuilder=new HighlightBuilder();
        //设置高亮显示的字段
        highlightBuilder.field(highlightField);
        //设置前缀
        highlightBuilder.preTags("<em>");
        //设置后缀
        highlightBuilder.postTags("</em>");
        //执行查询
        SearchResponse searchResponse = client.prepareSearch("index_hello")
                //设置查询的type
                .setTypes("article")
                .setQuery(queryBuilder)
                //设置分页信息
                //起始行号
                .setFrom(0)
                //每页显示行数
                .setSize(5)
                //设置高亮信息
                .highlighter(highlightBuilder)
                .get();
        //取查询结果
        SearchHits hits = searchResponse.getHits();
        //取查询结果的总记录条数
        System.out.println("查询结果的总记录数"+hits.totalHits);
        //查询结果列表
        Iterator<SearchHit> iterator = hits.iterator();
        //迭代结果集
        while (iterator.hasNext()){
            SearchHit searchHit = iterator.next();
            //打印文档对象 以json格式输出
            System.out.println(searchHit.getSourceAsString());
            //也可以取文档的属性
            System.out.println("--文档的属性--");
            Map<String, Object> document = searchHit.getSource();
            System.out.println(document.get("id"));
            System.out.println(document.get("title"));
            System.out.println(document.get("content"));
            //取高亮结果
            System.out.println("——————————————————高亮结果————————————————");
            Map<String, HighlightField> highlightFields = searchHit.highlightFields();
            System.out.println(highlightFields);
            //取title高亮显示的结果
            HighlightField field = highlightFields.get(highlightField);
            Text[] fragments = field.getFragments();
            if (fragments!=null){
                String title = fragments[0].toString();
                System.out.println(title);
            }
        }

        //关闭client
        client.close();
    }
    @Test
    /**
     * 测试高亮查询
     */
    public void testQueryStringQuery3() throws Exception{
        QueryBuilder queryBuilder=QueryBuilders.queryStringQuery("大国工匠")
                .defaultField("title");

        search(queryBuilder,"title");
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值