成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Elasticsearch實戰指南:讓你的業務搜索飛起來

數據庫 其他數據庫
當你的MySQL數據庫查詢突然從0.5秒飆升到15秒,當你的產品經理第20次提出"模糊搜索要支持同義詞聯想"時——是時候重新認識這個改變搜索游戲規則的分布式搜索引擎了。

當你的MySQL數據庫查詢突然從0.5秒飆升到15秒,當你的產品經理第20次提出"模糊搜索要支持同義詞聯想"時——是時候重新認識這個改變搜索游戲規則的分布式搜索引擎了。

1.為什么Elasticsearch是新時代的“數據引擎”?

傳統數據庫的三大死穴

  • 模糊查詢性能差(LIKE耗時隨數據量指數級上升)
  • 缺乏智能排序(無法根據用戶行為動態加權)
  • 擴展性弱(分庫分表成本高)

ES的破局武器

  • 分布式架構:線性擴展支撐 PB 級數據
  • 倒排索引:毫秒級響應關鍵詞搜索
  • 分詞引擎:中文/拼音/同義詞精準匹配

2.五大場景+完整代碼:從入門到實戰

電商搜索——讓用戶“一搜即中”

痛點

  • 用戶搜索“蘋果手機”時,無法智能匹配“iPhone”
  • 搜索結果排序僵化(無法綜合銷量/評分/價格動態排序)

代碼實現

// 商品實體類
@Document(indexName = "products")
public class Product {
    @Id
    private String id;
    
    // 使用ik_max_word分詞器
    @Field(type = FieldType.Text, analyzer = "ik_max_word")
    private String title; 
    
    private Double price;
    private Long sales;
    // getters/setters
}
// 搜索服務
@Service 
public class ProductService {
    @Autowired
    private ElasticsearchOperations esOperations;
    public List<Product> search(String keyword) {
        Query query = NativeQuery.builder()
            .withQuery(q -> q
                .match(m -> m      // 多字段匹配
                    .field("title")
                    .field("description")
                    .query(keyword)
                )
            )
            .withSort(s -> s     // 綜合排序:銷量倒序 > 價格升序
                .field(f -> f.field("sales").order(SortOrder.Desc))
                .field(f -> f.field("price").order(SortOrder.Asc))
            )
            .build();
        return esOperations.search(query, Product.class)
            .stream().map(SearchHit::getContent).collect(Collectors.toList());
    }
}

推薦系統——讓用戶“欲罷不能”

痛點

  • 用戶興趣變化快,推薦結果更新延遲高
  • 無法實時結合用戶位置/行為調整策略

代碼實現

// 用戶畫像實體
@Document(indexName = "user_profiles")
public class UserProfile {
    @Field(type = FieldType.Keyword)
    private String userId;
    
    // 用戶興趣標簽(可動態更新)
    @Field(type = FieldType.Keyword)
    private List<String> tags;
    
