zoukankan      html  css  js  c++  java
  • elasticsearch与springboot整合 查询

    在业务开发中,我们只要定义好我们的数据结构,然后入库。即可完成。

    这里使用了ik分词器,类型定义为ik_max_word的都是会自动分词的。

    重点是在查询,我们查询数据库的sql语句可以写的很复杂,在es这里,也可以写的很复杂,但是有没有那个必要就是另一回事了。

    多条件查询:复杂查询

    条件 boolQueryBuilder.must 类似于 sql中的and

    如果是不等就是用boolQueryBuilder.mustNot 排除条件。

    多个条件包含,查询索引外层属性,索引对象属性参数,年龄区间,数组内属性 只要符合条件的,会返回整条索引的数据。

    NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
    定义好查询对象queryBuilder ,再加上查询条件、分页条件、排序
    /**
         * @desc 复合查询
         * @date 2020年5月9日 下午3:05:17
         */
        @Test
        public void boolQueryBuilderTest() {
            NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
            BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
            
            {
                // 条件1 查询当前对象外层title--
                TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("title", "陈说美食 - 知乎");
                boolQueryBuilder.must(termQueryBuilder);
            }
            {
                // 条件2 查询当前对象外层用户对象中的姓名
                TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("user.name", "李有才");
                boolQueryBuilder.must(termQueryBuilder);
            }
            {
                // 条件3 相片数组对象属性名称
                TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("photos.title", "相片01");
                NestedQueryBuilder nestedQueryBuilder = QueryBuilders.nestedQuery("photos", termQueryBuilder, ScoreMode.None);
                boolQueryBuilder.must(nestedQueryBuilder);
            }
            // 条件4        
            {
                // 条件4 年龄在30到40之间---区间查询
                RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("user.age").from(30).to(40);
                boolQueryBuilder.must(rangeQueryBuilder);
    //            boolQueryBuilder.mustNot() // 排除
            }
            queryBuilder.withQuery(boolQueryBuilder);
            Page<HouseVo> page = repository.search(queryBuilder.build());
            System.out.println(JSON.toJSON(page));
        }

    上面这段代码产生的kql就是如下语句:

    POST house_vo/_search
    {
      "query": {
        "bool": {
          "must": [
            {
              "term": {
                "title": {
                  "value": "陈说美食 - 知乎",
                  "boost": 1
                }
              }
            },
            {
              "term": {
                "user.name": {
                  "value": "李有才",
                  "boost": 1
                }
              }
            },
            {
              "nested": {
                "query": {
                  "term": {
                    "photos.title": {
                      "value": "相片01",
                      "boost": 1
                    }
                  }
                },
                "path": "photos",
                "ignore_unmapped": false,
                "score_mode": "none",
                "boost": 1
              }
            },
            {
              "range": {
                "user.age": {
                  "from": 30,
                  "to": 40,
                  "include_lower": true,
                  "include_upper": true,
                  "boost": 1
                }
              }
            }
          ],
          "adjust_pure_negative": true,
          "boost": 1
        }
      }
    }

    分页:

    // 加载分页信息
    Pageable pageable = PageRequest.of(pageNo, pageSize);
     queryBuilder.withPageable(pageable);

    这里产生语句

    排序:

    // 价格倒序、年龄升序
            SortBuilder<?> sortBuilder1 = SortBuilders.fieldSort("price").order( SortOrder.DESC);
            queryBuilder.withSort(sortBuilder1);
            SortBuilder<?> sortBuilder2 = SortBuilders.fieldSort("user.birthday").order( SortOrder.ASC);
            queryBuilder.withSort(sortBuilder2);
    [{
      "price" : {
        "order" : "desc"
      }
    }, {
      "user.birthday" : {
        "order" : "asc"
      }
    }]
  • 相关阅读:
    Redis详解(三)- redis的六大数据类型详细用法
    Redis详解(二)- redis的配置文件介绍
    《OR Talk NO.11 | 清能互联赖晓文:电力系统中的运筹优化应用》
    《OR Talk NO.10 | 浙江大学徐金明:分布式优化算法何时能在性能上与集中式算法相媲美?》
    《OR Talk NO.9 | 深圳大学龚元浩:比几何流快一万倍的曲率滤波算法》
    《OR Talk NO.4 | Attain.ai 创始人李玉喜:强化学习遇见组合优化》
    《OR Talk NO.3 | 滴滴 AI Labs 秦志伟:深度强化学习在网约che交易市场中的应用》
    《OR Talk NO.2 | 胡武华博士:运筹优化理论在物流行业中的应用实践》
    《KDD 2018 | Conventional Tutorials》
    《OR Talk NO.13 | MIT 博士与你分享电商供应链算法实战心得》
  • 原文地址:https://www.cnblogs.com/a393060727/p/12857835.html
Copyright © 2011-2022 走看看