• 1024程序员节特辑 | ELK+ 用户画像构建个性化推荐引擎,智能实现“千人千面”


    专栏集锦,大佬们可以收藏以备不时之需

    Spring Cloud实战专栏:https://blog.csdn.net/superdangbo/category_9270827.html

    Python 实战专栏:https://blog.csdn.net/superdangbo/category_9271194.html

    Logback 详解专栏:https://blog.csdn.net/superdangbo/category_9271502.html

    tensorflow专栏:https://blog.csdn.net/superdangbo/category_8691332.html

    Redis专栏:https://blog.csdn.net/superdangbo/category_9950790.html

    1024程序员节特辑文章:

    1024程序员节特辑 | OKR VS KPI谁更合适?

    1024程序员节特辑 | Spring Boot实战 之 MongoDB分片或复制集操作

    Spring实战系列文章:

    Spring实战 | Spring AOP核心秘笈之葵花宝典

    Spring实战 | Spring IOC不能说的秘密?

    国庆中秋特辑系列文章:

    国庆中秋特辑(八)Spring Boot项目如何使用JPA

    国庆中秋特辑(七)Java软件工程师常见20道编程面试题

    国庆中秋特辑(六)大学生常见30道宝藏编程面试题

    国庆中秋特辑(五)MySQL如何性能调优?下篇

    国庆中秋特辑(四)MySQL如何性能调优?上篇

    国庆中秋特辑(三)使用生成对抗网络(GAN)生成具有节日氛围的画作,深度学习框架 TensorFlow 和 Keras 来实现

    国庆中秋特辑(二)浪漫祝福方式 使用生成对抗网络(GAN)生成具有节日氛围的画作

    国庆中秋特辑(一)浪漫祝福方式 用循环神经网络(RNN)或长短时记忆网络(LSTM)生成祝福诗词

    在这里插入图片描述

    一、ELK介绍

    ELK,全称 Elasticsearch、Logstash、Kibana,是一种流行的开源日志管理和分析平台。ELK Stack 的三个主要组件分别为 Elasticsearch(分布式搜索和分析引擎)、Logstash(数据收集和处理工具)以及 Kibana(数据可视化工具)。
    在这里插入图片描述

    1、发展历史
    ELK 的历史可以追溯到 2012 年,当时 Elasticsearch 项目创始人 Shay Banon 发布了 Elasticsearch 的首个版本。随着项目的发展,Logstash 和 Kibana 相继诞生,并与 Elasticsearch 共同构成了 ELK Stack。
    2、组件详细介绍

    1. Elasticsearch
      Elasticsearch 是一个高度可扩展的开源全文搜索和分析引擎,它基于 Apache Lucene 项目开发。Elasticsearch 提供了分布式、多台机器上的搜索和分析功能,能够快速存储、检索和分析大量数据。在 ELK Stack 中,Elasticsearch 负责存储和查询日志数据。
    2. Logstash
      Logstash 是一个数据收集和处理的强大工具,它可以从各种数据源(如日志文件、数据库和消息队列)收集数据,并对数据进行过滤、分析和格式化。Logstash 基于事件驱动架构,能够高并发地处理大量数据。在 ELK Stack 中,Logstash 负责从各种数据源收集日志数据,并将其发送到 Elasticsearch 进行存储和分析。
    3. Kibana
      Kibana 是一个用户友好的日志分析和可视化工具,它可以帮助用户通过图表、表格和仪表盘等直观的方式查看和分析日志数据。Kibana 基于 Web 界面,支持多种数据分析功能,如聚合、过滤和可视化。在 ELK Stack 中,Kibana 负责展示和分析 Elasticsearch 存储的日志数据。
      3、案例
    4. 日志收集和分析
      某公司有多个服务器,需要对各服务器的日志进行统一收集和分析。使用 ELK Stack,可以在各个服务器上安装 Filebeat,将日志收集到 Logstash,然后通过 Logstash 发送到 Elasticsearch 进行存储和分析。最后,通过 Kibana 进行可视化展示。
    5. 实时数据监控
      某公司在生产环境中需要实时监控各项关键指标,以确保系统的稳定运行。使用 ELK Stack,可以实时收集和分析各项指标数据,并通过 Kibana 进行可视化展示,以便实时了解系统运行状况。
    6. 安全事件分析
      某公司需要对安全事件进行实时监控和分析,以便及时发现并应对潜在的安全威胁。使用 ELK Stack,可以收集和分析安全事件数据,并通过 Kibana 进行可视化展示,以便快速识别异常并采取措施。
      4、总结
      ELK Stack 是一种强大的日志管理和分析工具,它可以帮助用户高效地收集、存储、分析和可视化大量日志数据。ELK Stack 的三个主要组件分别为 Elasticsearch(分布式搜索和分析引擎)、Logstash(数据收集和处理工具)以及 Kibana(数据可视化工具)。ELK Stack 在多个领域都有广泛的应用,如日志收集和分析、实时数据监控以及安全事件分析等。通过使用 ELK Stack,用户可以更加方便地管理和分析日志数据,从而提高运维效率。

    二、ELK安装部署

    ELK 是指 Elasticsearch、Logstash 和 Kibana 三个开源工具的组合,通常用于大规模日志数据处理和可视化。以下是 ELK 的安装和部署步骤:

    1. 准备环境
      确保你的服务器满足以下要求:
    • 操作系统:Ubuntu 18.04 LTS
    • 内存:至少 4GB
    • 硬盘:至少 20GB
    1. 安装 Java
      在 Ubuntu 服务器上安装 Java,运行以下命令:
    sudo apt-get update  
    sudo apt-get install openjdk-11-jdk  
    
    • 1
    • 2

    检查 Java 版本:

    java -version  
    
    • 1
    1. 下载并安装 Elasticsearch
      访问 Elasticsearch 官方网站下载合适版本的 Elasticsearch:https://www.elastic.co/downloads/elasticsearch
      下载完成后,将 Elasticsearch 压缩包上传到服务器,然后解压:
    sudo mkdir -p /usr/share/elasticsearch  
    sudo tar -xzf elasticsearch-7.10.2.tar.gz -C /usr/share/elasticsearch --strip-components=1  
    
    • 1
    • 2

    设置 Elasticsearch 的环境变量:

    export ES_HOME=/usr/share/elasticsearch  
    export PATH=$PATH:$ES_HOME/bin  
    
    • 1
    • 2

    创建 Elasticsearch 配置文件:

    sudo tee /etc/elasticsearch/elasticsearch.yml << EOL  
    cluster.name: my-cluster  
    node.name: my-node  
    network.host: 0.0.0.0  
    http.port: 9200  
    discovery.seed_hosts: ["host1", "host2"]  
    cluster.initial_master_nodes: ["node-1", "node-2"]  
    EOL  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    启动 Elasticsearch:

    sudo systemctl start elasticsearch  
    
    • 1

    检查 Elasticsearch 是否运行正常:

    curl -X GET "localhost:9200/"  
    
    • 1
    1. 下载并安装 Logstash
      访问 Logstash 官方网站下载合适版本的 Logstash:https://www.elastic.co/downloads/logstash
      在这里插入图片描述

    下载完成后,将 Logstash 压缩包上传到服务器,然后解压:

    sudo mkdir -p /usr/share/logstash  
    sudo tar -xzf logstash-7.10.2.tar.gz -C /usr/share/logstash --strip-components=1  
    
    • 1
    • 2

    创建 Logstash 配置文件:

    sudo tee /etc/logstash/logstash.conf << EOL  
    input {  
     beats {  
       port => 5044  
     }  
    }
    filter {  
     if "apache" in [$log][app] {  
       grok {  
         match => { "message" => "%{GREEDYDATA:apache_message}" }  
       }  
     } else if "nginx" in [$log][app] {  
       grok {  
         match => { "message" => "%{GREEDYDATA:nginx_message}" }  
       }  
     }  
    }
    output {  
     if "apache" in [$log][app] {  
       elasticsearch {  
         hosts => ["http://localhost:9200"]  
         index => "my-index-%{+YYYY.MM.dd}"  
       }  
     } else if "nginx" in [$log][app] {  
       elasticsearch {  
         hosts => ["http://localhost:9200"]  
         index => "my-index-%{+YYYY.MM.dd}"  
       }  
     }  
    }
    EOL  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    启动 Logstash:

    sudo systemctl start logstash  
    
    • 1
    1. 下载并安装 Kibana
      访问 Kibana 官方网站下载合适版本的 Kibana:https://www.elastic.co/downloads/kibana
      在这里插入图片描述

    下载完成后,将 Kibana 压缩包上传到服务器,然后解压:

    sudo mkdir -p /usr/share/kibana  
    sudo tar -xzf kibana-7.10.2.tar.gz -C /usr/share/kibana --strip-components=1  
    
    • 1
    • 2

    创建 Kibana 配置文件:

    sudo tee /etc/kibana/kibana.yml << EOL  
    server.port: 5601  
    server.host: "0.0.0.0"  
    elasticsearch.hosts: ["http://localhost:9200"]  
    EOL  
    
    • 1
    • 2
    • 3
    • 4
    • 5

    启动 Kibana:

    sudo systemctl start kibana  
    
    • 1

    在这里插入图片描述

    检查 Kibana 是否运行正常,访问 http://your_server_ip:5601,如果看到 Kibana 的欢迎页面,则说明安装成功。

    1. 配置 Elasticsearch、Logstash 和 Kibana 的集成
      在 Elasticsearch 的配置文件中,添加以下内容:
    http.port: 9200  
    discovery.seed_hosts: ["host1", "host2"]  
    cluster.initial_master_nodes: ["node-1", "node-2"]  
    
    • 1
    • 2
    • 3

    在 Logstash 的配置文件中,添加以下内容:

    output {  
     elasticsearch {  
       hosts => ["http://localhost:9200"]  
       index => "my-index-%{+YYYY.MM.dd}"  
     }  
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在 Kibana 的配置文件中,添加以下内容:

    server.port: 5601  
    server.host: "0.0.0.0"  
    elasticsearch.hosts: ["http://localhost:9200"]  
    
    • 1
    • 2
    • 3
    1. 启动 Elasticsearch、Logstash 和 Kibana
      在命令行中,分别启动 Elasticsearch、Logstash 和 Kibana:
    sudo systemctl start elasticsearch  
    sudo systemctl start logstash  
    sudo systemctl start kibana  
    
    • 1
    • 2
    • 3

    现在,你已经成功安装并部署了 ELK。

    三、ELK跟不同技术结合,实现“千人千面”

    ELK 技术可以与多种技术结合,实现千人千面的需求。以下是一些建议,并结合具体案例和代码进行说明:

    1. ELK + 用户画像:
      用户画像是对用户的基本信息、兴趣爱好、消费习惯等进行建模。可以通过收集用户的行为数据,结合机器学习和大数据技术,分析用户的兴趣和需求。将分析结果存储在用户画像系统中,为用户提供个性化推荐。
      案列:
    • 收集用户行为数据,如搜索记录、浏览记录、购买记录等。
    • 使用机器学习算法(如决策树、SVM、聚类等)分析用户行为数据,构建用户画像。
    • 将用户画像与 ELK 结合,实现基于用户画像的个性化推荐。
    1. ELK + 协同过滤:
      协同过滤是一种基于用户历史行为数据的推荐算法,可以挖掘用户之间的相似性以及物品之间的相似性。通过协同过滤算法,可以为用户提供个性化推荐。
      案列:
    • 收集用户的历史行为数据,如评分、购买记录等。
    • 使用协同过滤算法(如基于用户的协同过滤、基于物品的协同过滤等)挖掘用户和物品之间的相似性。
    • 将协同过滤的结果与 ELK 结合,实现基于协同过滤的个性化推荐。
    1. ELK + 深度学习:
      深度学习可以在大规模数据上学习用户的兴趣和需求,为用户提供个性化推荐。可以通过神经网络、卷积神经网络、循环神经网络等算法进行深度学习。
      案列:
    • 收集用户行为数据,如点击记录、浏览记录等,并将其转化为适合深度学习模型输入的数据格式。
    • 使用深度学习模型(如神经网络、卷积神经网络、循环神经网络等)训练模型。
    • 将深度学习模型的输出与 ELK 结合,实现基于深度学习的个性化推荐。
      以上仅为示例,实际应用中可以根据业务需求和场景进行调整。在实际项目中,ELK 通常作为整个推荐系统的基础设施,与其他技术(如用户画像、协同过滤、深度学习等)相结合,实现千人千面的个性化推荐。

    四、ELK + 用户画像,用Java实现“千人千面”

    ELK(Elasticsearch、Logstash、Kibana)是一个大数据处理和可视化平台,而用户画像则是根据用户的行为、兴趣、喜好等信息构建的用户模型。实现千人千面,即为目标用户提供个性化的内容和服务。
    要实现 ELK + 用户画像的千人千面,你需要完成以下步骤:

    1. 收集用户数据:收集用户的行为数据、兴趣数据、喜好数据等。这些数据可以从用户的浏览记录、购买记录、搜索记录等渠道获取。
    2. 构建用户画像:根据收集到的用户数据,使用机器学习算法(例如决策树、支持向量机等)构建用户画像。用户画像包括用户的年龄、性别、职业、地域、消费水平等信息。
    3. 存储用户画像:将构建好的用户画像存储在 Elasticsearch 中,以便后续的查询和推荐。
    4. 实现推荐算法:使用 Logstash 处理用户行为数据,然后结合用户画像,实现个性化推荐。推荐算法可以使用基于内容的推荐、协同过滤、矩阵分解等。
    5. 输出推荐结果:将推荐结果可视化在 Kibana 中,提供给用户。
      以下是一个简化的 Java 代码示例,用于实现 ELK + 用户画像的千人千面:
      要安装所需的库,您需要执行以下步骤:
    6. 添加 Maven 依赖项
      在您的 Maven 项目的 pom.xml 文件中,添加以下依赖项:
    <dependencies>  
     <dependency>  
       <groupId>org.elasticsearchgroupId>  
       <artifactId>elasticsearchartifactId>  
       <version>7.9.3version>  
     dependency>  
     <dependency>  
       <groupId>com.fasterxml.jackson.coregroupId>  
       <artifactId>jackson-databindartifactId>  
       <version>2.12.3version>  
     dependency>  
    dependencies>  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    1. 创建 UserProfile 类
      创建一个表示用户画像的类,包括用户 ID、年龄、性别、兴趣等属性。
    public class UserProfile {  
       private String userId;  
       private int age;  
       private String gender;  
       private List<String> interests;
       // 构造函数、getter 和 setter 方法  
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    1. 创建 UserProfileService
      创建一个 UserProfileService 类,用于处理用户画像的相关操作,如创建、更新、查询等。
    import com.fasterxml.jackson.databind.ObjectMapper;  
    import org.elasticsearch.action.search.SearchRequest;  
    import org.elasticsearch.action.search.SearchResponse;  
    import org.elasticsearch.client.RestHighLevelClient;  
    import org.elasticsearch.index.query.QueryBuilders;  
    import org.elasticsearch.search.builder.SearchSourceBuilder;  
    import org.elasticsearch.search.fetch.FetchSourceContext;  
    import org.elasticsearch.search.fetch.SearchHit;  
    import org.elasticsearch.search.fetch.SearchHits;  
    import org.elasticsearch.search.highlight.HighlightBuilder;  
    import org.elasticsearch.search.highlight.HighlightField;
    import java.io.IOException;  
    import java.util.List;  
    import java.util.stream.Collectors;
    public class UserProfileService {  
       private RestHighLevelClient client;  
       private ObjectMapper objectMapper;
       public UserProfileService(RestHighLevelClient client) {  
           this.client = client;  
           this.objectMapper = new ObjectMapper();  
       }
       public UserProfile createOrUpdateUserProfile(UserProfile userProfile) throws IOException {  
           // 保存用户画像到 Elasticsearch  
           // ...  
       }
       public UserProfile getUserProfileById(String userId) throws IOException {  
           // 从 Elasticsearch 查询用户画像  
           // ...  
       }
       public List<UserProfile> getSimilarUserProfiles(String userId, int topN) throws IOException {  
           // 查询与目标用户相似的用户画像  
           // ...  
       }  
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    1. 实现基于用户画像的推荐
      在 UserProfileService 中添加一个推荐方法,根据用户画像推荐相关商品。
    public List<String> recommendItems(String userId, int topN) throws IOException {  
       // 分析用户行为数据,提取特征  
       SearchRequest searchRequest = new SearchRequest(INDEX_NAME);  
       SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();  
       searchSourceBuilder.query(QueryBuilders.matchQuery("user_id", userId));  
       // 设置分页和排序  
       searchSourceBuilder.from(0);  
       searchSourceBuilder.size(topN);  
       // 获取用户行为数据  
       SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT, searchSourceBuilder);  
       SearchHits<UserBehavior> searchHits = searchResponse.getHits(UserBehavior.class);  
       // 计算相似度  
       List<String> recommendedItems = searchHits.getSearchHits().stream()  
               .map(hit -> hit.getSourceAsString("item_name"))  
               .collect(Collectors.toList());  
       return recommendedItems;  
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    1. 创建 UserBehavior 类
      创建一个表示用户行为的类,包括用户 ID、商品 ID、购买时间
    import java.util.Date;
    public class UserBehavior {  
       private String userId;  
       private String productId;  
       private Date purchaseTime;
       public UserBehavior(String userId, String productId, Date purchaseTime) {  
           this.userId = userId;  
           this.productId = productId;  
           this.purchaseTime = purchaseTime;  
       }
       // getter and setter methods
       @Override  
       public String toString() {  
           return "UserBehavior{" +  
                   "userId='" + userId + '\'' +  
                   ", productId='" + productId + '\'' +  
                   ", purchaseTime=" + purchaseTime +  
                   '}';  
       }  
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    五、ELK + 用户画像,用Python实现“千人千面”

    以下是一个简单的基于 ELK 和 Python 实现用户画像的示例:

    1. 安装所需库:
    pip install elasticsearch  
    pip install logstash  
    pip install kibana  
    pip install pandas  
    pip install scikit-learn  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 编写 Python 脚本,实现用户画像分析和推荐:
    import pandas as pd  
    import numpy as np  
    from sklearn.feature_extraction.text import TfidfVectorizer  
    from sklearn.metrics.pairwise import cosine_similarity  
    from elasticsearch import Elasticsearch
    # 连接 Elasticsearch  
    es = Elasticsearch([{'host': 'localhost', 'port': 9200}])
    # 设置索引和类型  
    index_name = 'user_behavior'  
    type_name = 'log'
    # 分析用户行为数据,提取特征  
    def analyze_user_behavior(user_id):  
       query = {  
           'query': {  
               'match': {'user_id': user_id}  
           }  
       }  
       user_behavior = es.search(index=index_name, type=type_name, body=query)  
       user_behavior_df = pd.DataFrame(user_behavior['hits']['hits'])  
       user_behavior_df.drop(['_source'], axis=1, inplace=True)  
       return user_behavior_df
    # 计算用户画像之间的相似度  
    def calculate_similarity(user1, user2):  
       user1_behavior = analyze_user_behavior(user1)  
       user2_behavior = analyze_user_behavior(user2)  
         
       # 使用 TF-IDF 计算特征向量  
       vectorizer = TfidfVectorizer()  
       user1_features = vectorizer.fit_transform(user1_behavior['item_name'])  
       user2_features = vectorizer.fit_transform(user2_behavior['item_name'])  
         
       # 计算相似度  
       similarity = cosine_similarity(user1_features, user2_features)  
       return similarity
    # 推荐物品  
    def recommend_items(user_id, top_n):  
       # 获取所有用户的行为数据  
       all_user_behavior = analyze_user_behavior('all')  
         
       # 计算所有用户与当前用户的相似度  
       all_user_similarity = calculate_similarity(user_id, 'all')  
         
       # 获取相似度最高的前 top_n 个用户  
       top_n_users = all_user_similarity.argsort()[-top_n:][::-1]  
         
       # 获取 top_n 个用户的行为数据  
       top_n_user_behavior = [analyze_user_behavior(user) for user in top_n_users]  
         
       # 计算 top_n 个用户购买的物品  
       top_n_items = pd.concat([top_n_user_behavior[i]['item_name'] for i in range(top_n)], axis=1)  
         
       # 返回 top_n 个推荐物品  
       return top_n_items.reset_index(drop=True)
    # 示例  
    user_id = 'user1'  
    top_n = 3  
    recommended_items = recommend_items(user_id, top_n)  
    print(f"给用户 {user_id} 推荐的前 {top_n} 个物品:{recommended_items}")  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58

    这个示例仅用于说明如何结合 ELK 和 Python 实现基于用户画像的个性化推荐。实际应用中需要根据具体需求和场景进行调整。另外,推荐算法也可以根据业务需求选择其他更复杂的算法,如基于内容的推荐、协同过滤、深度学习等。

  • 相关阅读:
    一文读懂RFID射频识别技术
    搜维尔科技:Movella Xsens用于动画,CG,短视频制作案例
    zynq qemu模拟器环境搭建
    sql语法复习
    【第8天】SQL进阶-更新记录(SQL 小虚竹)
    Promise对象和async/await
    Splashtop 荣获 TrustRadius 颁发的“2022年度最佳软件奖”
    元宇宙“吹鼓手”Unity:疯狂扩局,悬念犹存
    python + requests接口自动化测试框架(这一篇就完全足够了)
    langchain介绍之-Prompt
  • 原文地址:https://blog.csdn.net/superdangbo/article/details/133918933