国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

架構(gòu)師系列-搜索引擎ElasticSearch(四)- 高級查詢

這篇具有很好參考價(jià)值的文章主要介紹了架構(gòu)師系列-搜索引擎ElasticSearch(四)- 高級查詢。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

ES查詢

matchAll

腳本方式

該方式可以通過kabana、curl、elasticsearch-head(純前端)去操作

# 默認(rèn)情況下,es一次展示10條數(shù)據(jù),通過from和size來控制分頁
# 查詢結(jié)果詳解
GET goods/_search
{
    "query": {
        "match_all": {}
    },
    "from": 0,
    "size": 100
}

# 默認(rèn)為10條
GET goods

Java API方式

/**
     * 查詢所有
     *  1. matchAll
     *  2. 將查詢結(jié)果封裝為Goods對象,裝載到List中
     *  3. 分頁。默認(rèn)顯示10條
     */
    @Test
    public void testMatchAll() throws IOException {
        //2. 構(gòu)建查詢請求對象,指定查詢的索引名稱
        SearchRequest searchRequest = new SearchRequest("goods");
        //4. 創(chuàng)建查詢條件構(gòu)建器SearchSourceBuilder
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

        //6. 查詢條件
        QueryBuilder query = QueryBuilders.matchAllQuery();//查詢所有文檔
        //5. 指定查詢條件
        sourceBuilder.query(query);

        //3. 添加查詢條件構(gòu)建器 SearchSourceBuilder
        searchRequest.source(sourceBuilder);

        // 8 . 添加分頁信息
        sourceBuilder.from(0);
        sourceBuilder.size(100);

        //1. 查詢,獲取查詢結(jié)果
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

        //7. 獲取命中對象 SearchHits
        SearchHits searchHits = searchResponse.getHits();
        //7.1 獲取總記錄數(shù)
        long value = searchHits.getTotalHits().value;
        System.out.println("總記錄數(shù):"+value);


        List<Goods> goodsList = new ArrayList<>();
        //7.2 獲取Hits數(shù)據(jù)  數(shù)組
        SearchHit[] hits = searchHits.getHits();
        for (SearchHit hit : hits) {
            //獲取json字符串格式的數(shù)據(jù)
            String sourceAsString = hit.getSourceAsString();
            //轉(zhuǎn)為java對象
            Goods goods = JSON.parseObject(sourceAsString, Goods.class);

            goodsList.add(goods);

        }


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

termQuery

term查詢和字段類型有關(guān)系,首先回顧一下ElasticSearch兩個(gè)數(shù)據(jù)類型
ElasticSearch兩個(gè)數(shù)據(jù)類型
1、text:會分詞,不支持聚合
2、keyword:不會分詞,將全部內(nèi)容作為一個(gè)詞條,支持聚合

腳本方式

term查詢:不會對查詢條件進(jìn)行分詞。

GET goods/_search
{
    "query": {
        "term": {
            "title": {
                "value": "華為"
            }
        }
    }
}

term查詢,查詢text類型字段時(shí),只有其中的單詞相匹配都會查到,text字段會對數(shù)據(jù)進(jìn)行分詞
例如:查詢title 為“華為”的,title type 為text

"title": {
    "type": "text",
    "analyzer": "ik_smart"
}

架構(gòu)師系列-搜索引擎ElasticSearch(四)- 高級查詢,架構(gòu)師系列,搜索引擎,elasticsearch,大數(shù)據(jù)

查詢categoryName 字段時(shí),categoryName字段為keyword ,keyword:不會分詞,將全部內(nèi)容作為一個(gè)詞條,即完全匹配,才能查詢出結(jié)果.

GET goods/_search
{
    "query": {
        "term": {
            "categoryName": {
                "value": "華為手機(jī)"
            }
        }
    }
}

架構(gòu)師系列-搜索引擎ElasticSearch(四)- 高級查詢,架構(gòu)師系列,搜索引擎,elasticsearch,大數(shù)據(jù)

Java API

/**
     * termQuery:詞條查詢
     */
    @Test
    public void testTermQuery() throws IOException {
        SearchRequest searchRequest = new SearchRequest("goods");
        SearchSourceBuilder sourceBulider = new SearchSourceBuilder();
        QueryBuilder query = QueryBuilders.termQuery("title","華為");//term詞條查詢
        sourceBulider.query(query);
        searchRequest.source(sourceBulider);

        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
        SearchHits searchHits = searchResponse.getHits();
        //獲取記錄數(shù)
        long value = searchHits.getTotalHits().value;
        System.out.println("總記錄數(shù):"+value);
        List<Goods> goodsList = new ArrayList<>();
        SearchHit[] hits = searchHits.getHits();
        for (SearchHit hit : hits) {
            String sourceAsString = hit.getSourceAsString();
            //轉(zhuǎn)為java
            Goods goods = JSON.parseObject(sourceAsString, Goods.class);
            goodsList.add(goods);
        }
        for (Goods goods : goodsList) {
            System.out.println(goods);
        }
    }

matchQuery

match查詢:
?會對查詢條件進(jìn)行分詞。
?然后將分詞后的查詢條件和詞條進(jìn)行等值匹配
?默認(rèn)取并集(OR)
?

# match查詢
GET goods/_search
{
    "query": {
        "match": {
            "title": "華為手機(jī)"
        }
    },
    "size": 500
}

match 的默認(rèn)搜索(or 并集)
例如:華為手機(jī),會分詞為 “華為”,“手機(jī)” 只要出現(xiàn)其中一個(gè)詞條都會搜索到
match的 and(交集) 搜索
例如:例如:華為手機(jī),會分詞為 “華為”,“手機(jī)” 但要求“華為”,和“手機(jī)”同時(shí)出現(xiàn)在詞條中
?

總結(jié):
term query會去倒排索引中尋找確切的term,它并不知道分詞器的存在。這種查詢適合keyword
、numeric、date
match query知道分詞器的存在。并且理解是如何被分詞的

?

java api

 /**
     * matchQuery:詞條分詞查詢
     */
    @Test
    public void testMatchQuery() throws IOException {
        SearchRequest searchRequest = new SearchRequest("goods");
        SearchSourceBuilder sourceBulider = new SearchSourceBuilder();
        MatchQueryBuilder query = QueryBuilders.matchQuery("title", "華為手機(jī)");
        query.operator(Operator.AND);//求并集
        sourceBulider.query(query);

        searchRequest.source(sourceBulider);
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
        SearchHits searchHits = searchResponse.getHits();
        //獲取記錄數(shù)
        long value = searchHits.getTotalHits().value;
        System.out.println("總記錄數(shù):"+value);
        List<Goods> goodsList = new ArrayList<>();
        SearchHit[] hits = searchHits.getHits();
        for (SearchHit hit : hits) {
            String sourceAsString = hit.getSourceAsString();
            //轉(zhuǎn)為java
            Goods goods = JSON.parseObject(sourceAsString, Goods.class);
            goodsList.add(goods);
        }
        for (Goods goods : goodsList) {
            System.out.println(goods);
        }
    }

模糊查詢-腳本 ?

wildcard查詢 ?

wildcard查詢:會對查詢條件進(jìn)行分詞。還可以使用通配符 ?(任意單個(gè)字符) 和 * (0個(gè)或多個(gè)字符)


*華*" 包含華字的
"華*" 華字后邊多個(gè)字符
"華?" 華字后邊多個(gè)字符
"*華"或"?華" 會引發(fā)全表(全索引)掃描 注意效率問題

# wildcard 查詢。查詢條件分詞,模糊查詢
GET goods/_search
{
    "query": {
        "wildcard": {
            "title": {
                "value": "華*"
            }
        }
    }
}

正則查詢 ?

\W:匹配包括下劃線的任何單詞字符,等價(jià)于 [A-Z a-z 0-9_] 開頭的反斜杠是轉(zhuǎn)義符
+號多次出現(xiàn)
(.)*為任意字符
正則查詢?nèi)Q于正則表達(dá)式的效率
?

