Elasticsearch 学习笔记Day 33

838 阅读5分钟

hi,我是蛋挞,一个初出茅庐的后端开发,希望可以和大家共同努力、共同进步!


开启掘金成长之旅!这是我参与「掘金日新计划 · 4 月更文挑战」的第 17 天,点击查看活动详情

  • 起始标记->电影搜索服务(3讲):「90 | 项目需求分析及架构设计」
  • 结尾标记->Elastic认证(5讲):「100 | 结课测试&结束语」

电影搜索服务

项目需求分析及架构设计

需求分析

  • IMDB: Movie DB
    • 搜索框,支持输入提示
    • 过滤器过滤结果,支持排序
    • 搜索结果的相关性排序

image.png

搜素类应用前端通用布局

image.png

后端通用需求

image.png

后端 UI

  • 自定义同义词(Matrix = 黑客帝国=矩阵革命)
  • 获取用户搜索统计数据
  • 调整字段的相关性权重

image.png

Elastic App Search 介绍

image.png

架构

image.png

安装与配置 Demo

image.png DEMO 中,使用 AppSearch 7.3.1和 Elasticsearch 7.3.1

将电影数据导入Elasticsearch

设置APP Search环境,准备数据,用来作为电影搜索的数据集。

如何设置一个APP Search

image.png 需要将allow_es_settings_modification 设置为true,即可开启 image.png 开启成功 image.png 选择引擎命名以及语言 image.png 可以通过点击View Documenttation 查看详细介绍 image.png

TMDB数据库

  • 创建于 2008 年,电影的 Meta Data 库
    • 46 万本电影/12万本电视剧/230万张图片/每周 20万次编辑
  • 提供 API。总共有超过20万开发人员和公司在使用

image.png 入库脚本 image.png image.png 程序运行结束,所有数据写入到APP Search当中 image.png image.png 可以查看相关的调用情况 image.png 点击Document可以查看写入的文档的信息 image.png

搭建你的电影搜索服务

Search UI

1682476091516.png

定制前端界面

image.png

其他的前端框架

image.png image.png

App Search 后台管理 - http://localhost:3002

  • 功能概览
    • 获取用户搜索相关的统计数据Analytics:
  • 管理
    • 文档/Schema/API日志
  • 搜索设定
    • 自定义同意词(Matrix = 黑客帝国 =矩阵革命)
    • 调整字段的相关性权重

可以修改索引的 image.png 设置同义词 image.png image.png 1682477280823.png 调整bosting的值 1682477310929.png 1682477330902.png

CodeDemo

安装配置
app-search.yml:
allow_es_settings_modification: true

#Allow Elasticsearch to create indexes automatically: Add the following line #within either Elasticsearch cluster settings or elasticsearch.yml:

action.auto_create_index: ".app-search-*-logs-*,-.app-search-*,+*"




准备数据,使用python 2.7
APP_SEARCH_NAME=tmdb APP_SEARCH_PWD=private-dtcda1pdruoq2hvwqe8rhz1x python ./ingest_tmdb_to_appserarch.py

# 使用最新版本的 node
nvm list
nvm use default

相关阅读

本节知识小节

介绍了电影搜索项目的基本需求,同时介绍了什么是APP Search,在接下来的项目中将会使用APP Search,快速的构建电影搜索项目。演示了如何简单的设置一个APP Search,它的安装和配置非常简单,只需要简单的下载,简单的加入一行配置到Yml文件当中,另外在安装的时候需要确保APP Search需要和Elasticsearch使用相同的版本号。同时通过程序到TMDB上抓取了一定的数据,通过调用APP Search API,往APP Search中写入数据集。调用APP Search的API 的时候需要拿到一个具有写权限的用户,通过一种方式调用python程序,最终才能把这个数据成功的写入APP Search当中。如果结合APP Search可以非常快的开发出一款搜索应用,APP Search不仅可以很快的生成前端的代码,还可以完成一些后台的相关性的调优,帮助控制搜索相关性的算分,还提供了一些监控方面的功能,帮助更好的去监控实际的转换率。

stackoverflow 用户调查问卷分析

需求分析及架构设计

2019 Stackoverflow Survery

image.pngimage.png insightsstackoverflow.com/survey/2019 image.png image.png image.pngimage.png

