kibana、java、springBoot操作elasticsearch

kibana窗口操作elasticsearch

1、分页查询  where limit offset,count
GET /es2/book/_search
{
  "from": 0,
  "size": 2
}
2、排序   order by price (desc|asc) , xxx desc
GET /es2/book/_search
{
  "sort": [{
      "price": {
        "order": "desc"
      }
  }]
}
3、查询指定字段 select name,price from 
GET /es2/book/_search
{
  "_source": ["name","price"]
}

4、关键字查询  (重要) term查询 where 列名=值
GET /es2/book/_search
{
  "query": {
    "term": {
      "name": {
        "value": "零"
      }
    }
  }
}


5、范围查询  where price >20 and price < 100
GET /es2/book/_search
{
  "query": {
    "range": {
      "price": {
        "gt": 50,
        "lte": 150
      }
    }
  }
}

6、多ID查询  where id in(1,2)
GET /es2/book/_search
{
  "query": {
    "ids": {
      "values": ["4","5"]
    }
  }
}
7、bool查询  must(and)  should(or) 
GET /es2/book/_search
{
  "query": {
     "bool": {
       "must": [
         {
           "term": {
             "name": {
               "value": "三"
             }
           }
         },{
           "range": {
             "price": {
               "gte": 100,
               "lte": 200
             }
           }
         }
       ]
     }
  }
}

8、多字段查询
GET /es2/book/_search
{
  "query": {
    "multi_match": {
      "query": "三",
      "fields": ["name","author"]
    }
  }
}
9、高亮查询
关键字变成红色
GET /es2/book/_search
{
  "query": {
    "term": {
      "name": {
        "value": "三"
      }
    }
  },
  "highlight": {
    "fields": {
      "name": {}
    }
  }
}

java操作elasticsearch

工具类代码

public class ESUtils {

public static TransportClient getClient(){
    try {
        TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY)
                .addTransportAddress(new TransportAddress(InetAddress.getByName("192.168.10.137"), 9300));
        return transportClient;
    }catch (Exception e){
        e.printStackTrace();
    }
    return null;
}

}

java代码


public void testInsert()throws Exception{
        //1.获取连接
        TransportClient client = ESUtils.getClient();

  //{"name":"xx","author":"xx","price":""}
     //2.准备数据
     XContentBuilder builder = XContentFactory.jsonBuilder().startObject()
             .field("name", "金瓶梅").field("author", "兰陵晓晓声")
             .field("price", 250).endObject();

   //3.执行添加操作
    IndexResponse response = client.prepareIndex("es2", "book","10")
            .setSource(builder).get();

  //4.打印响应结果
   System.out.println("结果:"+response.status());
 }


public void testDelete()throws Exception{
        //1.获取连接
        TransportClient client = ESUtils.getClient();

   //2.执行删除操作
    DeleteResponse response = client.prepareDelete("es2", "book", "10").get();

   //3.打印响应结果
   System.out.println("结果:"+response.status());
   }


public void testUpdate()throws Exception{
        //1.获取连接
        TransportClient client = ESUtils.getClient();

   //{"name":"xx","author":"xx","price":""}
    //2.准备数据
    XContentBuilder builder = XContentFactory.jsonBuilder().startObject()
            .field("price", 300).endObject();

   //3.执行修改操作
   UpdateResponse response = client.prepareUpdate("es2", "book", "10")
           .setDoc(builder).get();

   //4.打印响应结果
   System.out.println("结果:"+response.status());
}


 1.1查全部
public void testQuery(){
        //1.获取连接
        TransportClient client = ESUtils.getClient();

  //2.提供query查询策略
   MatchAllQueryBuilder builder = QueryBuilders.matchAllQuery();  //查询所有

   //3.执行查询操作
   SearchResponse response = client.prepareSearch("es2").setTypes("book")
           .setQuery(builder).get();

   //4.获取总条数
   System.out.println("总条数: "+response.getHits().totalHits);   //分页依然获取总条数

   //5.获取每一个文档数据
   SearchHits hits = response.getHits();  //SearchHits 集合
   for(SearchHit h:hits){                 //SearchHit 集合中遍历获取的对象
       //getSourceAsMap() 获取文档转换成一个map
       Map<String, Object> map = h.getSourceAsMap();
       System.out.println(map);
   }
}
1.2条件查询
public void testTermQuery(){
        //1.获取连接
        TransportClient client = ESUtils.getClient();

  //2.提供query查询策略
   TermQueryBuilder builder = QueryBuilders.termQuery("name", "西游");

   //3.执行查询操作
   SearchResponse response = client.prepareSearch("es2").setTypes("book")
           .setQuery(builder).setFrom(0).setSize(2).get();

   //4.获取总条数
   System.out.println("总条数: "+response.getHits().totalHits);   //分页依然获取总条数

   //5.获取每一个文档数据
   SearchHits hits = response.getHits();  //SearchHits 集合
   for(SearchHit h:hits){                 //SearchHit 集合中遍历获取的对象
       //getSourceAsMap() 获取文档转换成一个map
       Map<String, Object> map = h.getSourceAsMap();
       System.out.println(map);
   }
}
1.3高亮查询
public Map selectHighLight(int page, int limit,String content){
        System.out.println("content = " + content);
        Map map = new HashMap();
        AbstractQueryBuilder builder = null;
        //获取链接
        TransportClient client = ESUtils.getClient();
        //查询全部
        if(content != null && !"".equals(content)){
            //条件查询
            builder = QueryBuilders.termQuery("content", content);
        }else {
            //查询全部
            builder = QueryBuilders.matchAllQuery();
        }
        //高亮查询
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        highlightBuilder.field("content");
        //执行查询
        SearchResponse response = client.prepareSearch("es3").setTypes("poetry").setFrom((page - 1) * limit)
                .setSize(limit).setQuery(builder).highlighter(highlightBuilder).get();
        //获取数据
        SearchHits hits = response.getHits();
        List<Map<String,Object>> list = new ArrayList<>();
        for(SearchHit hit : hits){
            String id = hit.getId();
            Map<String, Object> sourceAsMap = hit.getSourceAsMap();
            sourceAsMap.put("id",id);
            Map<String, HighlightField> highlightFields = hit.getHighlightFields();
            HighlightField c = highlightFields.get("content");
            System.out.println("c = " + c);
            if(c!=null){
                String s = c.fragments()[0].toString();
                sourceAsMap.put("content",s);
                System.out.println("sourceAsMap = " + sourceAsMap);
            }
            list.add(sourceAsMap);
        }
        map.put("code",0);
        map.put("msg","");
        map.put("count",hits.getTotalHits());
        map.put("data",list);
        return map;
    }