GET goods/_search
{
    "query": {
        "regexp": {
            "title": "\\w+(.)*"
        }    
    }
}

前綴查詢

#前綴查詢 對keyword類型支持比較好
GET goods/_search
{
    "query": {
        "prefix": {
            "brandName": {
                "value": "三"
            }
        }
    }
}

?模糊查詢- Java Api

 /**
     * 模糊查詢:WildcardQuery
     */
    @Test
    public void testWildcardQuery() throws IOException {
        SearchRequest searchRequest = new SearchRequest("goods");
        SearchSourceBuilder sourceBulider = new SearchSourceBuilder();
        WildcardQueryBuilder query = QueryBuilders.wildcardQuery("title", "華*");
        sourceBulider.query(query);
        searchRequest.source(sourceBulider);

        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
        SearchHits searchHits = searchResponse.getHits();
        //獲取記錄數(shù)
        long value = searchHits.getTotalHits().value;
        System.out.println("總記錄數(shù):"+value);
        List<Goods> goodsList = new ArrayList<>();
        SearchHit[] hits = searchHits.getHits();
        for (SearchHit hit : hits) {
            String sourceAsString = hit.getSourceAsString();
            //轉(zhuǎn)為java
            Goods goods = JSON.parseObject(sourceAsString, Goods.class);
            goodsList.add(goods);
        }
        for (Goods goods : goodsList) {
            System.out.println(goods);
        }
    }




    /**
     * 模糊查詢:regexpQuery
     */
    @Test
    public void testRegexpQuery() throws IOException {
        SearchRequest searchRequest = new SearchRequest("goods");
        SearchSourceBuilder sourceBulider = new SearchSourceBuilder();
        RegexpQueryBuilder query = QueryBuilders.regexpQuery("title", "\\w+(.)*");
        sourceBulider.query(query);
        searchRequest.source(sourceBulider);
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
        SearchHits searchHits = searchResponse.getHits();
        //獲取記錄數(shù)
        long value = searchHits.getTotalHits().value;
        System.out.println("總記錄數(shù):"+value);

        List<Goods> goodsList = new ArrayList<>();
        SearchHit[] hits = searchHits.getHits();
        for (SearchHit hit : hits) {
            String sourceAsString = hit.getSourceAsString();
            //轉(zhuǎn)為java
            Goods goods = JSON.parseObject(sourceAsString, Goods.class);
            goodsList.add(goods);
        }
        for (Goods goods : goodsList) {
            System.out.println(goods);
        }
    }



    /**
     * 模糊查詢:perfixQuery
     */
    @Test
    public void testPrefixQuery() throws IOException {
        SearchRequest searchRequest = new SearchRequest("goods");
        SearchSourceBuilder sourceBulider = new SearchSourceBuilder();
        PrefixQueryBuilder query = QueryBuilders.prefixQuery("brandName", "三");
        sourceBulider.query(query);
        searchRequest.source(sourceBulider);
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
        SearchHits searchHits = searchResponse.getHits();
        //獲取記錄數(shù)
        long value = searchHits.getTotalHits().value;
        System.out.println("總記錄數(shù):"+value);
        List<Goods> goodsList = new ArrayList<>();
        SearchHit[] hits = searchHits.getHits();
        for (SearchHit hit : hits) {
            String sourceAsString = hit.getSourceAsString();
            //轉(zhuǎn)為java
            Goods goods = JSON.parseObject(sourceAsString, Goods.class);
            goodsList.add(goods);
        }
        for (Goods goods : goodsList) {
            System.out.println(goods);
        }
    }

