1. // 如果不通过脚本操作,可以先创建索引库
  2. elasticsearchTemplate.createIndex(Goods.class);
  3. // 如果不通过脚本操作,指定映射
  4. elasticsearchTemplate.putMapping(Goods.class);
  5. //批量添加数据
  6. elasticsearchTemplate.bulkIndex(queries);

matchAll查询

  1. #应用场景:当查询列表的页面初始化时,没有任何查询条件
  2. 脚本查询
  3. #GET 索引库名称/_search,默认展示10条数据
  4. GET goods/_search
  5. {
  6. "query": {
  7. "match_all": {}
  8. }
  9. }
  10. #GET 索引库名称/_search
  11. GET goods/_doc/_search
  12. {
  13. "query": {
  14. "match_all": {}
  15. },
  16. "from": 0,#从哪一条开始
  17. "size": 100#显示多少条
  18. }

代码实现

  1. /*
  2. * 匹配全部查询
  3. * */
  4. @Test
  5. public void matchAllTest(){
  6. //构建查询条件
  7. //使用的是matchAll查询条件: QueryBuilders.matchAllQuery()
  8. SearchQuery query = new NativeSearchQuery(QueryBuilders.matchAllQuery());
  9. /**
  10. * 分页条件: setPageable,需要的参数-Pageable,
  11. *Pageable打开有四个实现方法——AbstractPageRequest,PageRequest,QPageRequest,Unpaged.
  12. *前三个方法都需要两个参数 - int page,int size ;
  13. *当我们要进行分页查询时, 调用setPageable方法时,需要准备int page,int size参数即可.
  14. */
  15. PageRequest pageRequest = PageRequest.of(0, 20);
  16. query.setPageable(pageRequest);
  17. //执行查询,获取运行结果
  18. List<Goods> goods = elasticsearchTemplate.queryForList(query, Goods.class);
  19. for (Goods good : goods) {
  20. System.out.println(good);
  21. }
  22. }

image.png
image.png
image.png

term查询

  1. #应用场景:不想对搜索关键字进行分词,搜索的结果更加精确。
  2. GET goods/_search
  3. {
  4. "query": {
  5. "term": {
  6. "title": {
  7. "value": "老人手机"
  8. }
  9. }
  10. }
  11. }

代码实现

  1. /*
  2. * term查询
  3. * */
  4. @Test
  5. public void termTest(){
  6. //构造查询条件
  7. NativeSearchQuery query = new NativeSearchQuery(QueryBuilders.termQuery("title", "老人手机"));
  8. query.setPageable(PageRequest.of(0,20));
  9. //执行查询
  10. List<Goods> goods = elasticsearchTemplate.queryForList(query, Goods.class);
  11. for (Goods good : goods) {
  12. System.out.println(good);
  13. }
  14. /**
  15. *执行搜索可以发现结果为空,为何?
  16. * term搜索是将**搜索关键字的整个内容作为
  17. * 词条去倒排索引中进行词条的等值匹配**。
  18. * 如果倒排索引中并没有分出"老人手机"这个词,
  19. * 就搜索不到。我们可以通过ES提供的接口看看某字符串按某分词器分出的效果:
  20. * */
  21. }

image.png

match查询

image.png

  1. #脚本查询
  2. GET goods/_search
  3. {
  4. "query": {
  5. "match": {
  6. "title": "老人手机"
  7. }
  8. }
  9. }

image.png
image.png
代码查询

  1. /*
  2. * match查询
  3. * */
  4. @Test
  5. public void matchTest() {
  6. //构造查询条件
  7. NativeSearchQuery query = new NativeSearchQuery(QueryBuilders.matchQuery("title", "老人手机").operator(Operator.AND));
  8. query.setPageable(PageRequest.of(0, 20));
  9. //执行查询
  10. List<Goods> goods = elasticsearchTemplate.queryForList(query, Goods.class);
  11. for (Goods good : goods) {
  12. System.out.println(good);
  13. }
  14. }

image.png

模糊查询

image.png
image.png
image.png

  1. # 模糊匹配索引库中以华开头的词条,注意不要在华前面使用通配符,否则就和mysql数据库一样,索引失效了
  2. GET goods/_search
  3. {
  4. "query": {
  5. "wildcard": {
  6. "title": {
  7. "value": "华*"
  8. }
  9. }
  10. }
  11. }