    @GeoPointField
    private GeoPoint lastLocation;
}
// 附近相似用戶推薦
public List<UserProfile> recommendUsers(String userId, int radiusKm) {
    UserProfile current = getUserById(userId); // 獲取當前用戶
    
    Query query = NativeQuery.builder()
        .withQuery(q -> q
            .bool(b -> b
                .must(m -> m.geoDistance(g -> g // 地理過濾
                    .field("lastLocation")
                    .distance(radiusKm + "km")
                    .location(l -> l.latlon(ll -> 
                        ll.lat(current.getLastLocation().lat())
                          .lon(current.getLastLocation().lon())
                    ))
                ))
                .must(m -> m.terms(t -> t // 標簽匹配
                    .field("tags")
                    .terms(t2 -> t2.value(current.getTags()))
                )
            )
        )
        .build();
    return esOperations.search(query, UserProfile.class)
        .stream().map(SearchHit::getContent)
        .collect(Collectors.toList());
}

地理搜索——讓“附近的人”觸手可及

痛點

  • MySQL地理計算性能差(ST_Distance函數消耗大)
  • 無法支持復雜地理圍欄

完整實現

// 商家實體(含地理位置)
@Document(indexName = "shops")
public class Shop {
    @Id
    private String id;
    
    @GeoPointField // 關鍵注解!
    private GeoPoint location;
    
    @Field(type = FieldType.Text)
    private String name;
}
// 附近商家服務
@Service
public class ShopService {
    public List<Shop> findNearby(double lat, double lon, double radiusKm) {
        Query query = NativeQuery.builder()
            .withQuery(q -> q
                .geoDistance(g -> g
                    .field("location")
                    .distance(radiusKm + "km")
                    .location(gl -> gl.latlon(l -> l.lat(lat).lon(lon)))
            )
            .withSort(s -> s // 按距離排序
                .geoDistance(g -> g
                    .field("location")
                    .location(l -> l.latlon(ll -> ll.lat(lat).lon(lon))
                    .order(SortOrder.Asc))
            )
            .build();
        return esOperations.search(query, Shop.class)
            .stream().map(SearchHit::getContent)
            .collect(Collectors.toList());
    }
}
// 接口調用示例
@RestController
@RequestMapping("/shops")
public class ShopController {
    @GetMapping("/nearby")
    public List<Shop> getNearby(
        @RequestParam double lat, 
        @RequestParam double lon,
        @RequestParam(defaultValue = "3") double radius) {
        return shopService.findNearby(lat, lon, radius);
    }
}

3.性能對比:ES如何碾壓傳統方案

場景

數據量

MySQL耗時

ES耗時

優勢倍數

商品搜索

1000萬

4.2s

28ms

150x

附近商家查詢

50萬

920ms

15ms

61x

4.避坑指南:ES不是銀彈

事務場景:訂單支付等需強一致性時,仍需結合MySQL

冷數據存儲:歷史歸檔數據建議轉存至OSS

精確統計:UV去重請用HyperLogLog

5.小結

從電商搜索到地理圍欄,Elasticsearch 正在重新定義數據處理的邊界。當你的業務面臨以下挑戰時,就是時候考慮 ES 了

  • 數據量超過千萬級
  • 需要復雜搜索/聚合
  • 對實時性要求高
責任編輯:武曉燕 來源: JAVA充電
相關推薦

2020-09-29 07:54:05

Express 飛起

2011-04-13 10:51:58

MATLAB

2019-03-25 08:05:35

Elasticsear優化集群

2024-06-12 12:28:23

2025-04-15 00:00:00

2019-11-05 10:35:57

SpringBoot調優Java

2023-03-01 23:59:23

Java開發

2021-07-13 07:52:03

SQL面試COUNT(*)

2025-06-04 01:35:00

RocketMQ異步消息

2024-11-25 18:00:00

C#代碼編程

2022-10-09 18:14:31

訂單系統分庫分表

2025-05-22 09:43:55

2021-01-04 15:11:57

開發 IDEA代碼

2024-11-27 09:46:34

2013-01-07 09:34:43

CodeLoveBAT

2011-02-25 08:39:11

QFabric數據中心Juniper

2025-01-17 09:23:31

2016-01-19 17:03:59

數據中心網絡華為

2025-05-22 08:04:43

2011-09-27 13:25:05

Web
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人欧美一区二区 | 91在线观| 日韩精品成人网 | 欧美综合国产精品久久丁香 | 国产一级视频在线播放 | 麻豆国产一区二区三区四区 | 欧美黄色性生活视频 | 日韩精品 电影一区 亚洲 | 国产精品久久久久无码av | 中文在线www | 激情五月综合网 | 国产毛片毛片 | 亚洲视频在线观看免费 | 日本黄色大片免费 | 日韩一区二区三区四区五区 | 久久国产精品72免费观看 | 91精品国产日韩91久久久久久 | 亚洲视频在线观看免费 | 亚洲视频免费观看 | 国产欧美日韩精品一区二区三区 | 国产精品日韩欧美一区二区三区 | 激情欧美一区二区三区 | 超碰日本 | 日韩一二区 | 久久国产精品久久久久久久久久 | 国产精品免费一区二区三区四区 | а天堂中文最新一区二区三区 | 99re视频精品| 一区精品国产欧美在线 | 91色综合 | 日韩欧美视频 | 欧美日韩黄色一级片 | 狠狠躁夜夜躁人人爽天天高潮 | 天天操夜夜操 | 欧美日韩一 | 2021狠狠天天天| 欧美色成人 | 国产精品高潮呻吟久久 | 在线高清免费观看视频 | 中文在线观看视频 | 福利片一区二区 |