范圍和排序

# 范圍查詢
GET goods/_search
{
    "query": {
        "range": {
            "price": {
                "gte": 2000,
                "lte": 3000
            }
        }
    },
    "sort": [
        {
            "price": {
                "order": "desc"
            }
        }
    ]
}
/**
     * 1. 范圍查詢:rangeQuery
     * 2. 排序
     */
    @Test
    public void testRangeQuery() throws IOException {
        SearchRequest searchRequest = new SearchRequest("goods");
        SearchSourceBuilder sourceBulider = new SearchSourceBuilder();
        //范圍查詢
        RangeQueryBuilder query = QueryBuilders.rangeQuery("price");
        //指定下限
        query.gte(2000);
        //指定上限
        query.lte(3000);
        sourceBulider.query(query);
        //排序
        sourceBulider.sort("price", SortOrder.DESC);
        searchRequest.source(sourceBulider);
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
        SearchHits searchHits = searchResponse.getHits();
        //獲取記錄數(shù)
        long value = searchHits.getTotalHits().value;
        System.out.println("總記錄數(shù):"+value);

        List<Goods> goodsList = new ArrayList<>();
        SearchHit[] hits = searchHits.getHits();
        for (SearchHit hit : hits) {
            String sourceAsString = hit.getSourceAsString();
            //轉(zhuǎn)為java
            Goods goods = JSON.parseObject(sourceAsString, Goods.class);
            goodsList.add(goods);
        }
        for (Goods goods : goodsList) {
            System.out.println(goods);
        }
    }

