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

Spring Boot 整合 分布式搜索引擎 Elastic Search 實現(xiàn) 我附近的、酒店競排

這篇具有很好參考價值的文章主要介紹了Spring Boot 整合 分布式搜索引擎 Elastic Search 實現(xiàn) 我附近的、酒店競排。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

?引言

本文參考黑馬 分布式Elastic search
Elasticsearch是一款非常強大的開源搜索引擎,具備非常多強大功能,可以幫助我們從海量數(shù)據(jù)中快速找到需要的內容

一、我附近的酒店

?需求分析

在酒店列表頁的右側,有一個小地圖,點擊地圖的定位按鈕,地圖會找到你所在的位置:

Spring Boot 整合 分布式搜索引擎 Elastic Search 實現(xiàn) 我附近的、酒店競排

點擊定位后,會發(fā)送給服務端以下請求json

Spring Boot 整合 分布式搜索引擎 Elastic Search 實現(xiàn) 我附近的、酒店競排

我們要做的事情就是基于這個location坐標,然后按照距離對周圍酒店排序。實現(xiàn)思路如下:

  • 修改RequestParams參數(shù),接收location字段
  • 修改search方法業(yè)務邏輯,如果location有值,添加根據(jù)geo_distance排序的功能

?源碼編寫

修改實體類

import lombok.Data;

@Data
public class RequestParams {
    private String key;
    private Integer page;
    private Integer size;
    private String sortBy;
    private String city;
    private String brand;
    private String starName;
    private Integer minPrice;
    private Integer maxPrice;
    // 我當前的地理坐標
    private String location;
}

距離排序

我們以前學習過排序功能,包括兩種:

  • 普通字段排序
  • 地理坐標排序

地理坐標 DSL 語法如下

GET /indexName/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "price": "asc"  
    },
    {
      "_geo_distance" : {
          "FIELD" : "緯度,經(jīng)度",
          "order" : "asc",
          "unit" : "km"
      }
    }
  ]
}

添加距離排序