代码实现

  1. /*
  2. * wildcard查询
  3. * */
  4. @Test
  5. public void wildcardTest(){
  6. //构建查询条件
  7. NativeSearchQuery query = new NativeSearchQuery(QueryBuilders.wildcardQuery("title", "华*"));
  8. query.setPageable(PageRequest.of(0,20));
  9. //执行查询
  10. AggregatedPage<Goods> goods =elasticsearchTemplate.queryForPage(query, Goods.class);
  11. //获取总页数
  12. int totalPages = goods.getTotalPages();
  13. System.out.println(totalPages);
  14. //当前页
  15. int number = goods.getNumber()+1;
  16. System.out.println(number);
  17. //每页显示数
  18. int numberOfElements = goods.getNumberOfElements();
  19. System.out.println(numberOfElements);
  20. //总条数
  21. long totalElements = goods.getTotalElements();
  22. System.out.println(totalElements);
  23. //文档数据
  24. List<Goods> content = goods.getContent();
  25. for (Goods goods1 : content) {
  26. System.out.println(goods1);
  27. }
  28. }

image.png

范围查询及排序

image.png

  1. # 价格大于等于2000,小于等于3000
  2. # gte: >= lte:<= gt:> lt:<
  3. GET goods/_search
  4. {
  5. "query": {
  6. "range": {
  7. "price": {
  8. "gte": 2000,
  9. "lte": 3000
  10. }
  11. }
  12. }
  13. }
  14. #排序
  15. GET goods/_search
  16. {
  17. "query": {
  18. "range": {
  19. "price": {
  20. "gte": 2000,
  21. "lte": 3000
  22. }
  23. }
  24. },
  25. "sort": [
  26. {
  27. "price": {
  28. "order": "desc"
  29. }
  30. }
  31. ]
  32. }

代码实现

  1. /*
  2. * range查询
  3. * */
  4. @Test
  5. public void rangeTest(){
  6. //构造查询条件
  7. NativeSearchQuery query = new NativeSearchQuery(QueryBuilders.rangeQuery("price").gte(2000).lte(3000));
  8. //设置分页字段
  9. query.setPageable(PageRequest.of(0,20));
  10. //设置排序字段
  11. query.addSort(new Sort(Sort.Direction.DESC,"price"));
  12. //执行查询
  13. AggregatedPage<Goods> goods = elasticsearchTemplate.queryForPage(query, Goods.class);
  14. //总页数
  15. System.out.println(goods.getTotalPages());
  16. //当前页
  17. System.out.println(goods.getNumber()+1);
  18. //每页显示数
  19. System.out.println(goods.getNumberOfElements());
  20. //总条数
  21. System.out.println(goods.getTotalElements());
  22. //文档数据
  23. List<Goods> content = goods.getContent();
  24. for (Goods goods1 : content) {
  25. System.out.println(goods1);
  26. }
  27. }

image.png

字符串查询

image.png

#不指定字段: 全文搜索
GET goods/_search
{
  "query": {
    "query_string": {
      "query": "华为手机"
    }
  }
}

#指定字段
GET goods/_search
{
    "query": {
      "query_string": {
        "fields": ["title","brand"],
        "query": "华为手机"
    }
  }
}

代码实现

  /*
    *字符串查询
    * */
    @Test
    public void stringTest(){
        //构造查询条件
        NativeSearchQuery query = new NativeSearchQuery(QueryBuilders.queryStringQuery("华为手机").field("title").field("brand"));
        //设置分页
        query.setPageable(PageRequest.of(0,20));
        //设置排序
        query.addSort(new Sort(Sort.Direction.DESC,"price"));
        // 执行查询,获取查询结果
        AggregatedPage<Goods> page = elasticsearchTemplate.queryForPage(query, Goods.class);

        // 总页数
        System.out.println("总页数 = " + page.getTotalPages());

        // 当前页
        System.out.println("当前页 = " + (page.getNumber() + 1));

        // 每页显示数
        System.out.println("每页显示数 = " + page.getNumberOfElements());

        // 总条数
        System.out.println("总条数 = " + page.getTotalElements());

        // 文档数据
        List<Goods> goodsList = page.getContent();

        for (Goods goods : goodsList) {
            System.out.println(goods);
        }
    }

image.png

布尔查询

image.png
语法

must(and):条件必须成立
must_not(not): 条件必须不成立 ,必须和must或filter连接起来使用
should(or):条件可以成立
filter: 条件必须成立,性能比must高(不会计算得分)
#查询品牌为华为,并且title包含手机的手机
GET goods/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "term": {
            "brand": {
              "value": "华为"
            }
          }
        },
        {
          "match": {
            "title": "手机"
          }
        }
      ]
    }
  }

}
//构建查询条件