queryString查詢 ?

queryString 多條件查詢
?會對查詢條件進(jìn)行分詞。
?然后將分詞后的查詢條件和詞條進(jìn)行等值匹配
?默認(rèn)取并集(OR)
?可以指定多個(gè)查詢字段
query_string:識別query中的連接符(or 、and)
?

# queryString
GET goods/_search
{
    "query": {
        "query_string": {
            "fields": ["title","categoryName","brandName"],
            "query": "華為 AND 手機(jī)"
        }
    }
}

#simple_query_string:不識別query中的連接符(or 、and),查詢時(shí)會將 “華為”、"and"、“手機(jī)”分別進(jìn)行查詢

GET goods/_search
{
    "query": {
        "simple_query_string": {
            "fields": ["title","categoryName","brandName"],
            "query": "華為 AND 手機(jī)"
        }
    }
}

# simple_query_string:有default_operator連接符的腳本

GET goods/_search
{
    "query": {
        "simple_query_string": {
            "fields": ["title","brandName","categoryName"],
            "query": "華為手機(jī) "
            , "default_operator": "OR"
        }
    }
}

// 注意:query中的or and 是查詢時(shí) 匹配條件是否同時(shí)出現(xiàn)----or 出現(xiàn)一個(gè)即可,and 兩個(gè)條件同時(shí)出現(xiàn)default_operator的or and 是對結(jié)果進(jìn)行 并集(or)、交集(and)


query_string:有default_operator連接符的腳本

GET goods/_search
{
    "query": {
        "query_string": {
            "fields": ["title","brandName","categoryName"],
            "query": "華為手機(jī) ", 
            "default_operator": "AND"
        }
    }
}