架构设计

image.png

  • File Input
  • CSV Filter
  • ES Output
  • Reindex
  • ingest Pipeline
  • Discovery
  • Visualization
  • Dashboard

数据Extract & Enrichment

image.png

构建Insights Dashboard

Dashboard

image.png image.png

CodeDemo

sudo bin/logstash -f ./logstash-stackoverflow-survey.conf


PUT final-stackoverflow-survey
{
  "mappings": {
    "dynamic_templates": [
      {
        "strings_as_keywords": {
          "match_mapping_type": "string",
          "mapping": {
            "type": "keyword"
          }
        }
      }
    ]
  },
  "settings": {
    "number_of_replicas": 0
  }
}



数字相关
YearsCode
WorkWeekHrs
Age
Age1stCode 16
YearsCodePro



PUT _ingest/pipeline/stackoverflow_pipeline
{
  "description": "Pipeline for stackoverflow survey",
  "processors": [
    {
      "split": {
        "field": "DatabaseDesireNextYear",
        "separator": ";"
      }
    },
    {
      "split": {
        "field": "DatabaseWorkedWith",
        "separator": ";"
      }
    },
    {
      "split": {
        "field": "DevEnviron",
        "separator": ";"
      }
    },
    {
      "split": {
        "field": "LanguageWorkedWith",
        "separator": ";"
      }
    },
    {
      "split": {
        "field": "MiscTechDesireNextYear",
        "separator": ";"
      }
    },
    {
      "split": {
        "field": "PlatformWorkedWith",
        "separator": ";"
      }
    },
    {
      "split": {
        "field": "PlatformDesireNextYear",
        "separator": ";"
      }
    },
    {
      "split": {
        "field": "WebFrameWorkedWith",
        "separator": ";"
      }
    },
    {
      "split": {
        "field": "WebFrameDesireNextYear",
        "separator": ";"
      }
    },
    {
      "split": {
        "field": "Containers",
        "separator": ";"
      }
    },
    {
      "script": {
        "source": """
          try{
	          ctx.YearsCode = Integer.parseInt(ctx.YearsCode);
          	}catch(Exception e){
          		ctx.YearsCode = 0;
          	}
"""
      }
    },
    {
      "script": {
        "source": """
          try{
	          ctx.WorkWeekHrs = Integer.parseInt(ctx.WorkWeekHrs);
          	}catch(Exception e){
          		ctx.WorkWeekHrs = 0;
          	}
"""
      }
    },
    {
      "script": {
        "source": """
          try{
	          ctx.Age = Integer.parseInt(ctx.Age);
          	}catch(Exception e){
          		ctx.Age = 0;
          	}
"""
      }
    },
    {
      "script": {
        "source": """
          try{
	          ctx.Age1stCode = Integer.parseInt(ctx.Age1stCode);
          	}catch(Exception e){
          		ctx.Age1stCode = 0;
          	}
"""
      }
    },
    {
      "script": {
        "source": """
          try{
	          ctx.YearsCodePro = Integer.parseInt(ctx.YearsCodePro);
          	}catch(Exception e){
          		ctx.YearsCodePro = 0;
          	}
"""
      }
    }
  ]
}



POST _reindex?wait_for_completion=false
{
  "source": {
    "index": "stackoverflow-survey-raw"
  },
  "dest": {
    "index": "final-stackoverflow-survey",
    "pipeline": "stackoverflow_pipeline"
  }
}

GET final-stackoverflow-survey/_mapping

相关阅读

本节知识小节

了解了用户调查问卷的背景,也知道从什么地方下载相关的内容,介绍了项目架构和设计,介绍了如何使用Logstash创建一个Pipline,把csv文件写入Elasticsearch,通过DyTemp的方式把所有字符串类型的字段做了合理映射,使他成为一个keyword类型,这样就可以对所有字符串类型的做一个aggregation,同时还通过创建Pipeline,把一些整型的字段合理转换,同时也把string字符串当中一些字符串通过分号分隔,变成字符串数组,方便我们对相关的属性进行termaggregation操作。演示了如何在Kinbana上创建一个markdown,可以针对不同的数据创建可视化报表。


此文章为4月Day17学习笔记,内容来源于极客时间《Elasticsearch 核心技术与实战》