springBoot操作elasticsearch

添加依赖

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
 </dependency>
普通查询和自定义查询

建一个repository包新建一个接口

package com.baizhi.repository;

import com.baizhi.entity.Book;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

import java.util.List;

public interface BookRepository extends ElasticsearchRepository<Book,Long> {

  //条件查询 and  根据姓名和价格查询
   public List<Book> findByNameAndPrice(String name,Double price);

   public List<Book> findByPriceBetween(Double s1,Double s2);
}

@Autowired
    private BookRepository bookRepository;

   @Test
   public void test1(){
       Book book = new Book();
       book.setId(1L);
       book.setName("三国演义");
       book.setAuthor("罗贯中");
       book.setPrice(200.0);
       bookRepository.save(book);  //添加修改
   }

   @Test
   public void test2(){
       Book book = new Book();
       book.setId(1L);
       bookRepository.delete(book);  //删除
   }

   @Test
   public void test3(){
       Optional<Book> optional = bookRepository.findById(1L); //根据id查询
       Book book = optional.get();
       System.out.println(book);
   }

   @Test
   public void test4(){
       Iterable<Book> list = bookRepository.findAll();
       for (Book book : list) {
           System.out.println(book);
       }
   }

   @Test
   public void test5(){
       List<Book> list = bookRepository.findByNameAndPrice("西游", 100.0);//根据name和price查询
       System.out.println(list);
   }

   @Test
   public void test6(){
       List<Book> list = bookRepository.findByPriceBetween(100.0,150.0);
       System.out.println(list);
   }

可自己定义方法进行查询
自定义复杂查询(高亮查询)

在repository包下写一个接口

package com.baizhi.repository;

import com.baizhi.entity.Book;

import java.util.List;

public interface CustomBookRepository {

  //分页、条件、高亮
   public List<Book> select(int page,int limit,String c);

}

在repository包下建一个impl包创建一个实现类

package com.baizhi.repository.impl;

import com.baizhi.entity.Book;
import com.baizhi.repository.CustomBookRepository;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.TermQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.SearchResultMapper;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.aggregation.impl.AggregatedPageImpl;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Repository;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@Repository //作用:将当前类对象交给spring工厂创建对象
public class CustomBookRepositoryImpl implements CustomBookRepository {

   //elasticsearchTemplate springboot-data-elasticsearch依赖中的一个工具类
   //当依赖提供的方法 extends ElasticsearchRepository 和自定义简单查询方法无法满足需求时,可以使用工具类的操作
   @Autowired
   private ElasticsearchTemplate  elasticsearchTemplate;

   @Override
   public List<Book> select(int page, int limit, String c) {
       //查询策略
       TermQueryBuilder builder = QueryBuilders.termQuery("name", c);
       //高亮
       HighlightBuilder.Field builder1 = new HighlightBuilder.Field("*");


   //综合查询方案
     NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
             .withQuery(builder)
             .withHighlightFields(builder1)
             .withPageable(PageRequest.of(page - 1, limit)) //page的0代表第一页
             .build();

System.out.println(searchQuery);

//queryForPage方法被执行后,自动调用SearchResultMapper接口对象中mapResults方法
//我们在该方法中进一步封装查询结果
AggregatedPage<Book> books = elasticsearchTemplate.queryForPage(searchQuery,
                                                      Book.class,
                                                      new SearchResultMapper() {
@Override
public <T> AggregatedPage<T> mapResults(SearchResponse searchResponse,
                                  Class<T> aClass,
                                  Pageable pageable) {

SearchHits hits = searchResponse.getHits();
List<Book> list = new ArrayList<>();
for (SearchHit hit : hits) {
  Book book = new Book();
  //获取未高亮的查询文档
  Map<String, Object> sourceAsMap = hit.getSourceAsMap();
  //获取高亮的查询文档
  Map<String, HighlightField> highlightFields = hit.getHighlightFields();

  HighlightField name = highlightFields.get("name");
  if (name != null) {
      String s = name.fragments()[0].toString();
      sourceAsMap.put("name", s);
  }
  //从map中获取数据,存储到实体类对象中的对应属性中
  book.setId(Long.parseLong(sourceAsMap.get("id").toString()));
  book.setName(sourceAsMap.get("name").toString());
  book.setAuthor(sourceAsMap.get("author").toString());
  book.setPrice(Double.parseDouble(sourceAsMap.get("price").toString()));
  //将对象添加到list集合中
  list.add(book);
}
return new AggregatedPageImpl<T>((List<T>) list);
}
});

return books.getContent();  //getContent() 获取我们传递给它的list对象
 }
}

然后使用高亮查询调用这个方法就行

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值