@Override
public PageResult search(RequestParams params) {
    try {
        // 1.準備Request
        SearchRequest request = new SearchRequest("hotel");
        // 2.準備DSL
        // 2.1.query
        buildBasicQuery(params, request);

        // 2.2.分頁
        int page = params.getPage();
        int size = params.getSize();
        request.source().from((page - 1) * size).size(size);

        // 2.3.排序
        String location = params.getLocation();
        if (location != null && !location.equals("")) {
            request.source().sort(SortBuilders
                                  .geoDistanceSort("location", new GeoPoint(location))
                                  .order(SortOrder.ASC)
                                  .unit(DistanceUnit.KILOMETERS)
                                 );
        }

        // 3.發(fā)送請求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        // 4.解析響應
        return handleResponse(response);
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

排序距離展示

重啟進行測試:

Spring Boot 整合 分布式搜索引擎 Elastic Search 實現(xiàn) 我附近的、酒店競排

的卻可以實現(xiàn) 我附近的酒店距離排序,但是沒有展示距離我們有多遠,這個我們應該怎么實現(xiàn)呢?

排序完成后,頁面還要獲取我附近每個酒店的具體距離值,這個值在響應結果中是獨立的:

Spring Boot 整合 分布式搜索引擎 Elastic Search 實現(xiàn) 我附近的、酒店競排

因此,我們在結果解析階段,除了解析source部分以外,還要得到sort部分,也就是排序的距離,然后放到響應結果中。

我們要做兩件事:

  • 修改HotelDoc,添加排序距離字段,用于頁面顯示
  • 修改HotelService類中的handleResponse方法,添加對sort值的獲取

添加距離排序字段

import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
public class HotelDoc {
    private Long id;
    private String name;
    private String address;
    private Integer price;
    private Integer score;
    private String brand;
    private String city;
    private String starName;
    private String business;
    private String location;
    private String pic;
    // 排序時的 距離值
    private Object distance;

    public HotelDoc(Hotel hotel) {
        this.id = hotel.getId();
        this.name = hotel.getName();
        this.address = hotel.getAddress();
        this.price = hotel.getPrice();
        this.score = hotel.getScore();
        this.brand = hotel.getBrand();
        this.city = hotel.getCity();
        this.starName = hotel.getStarName();
        this.business = hotel.getBusiness();
        this.location = hotel.getLatitude() + ", " + hotel.getLongitude();
        this.pic = hotel.getPic();
    }
}

修改 handleResponse 方法

Spring Boot 整合 分布式搜索引擎 Elastic Search 實現(xiàn) 我附近的、酒店競排

重啟進行測試

Spring Boot 整合 分布式搜索引擎 Elastic Search 實現(xiàn) 我附近的、酒店競排

已成功展示距離。

二、酒店競價排名

需求:讓指定的酒店在搜索結果中排名置頂

?需求分析

要讓指定酒店在搜索結果中排名置頂,效果如圖:

Spring Boot 整合 分布式搜索引擎 Elastic Search 實現(xiàn) 我附近的、酒店競排

頁面會給指定的酒店添加廣告標記。

那怎樣才能讓指定的酒店排名置頂呢?

我們之前學習過的function_score查詢可以影響算分,算分高了,自然排名也就高了。而function_score包含3個要素:

  • 過濾條件:哪些文檔要加分
  • 算分函數(shù):如何計算function score
  • 加權方式:function score 與 query score如何運算

這里的需求是:讓指定酒店排名靠前。因此我們需要給這些酒店添加一個標記,這樣在過濾條件中就可以根據(jù)這個標記來判斷,是否要提高算分。

比如,我們給酒店添加一個字段:isAD,Boolean類型:

  • true:是廣告
  • false:不是廣告

這樣function_score包含3個要素就很好確定了:

  • 過濾條件:判斷isAD 是否為true
  • 算分函數(shù):我們可以用最簡單暴力的weight,固定加權值
  • 加權方式:可以用默認的相乘,大大提高算分

因此,業(yè)務的實現(xiàn)步驟包括:

  1. 給HotelDoc類添加isAD字段,Boolean類型

  2. 挑選幾個你喜歡的酒店,給它的文檔數(shù)據(jù)添加isAD字段,值為true

  3. 修改search方法,添加function score功能,給isAD值為true的酒店增加權重

?修改搜索業(yè)務

添加廣告標記

修改實體類

import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
public class HotelDoc {
    private Long id;
    private String name;
    private String address;
    private Integer price;
    private Integer score;
    private String brand;
    private String city;
    private String starName;
    private String business;
    private String location;
    private String pic;
    private Object distance;
    // 加入廣告標識
    private Boolean isAD;

    public HotelDoc(Hotel hotel) {
        this.id = hotel.getId();
        this.name = hotel.getName();
        this.address = hotel.getAddress();
        this.price = hotel.getPrice();
        this.score = hotel.getScore();
        this.brand = hotel.getBrand();
        this.city = hotel.getCity();
        this.starName = hotel.getStarName();
        this.business = hotel.getBusiness();
        this.location = hotel.getLatitude() + ", " + hotel.getLongitude();
        this.pic = hotel.getPic();
    }
}

隨便設置幾個作為廣告置項

POST /hotel/_update/2056105938
{
    "doc": {
        "isAD": true
    }
}

POST /hotel/_update/38609
{
    "doc": {
        "isAD": true
    }
}

添加算分函數(shù)查詢

接下來我們就要修改查詢條件了。之前是用的boolean 查詢,現(xiàn)在要改成function_socre查詢。

function_score查詢結構如下:

Spring Boot 整合 分布式搜索引擎 Elastic Search 實現(xiàn) 我附近的、酒店競排

對應的JavaAPI如下:

Spring Boot 整合 分布式搜索引擎 Elastic Search 實現(xiàn) 我附近的、酒店競排

我們可以將之前寫的boolean查詢作為原始查詢條件放到query中,接下來就是添加過濾條件、算分函數(shù)、加權模式了。所以原來的代碼依然可以沿用。

加入算分查詢

private void buildBasicQuery(RequestParams params, SearchRequest request) {
    // 1.構建BooleanQuery
    BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
    // 關鍵字搜索
    String key = params.getKey();
    if (key == null || "".equals(key)) {
        boolQuery.must(QueryBuilders.matchAllQuery());
    } else {
        boolQuery.must(QueryBuilders.matchQuery("all", key));
    }
    // 城市條件
    if (params.getCity() != null && !params.getCity().equals("")) {
        boolQuery.filter(QueryBuilders.termQuery("city", params.getCity()));
    }
    // 品牌條件
    if (params.getBrand() != null && !params.getBrand().equals("")) {
        boolQuery.filter(QueryBuilders.termQuery("brand", params.getBrand()));
    }
    // 星級條件
    if (params.getStarName() != null && !params.getStarName().equals("")) {
        boolQuery.filter(QueryBuilders.termQuery("starName", params.getStarName()));
    }
    // 價格
    if (params.getMinPrice() != null && params.getMaxPrice() != null) {
        boolQuery.filter(QueryBuilders
                         .rangeQuery("price")
                         .gte(params.getMinPrice())
                         .lte(params.getMaxPrice())
                        );
    }

    // 2.算分控制
    FunctionScoreQueryBuilder functionScoreQuery =
        QueryBuilders.functionScoreQuery(
        // 原始查詢,相關性算分的查詢
        boolQuery,
        // function score的數(shù)組
        new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{
            // 其中的一個function score 元素
            new FunctionScoreQueryBuilder.FilterFunctionBuilder(
                // 過濾條件
                QueryBuilders.termQuery("isAD", true),
                // 算分函數(shù)
                ScoreFunctionBuilders.weightFactorFunction(10)
            )
        });
    request.source().query(functionScoreQuery);
}

效果展示

Spring Boot 整合 分布式搜索引擎 Elastic Search 實現(xiàn) 我附近的、酒店競排

?效果圖

Spring Boot 整合 分布式搜索引擎 Elastic Search 實現(xiàn) 我附近的、酒店競排

?小結

以上就是【Bug 終結者】對 Spring Boot 整合 分布式搜索引擎 Elastic Search 實現(xiàn) 搜索、分頁與結果過濾 的簡單介紹,ES搜索引擎無疑是最優(yōu)秀的分布式搜索引擎,使用它,可大大提高項目的靈活、高效性! 技術改變世界!??!

如果這篇【文章】有幫助到你,希望可以給【Bug 終結者】點個贊??,創(chuàng)作不易,如果有對【后端技術】、【前端領域】感興趣的小可愛,也歡迎關注?????? 【Bug 終結者】??????,我將會給你帶來巨大的【收獲與驚喜】??????!文章來源地址http://www.zghlxwxcb.cn/news/detail-464277.html

到了這里,關于Spring Boot 整合 分布式搜索引擎 Elastic Search 實現(xiàn) 我附近的、酒店競排的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領支付寶紅包贊助服務器費用

相關文章

  • Spring Cloud學習(十一)【深入Elasticsearch 分布式搜索引擎03】

    Spring Cloud學習(十一)【深入Elasticsearch 分布式搜索引擎03】

    聚合(aggregations)可以實現(xiàn)對文檔數(shù)據(jù)的統(tǒng)計、分析、運算。聚合常見的有三類: 桶(Bucket)聚合:用來對文檔做分組 TermAggregation:按照文檔字段值分組 Date Histogram:按照日期階梯分組,例如一周為一組,或者一月為一組 度量(Metric)聚合:用以計算一些值,比如:最大值

    2024年01月23日
    瀏覽(62)
  • Spring Boot與Redisson的整合。分布式鎖

    Spring Boot與Redisson的整合可以幫助您在Spring Boot應用程序中使用分布式鎖、緩存等功能。下面是一些基本步驟來整合Spring Boot與Redisson: 添加Maven/Gradle依賴: 在您的Spring Boot項目的 pom.xml (Maven)或 build.gradle (Gradle)文件中添加Redisson的依賴。 Maven依賴示例: Gradle依賴示例:

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

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

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

    2024年02月05日
    瀏覽(34)
  • 分布式搜索引擎ElasticSearch——搜索功能

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

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

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

    分布式搜索引擎

    elasticsearch的查詢依然是基于JSON風格的DSL來實現(xiàn)的。 Elasticsearch提供了基于JSON的DSL(Domain Specific Language)來定義查詢。常見的查詢類型包括: 查詢所有 :查詢出所有數(shù)據(jù),一般測試用。例如:match_all 全文檢索(full text)查詢 :利用分詞器對用戶輸入內容分詞,然后去倒排索

    2024年02月10日
    瀏覽(25)
  • 【分布式搜索引擎02】

    elasticsearch的查詢依然是基于JSON風格的DSL來實現(xiàn)的。 Elasticsearch提供了基于JSON的DSL(Domain Specific Language)來定義查詢。常見的查詢類型包括: 查詢所有 :查詢出所有數(shù)據(jù),一般測試用。例如:match_all 全文檢索(full text)查詢 :利用分詞器對用戶輸入內容分詞,然后去倒排索

    2024年02月01日
    瀏覽(41)
  • 【分布式搜索引擎03】

    【分布式搜索引擎03】

    **聚合(aggregations)**可以讓我們極其方便的實現(xiàn)對數(shù)據(jù)的統(tǒng)計、分析、運算。例如: 什么品牌的手機最受歡迎? 這些手機的平均價格、最高價格、最低價格? 這些手機每月的銷售情況如何? 實現(xiàn)這些統(tǒng)計功能的比數(shù)據(jù)庫的sql要方便的多,而且查詢速度非??欤梢詫崿F(xiàn)近

    2024年02月05日
    瀏覽(39)
  • 分布式搜索引擎--認識

    分布式搜索引擎--認識

    elasticsearch的作用 elasticsearch是一款非常強大的開源搜索引擎,具備非常多強大功能,可以幫助我們從海量數(shù)據(jù)中快速找到需要的內容 。 elasticsearch結合kibana、Logstash、Beats,也就是elastic stack(ELK)。被廣泛應用在日志數(shù)據(jù)分析、實時監(jiān)控等領域。 而elasticsearch是elastic stack的核

    2024年01月18日
    瀏覽(23)
  • 分布式搜索引擎----elasticsearch

    分布式搜索引擎----elasticsearch

    目錄 1、初識elasticsearch 1.1、什么是elasticsearch 1.2.ELK技術棧 2、正向索引和倒排索引 2.1、正向索引 2.2、倒排索引 2.3、正向索引和倒排索引的區(qū)別 3、elasticsearch中的概念理解 3.1、文檔和字段 3.2、索引和映射 3.3、mysql與elasticsearch ????????elasticsearch是一款非常強大的開源搜索

    2024年02月11日
    瀏覽(58)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包