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"
  }
}]

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM