在業務開發中,我們只要定義好我們的數據結構,然后入庫。即可完成。
這里使用了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" } }]