Java API


    /**
     * queryString
     */
    @Test
    public void testQueryStringQuery() throws IOException {
        SearchRequest searchRequest = new SearchRequest("goods");
        SearchSourceBuilder sourceBulider = new SearchSourceBuilder();
        //queryString
        QueryStringQueryBuilder query = QueryBuilders.queryStringQuery("華為手機(jī)").field("title").field("categoryName").field("brandName").defaultOperator(Operator.AND);
        sourceBulider.query(query);
        searchRequest.source(sourceBulider);
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
        SearchHits searchHits = searchResponse.getHits();
        //獲取記錄數(shù)
        long value = searchHits.getTotalHits().value;
        System.out.println("總記錄數(shù):"+value);

        List<Goods> goodsList = new ArrayList<>();
        SearchHit[] hits = searchHits.getHits();
        for (SearchHit hit : hits) {
            String sourceAsString = hit.getSourceAsString();

            //轉(zhuǎn)為java
            Goods goods = JSON.parseObject(sourceAsString, Goods.class);

            goodsList.add(goods);
        }

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

布爾查詢

boolQuery:對多個(gè)查詢條件連接。連接方式:
?must(and):條件必須成立
?must_not(not):條件必須不成立
?should(or):條件可以成立
?filter:條件必須成立,性能比must高。不會計(jì)算得分
得分:即條件匹配度,匹配度越高,得分越高

eg:?布爾查詢:boolQuery
1. 查詢品牌名稱為:華為
2. 查詢標(biāo)題包含:手機(jī)
3. 查詢價(jià)格在:2000-3000

#boolquery
#must和filter配合使用時(shí),max_score(得分)是顯示的
#must 默認(rèn)數(shù)組形式
GET goods/_search
{
    "query": {
        "bool": {
            "must": [
                {
                    "term": {
                        "brandName": {
                            "value": "華為"
                        }
                    }
                }
            ],
            "filter":[
                { 
                    "term": {
                        "title": "手機(jī)"
                    }
                },
                {
                    "range":{

                        "price": {
                            "gte": 2000,
                            "lte": 3000
                        } 
                    }
                }
            ]
        }
    }

    } 

#filter 單獨(dú)使用 filter可以是單個(gè)條件,也可多個(gè)條件(數(shù)組形式)
GET goods/_search
{
    "query": {
        "bool": {
            "filter": [
            {
                "term": {
                    "brandName": {
                        "value": "華為"
                    }
                }
            }
            ]
        }
    }
}

?java api

  /**
     * 布爾查詢:boolQuery
     * 1. 查詢品牌名稱為:華為
     * 2. 查詢標(biāo)題包含:手機(jī)
     * 3. 查詢價(jià)格在:2000-3000
     */
    @Test
    public void testBoolQuery() throws IOException {
        SearchRequest searchRequest = new SearchRequest("goods");
        SearchSourceBuilder sourceBulider = new SearchSourceBuilder();
        //1.構(gòu)建boolQuery
        BoolQueryBuilder query = QueryBuilders.boolQuery();
        //2.構(gòu)建各個(gè)查詢條件
        //2.1 查詢品牌名稱為:華為
        QueryBuilder termQuery = QueryBuilders.termQuery("brandName","華為");
        query.must(termQuery);
        //2.2. 查詢標(biāo)題包含:手機(jī)
        QueryBuilder matchQuery = QueryBuilders.matchQuery("title","手機(jī)");
        query.filter(matchQuery);
        //2.3 查詢價(jià)格在:2000-3000
        QueryBuilder rangeQuery = QueryBuilders.rangeQuery("price");
        ((RangeQueryBuilder) rangeQuery).gte(2000);
        ((RangeQueryBuilder) rangeQuery).lte(3000);
        query.filter(rangeQuery);
        //3.使用boolQuery連接
        sourceBulider.query(query);
        searchRequest.source(sourceBulider);
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
        SearchHits searchHits = searchResponse.getHits();
        //獲取記錄數(shù)
        long value = searchHits.getTotalHits().value;
        System.out.println("總記錄數(shù):"+value);
        List<Goods> goodsList = new ArrayList<>();
        SearchHit[] hits = searchHits.getHits();
        for (SearchHit hit : hits) {
            String sourceAsString = hit.getSourceAsString();
            //轉(zhuǎn)為java
            Goods goods = JSON.parseObject(sourceAsString, Goods.class);
            goodsList.add(goods);
        }
        for (Goods goods : goodsList) {
            System.out.println(goods);
        }
    }

聚合查詢

指標(biāo)聚合:相當(dāng)于MySQL的聚合函數(shù)。max、min、avg、sum等
?桶聚合:相當(dāng)于MySQL的 group by 操作。不要對text類型的數(shù)據(jù)進(jìn)行分組,會失敗。
?

# 聚合查詢
# 指標(biāo)聚合 聚合函數(shù)
GET goods/_search
{
  "query": {
  "match": {
    "title": "手機(jī)"
  }
},
  "aggs": {
  "max_price": {
    "max": {
      "field": "price"
    }
  }
}
} 

#桶聚合 分組
GET goods/_search
{
  "query": {
  "match": {
    "title": "手機(jī)"
  }
},
  "aggs": {
  "goods_brands": {
    "terms": {
      "field": "brandName",
          "size": 100
    }
  }
}
}

java api

/**
     * 聚合查詢:桶聚合,分組查詢
     * 1. 查詢title包含手機(jī)的數(shù)據(jù)
     * 2. 查詢品牌列表
     */
    @Test
    public void testAggQuery() throws IOException {
        SearchRequest searchRequest = new SearchRequest("goods");
        SearchSourceBuilder sourceBulider = new SearchSourceBuilder();
        // 1. 查詢title包含手機(jī)的數(shù)據(jù)
        MatchQueryBuilder query = QueryBuilders.matchQuery("title", "手機(jī)");
        sourceBulider.query(query);
        // 2. 查詢品牌列表
        /*
        參數(shù):
            1. 自定義的名稱,將來用于獲取數(shù)據(jù)
            2. 分組的字段
         */
        AggregationBuilder agg = AggregationBuilders.terms("goods_brands").field("brandName").size(100);
        sourceBulider.aggregation(agg);
        searchRequest.source(sourceBulider);
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
        SearchHits searchHits = searchResponse.getHits();
        //獲取記錄數(shù)
        long value = searchHits.getTotalHits().value;
        System.out.println("總記錄數(shù):"+value);

        List<Goods> goodsList = new ArrayList<>();
        SearchHit[] hits = searchHits.getHits();
        for (SearchHit hit : hits) {
            String sourceAsString = hit.getSourceAsString();
            //轉(zhuǎn)為java
            Goods goods = JSON.parseObject(sourceAsString, Goods.class);
            goodsList.add(goods);
        }

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

        // 獲取聚合結(jié)果
        Aggregations aggregations = searchResponse.getAggregations();
        Map<String, Aggregation> aggregationMap = aggregations.asMap();
        //System.out.println(aggregationMap);
        Terms goods_brands = (Terms) aggregationMap.get("goods_brands");
        List<? extends Terms.Bucket> buckets = goods_brands.getBuckets();
        List brands = new ArrayList();
        for (Terms.Bucket bucket : buckets) {
            Object key = bucket.getKey();
            brands.add(key);
        }

        for (Object brand : brands) {
            System.out.println(brand);
        }

    }

高亮查詢

高亮三要素:
?高亮字段
?前綴
?后綴
默認(rèn)前后綴 :em
?

GET goods/_search
{
  "query": {
  "match": {
    "title": "電視"
  }
},
  "highlight": {
  "fields": {
    "title": {
      "pre_tags": "<font color='red'>",
          "post_tags": "</font>"
    }
  }
}
}

java api文章來源地址http://www.zghlxwxcb.cn/news/detail-852429.html

/**
     *
     * 高亮查詢:
     *  1. 設(shè)置高亮
     *      * 高亮字段
     *      * 前綴
     *      * 后綴
     *  2. 將高亮了的字段數(shù)據(jù),替換原有數(shù)據(jù)
     */
    @Test
    public void testHighLightQuery() throws IOException {
        SearchRequest searchRequest = new SearchRequest("goods");
        SearchSourceBuilder sourceBulider = new SearchSourceBuilder();
        // 1. 查詢title包含手機(jī)的數(shù)據(jù)
        MatchQueryBuilder query = QueryBuilders.matchQuery("title", "手機(jī)");
        sourceBulider.query(query);
        //設(shè)置高亮
        HighlightBuilder highlighter = new HighlightBuilder();
        //設(shè)置三要素
        highlighter.field("title");
        highlighter.preTags("<font color='red'>");
        highlighter.postTags("</font>");
        sourceBulider.highlighter(highlighter);
        // 2. 查詢品牌列表
        /*
        參數(shù):
            1. 自定義的名稱,將來用于獲取數(shù)據(jù)
            2. 分組的字段
         */
        AggregationBuilder agg = AggregationBuilders.terms("goods_brands").field("brandName").size(100);
        sourceBulider.aggregation(agg);
        searchRequest.source(sourceBulider);
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
        SearchHits searchHits = searchResponse.getHits();
        //獲取記錄數(shù)
        long value = searchHits.getTotalHits().value;
        System.out.println("總記錄數(shù):"+value);
        List<Goods> goodsList = new ArrayList<>();
        SearchHit[] hits = searchHits.getHits();
        for (SearchHit hit : hits) {
            String sourceAsString = hit.getSourceAsString();
            //轉(zhuǎn)為java
            Goods goods = JSON.parseObject(sourceAsString, Goods.class);
            // 獲取高亮結(jié)果,替換goods中的title
            Map<String, HighlightField> highlightFields = hit.getHighlightFields();
            HighlightField HighlightField = highlightFields.get("title");
            Text[] fragments = HighlightField.fragments();
            //替換
            goods.setTitle(fragments[0].toString());
            goodsList.add(goods);
        }
        for (Goods goods : goodsList) {
            System.out.println(goods);
        }

        // 獲取聚合結(jié)果
        Aggregations aggregations = searchResponse.getAggregations();
        Map<String, Aggregation> aggregationMap = aggregations.asMap();
        //System.out.println(aggregationMap);
        Terms goods_brands = (Terms) aggregationMap.get("goods_brands");

        List<? extends Terms.Bucket> buckets = goods_brands.getBuckets();

        List brands = new ArrayList();
        for (Terms.Bucket bucket : buckets) {
            Object key = bucket.getKey();
            brands.add(key);
        }

        for (Object brand : brands) {
            System.out.println(brand);
        }

    }

到了這里,關(guān)于架構(gòu)師系列-搜索引擎ElasticSearch(四)- 高級查詢的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Elasticsearch Serverless:無服務(wù)器架構(gòu)的搜索引擎解決方案

    Elasticsearch Serverless:無服務(wù)器架構(gòu)的搜索引擎解決方案

    隨著云計(jì)算和無服務(wù)器架構(gòu)的興起,傳統(tǒng)的應(yīng)用開發(fā)方式正在經(jīng)歷革命性的變化。在這個(gè)變革的浪潮中,Elasticsearch Serverless嶄露頭角,成為構(gòu)建強(qiáng)大搜索引擎的新選擇。本文將深入探討Elasticsearch Serverless的概念、優(yōu)勢,以及如何在無服務(wù)器環(huán)境中利用它構(gòu)建靈活而高效的搜索

    2024年03月14日
    瀏覽(30)
  • elasticsearch(ES)分布式搜索引擎03——(RestClient查詢文檔,ES旅游案例實(shí)戰(zhàn))

    elasticsearch(ES)分布式搜索引擎03——(RestClient查詢文檔,ES旅游案例實(shí)戰(zhàn))

    文檔的查詢同樣適用昨天學(xué)習(xí)的 RestHighLevelClient對象,基本步驟包括: 1)準(zhǔn)備Request對象 2)準(zhǔn)備請求參數(shù) 3)發(fā)起請求 4)解析響應(yīng) 我們以match_all查詢?yōu)槔?3.1.1.發(fā)起查詢請求 代碼解讀: 第一步,創(chuàng)建 SearchRequest 對象,指定索引庫名 第二步,利用 request.source() 構(gòu)建DSL,DSL中可

    2024年02月07日
    瀏覽(26)
  • 后端架構(gòu)師必知必會系列:搜索引擎與全文檢索

    作者:禪與計(jì)算機(jī)程序設(shè)計(jì)藝術(shù) 什么是搜索引擎?它是指在互聯(lián)網(wǎng)上搜集、整理并快速索引海量信息的數(shù)據(jù)結(jié)構(gòu)與數(shù)據(jù)庫,對用戶的查詢請求進(jìn)行快速、準(zhǔn)確的響應(yīng)的技術(shù)。搜索引擎又分為互聯(lián)網(wǎng)搜索引擎(英語: internet search engine)和本地搜索引擎(英語: local search engine)。 全文

    2024年02月05日
    瀏覽(27)
  • 552、Elasticsearch詳細(xì)入門教程系列 -【分布式全文搜索引擎 Elasticsearch(三)】 2023.05.19

    1.1 簡單介紹 之前是對ES中的創(chuàng)建/查看/刪除索引、創(chuàng)建定義映射、創(chuàng)建/查看/修改/刪除文檔的這些操作有了一定的了解認(rèn)識,但是是通過Postman + JSON串的方法來實(shí)現(xiàn)的 那么之后仍然是對ES中的索引、映射、文檔進(jìn)行操作,只是方法換成了Java API。 1.2 案例詳情 首先需要?jiǎng)?chuàng)建一個(gè)

    2024年02月08日
    瀏覽(31)
  • 551、Elasticsearch詳細(xì)入門教程系列 -【分布式全文搜索引擎 Elasticsearch(二)】 2023.04.04

    551、Elasticsearch詳細(xì)入門教程系列 -【分布式全文搜索引擎 Elasticsearch(二)】 2023.04.04

    1.1 Elasticsearch中的數(shù)據(jù)格式 Elasticsearch 是面向文檔型數(shù)據(jù)庫,一條數(shù)據(jù)在這里就是一個(gè)文檔。為了方便大家理解,我們將 Elasticsearch 里存儲文檔數(shù)據(jù)和關(guān)系型數(shù)據(jù)庫 MySQL 存儲數(shù)據(jù)的概念進(jìn)行一個(gè)類比。 ES 里的 Index 可以看做一個(gè)庫,而 Types 相當(dāng)于表,Documents 則相當(dāng)于表的行。

    2023年04月11日
    瀏覽(24)
  • SpringCloud系列(十六)[分布式搜索引擎篇] - DSL 查詢及相關(guān)性算分的學(xué)習(xí) (部分)

    SpringCloud系列(十六)[分布式搜索引擎篇] - DSL 查詢及相關(guān)性算分的學(xué)習(xí) (部分)

    在SpringCloud系列(十五)[分布式搜索引擎篇] - 結(jié)合實(shí)際應(yīng)用場景學(xué)習(xí)并使用 RestClient 客戶端 API這篇文章中我們已經(jīng)對 RestClient 有了初步的了解, 并且已經(jīng)將一些數(shù)據(jù)進(jìn)行了存儲, 但是這并不是我們學(xué)習(xí) ElasticSearch 的目的, ElasticSearch 最擅長的還是對數(shù)據(jù)的搜索及分析, 因此本篇

    2024年02月17日
    瀏覽(32)
  • Java SpringBoot API 實(shí)現(xiàn)ES(Elasticsearch)搜索引擎的一系列操作(超詳細(xì))(模擬數(shù)據(jù)庫操作)

    Java SpringBoot API 實(shí)現(xiàn)ES(Elasticsearch)搜索引擎的一系列操作(超詳細(xì))(模擬數(shù)據(jù)庫操作)

    小編使用的是elasticsearch-7.3.2 基礎(chǔ)說明: 啟動(dòng):進(jìn)入elasticsearch-7.3.2/bin目錄,雙擊elasticsearch.bat進(jìn)行啟動(dòng),當(dāng)出現(xiàn)一下界面說明,啟動(dòng)成功。也可以訪問http://localhost:9200/ 啟動(dòng)ES管理:進(jìn)入elasticsearch-head-master文件夾,然后進(jìn)入cmd命令界面,輸入npm?run?start?即可啟動(dòng)。訪問http

    2024年02月04日
    瀏覽(34)
  • 盤點(diǎn)搜索引擎一些高級技巧,你值得擁有!

    盤點(diǎn)搜索引擎一些高級技巧,你值得擁有!

    搜索引擎是我們?nèi)粘I钪胁豢苫蛉钡墓ぞ咧唬ㄟ^搜索引擎,我們可以在互聯(lián)網(wǎng)上找到任何我們需要的信息。 平時(shí)我們使用搜索引擎除來直接輸入外,它們還包含了一些高級技巧?,接下來我們以 Google 搜索引擎為例進(jìn)行演示。 1、雙引號 \\\"\\\" 雙引號?\\\"\\\"?可以讓搜索

    2024年01月16日
    瀏覽(27)
  • 分布式搜索引擎ElasticSearch——搜索功能

    分布式搜索引擎ElasticSearch——搜索功能

    DSL查詢分類 DSL官方文檔 全文檢索查詢 精確查詢 地理查詢 復(fù)合查詢 Function Score Query function score query Boolean Query 排序 分頁 官方文檔 高亮 快速入門 match,term,range,bool查詢 排序和分頁 高亮顯示 就是在前面抽取的解析代碼中進(jìn)一步添加關(guān)于高亮的解析部分,因?yàn)閔ighlight和so

    2024年02月01日
    瀏覽(28)
  • 分布式搜索引擎——elasticsearch搜索功能

    分布式搜索引擎——elasticsearch搜索功能

    Elasticsearch提供了基于JSON的DSL (Domain Specific Language)來定義查詢。常見的查詢類型包括: 查詢所有:查詢出所有數(shù)據(jù),一般測試用。例如:match_all 全文檢索(full text)查詢:利用分詞器對用戶輸入內(nèi)容分詞,然后去倒排索引庫中匹配。例如: match_query multi_match_query 精確查詢:根據(jù)精確詞條

    2024年02月05日
    瀏覽(36)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包