写点什么

大数据 ELK(十):使用 VSCode 操作猎聘网职位搜索案例

作者:Lansonli
  • 2022 年 10 月 02 日
    广东
  • 本文字数:4965 字

    阅读完需:约 16 分钟

大数据ELK(十):使用VSCode操作猎聘网职位搜索案例

猎聘网职位搜索案例

一、需求


本次案例,要实现一个类似于猎聘网的案例,用户通过搜索相关的职位关键字,就可以搜索到相关的工作岗位。我们已经提前准备好了一些数据,这些数据是通过爬虫爬取的数据,这些数据存储在 CSV 文本文件中。我们需要基于这些数据建立索引,供用户搜索查询。

数据集介绍

二、创建索引

为了能够搜索职位数据,我们需要提前在 Elasticsearch 中创建索引,然后才能进行关键字的检索。这里先回顾下,我们在 MySQL 中创建表的过程。在 MySQL 中,如果我们要创建一个表,我们需要指定表的名字,指定表中有哪些列、列的类型是什么。同样,在 Elasticsearch 中,也可以使用类似的方式来定义索引。

1、创建带有映射的索引

Elasticsearch 中,我们可以使用 RESTful API(http 请求)来进行索引的各种操作。创建 MySQL 表的时候,我们使用 DDL 来描述表结构、字段、字段类型、约束等。在 Elasticsearch 中,我们使用 Elasticsearch 的 DSL 来定义——使用 JSON 来描述。例如:


PUT /my-index{    "mapping": {        "properties": {            "employee-id": {                "type": "keyword",                "index": false            }        }    }}
复制代码


2、字段的类型

在 Elasticsearch 中,每一个字段都有一个类型(type)。以下为 Elasticsearch 中可以使用的类型:


3、创建保存职位信息的索引

  1. 使用 PUT 发送 PUT 请求

  2. 索引名为 /job_idx

  3. 判断是使用 text、还是 keyword,主要就看是否需要分词



创建索引:


PUT /job_idx{    "mappings": {        "properties" : {            "area": { "type": "text", "store": true},            "exp": { "type": "text", "store": true},            "edu": { "type": "keyword", "store": true},            "salary": { "type": "keyword", "store": true},            "job_type": { "type": "keyword", "store": true},            "cmp": { "type": "text", "store": true},            "pv": { "type": "keyword", "store": true},            "title": { "type": "text", "store": true},            "jd": { "type": "text", "store": true}        }    }}
复制代码


4、查看索引映射

使用 GET 请求查看索引映射


// 查看索引映射GET /job_idx/_mapping
复制代码



使用 head 插件也可以查看到索引映射信息


5、查看 Elasticsearch 中的所有索引

GET _cat/indices 
复制代码


6、删除索引

delete /job_idx
复制代码



7、指定使用 IK 分词器

因为存放在索引库中的数据,是以中文的形式存储的。所以,为了有更好地分词效果,我们需要使用 IK 分词器来进行分词。这样,将来搜索的时候才会更准确。


PUT /job_idx{    "mappings": {        "properties" : {            "area": { "type": "text", "store": true, "analyzer": "ik_max_word"},            "exp": { "type": "text", "store": true, "analyzer": "ik_max_word"},            "edu": { "type": "keyword", "store": true},            "salary": { "type": "keyword", "store": true},            "job_type": { "type": "keyword", "store": true},            "cmp": { "type": "text", "store": true, "analyzer": "ik_max_word"},            "pv": { "type": "keyword", "store": true},            "title": { "type": "text", "store": true, "analyzer": "ik_max_word"},            "jd": { "type": "text", "store": true, "analyzer": "ik_max_word"}        }    }}
复制代码


三、添加一个职位数据

1、需求

我们现在有一条职位数据,需要添加到 Elasticsearch 中,后续还需要能够在 Elasticsearch 中搜索这些数据。


| 29097, 工作地区:深圳-南山区, 1 年经验, 大专以上, ¥ 6-8 千/月, 实习, 乐有家, 61.6 万人浏览过 / 14 人评价 / 113 人正在关注, 桃园 深大销售实习 岗前培训, 【薪酬待遇】 本科薪酬 7500 起 大专薪酬 6800 起 以上无业绩要求,同时享有业绩核算比例 55%~80% 人均月收入超 1.3 万 【岗位职责】 1.爱学习,有耐心: 通过公司系统化培训熟悉房地产基本业务及相关法律、金融知识,不功利服务客户,耐心为客户在房产交易中遇到的各类问题; 2.会聆听,会提问: 详细了解客户的核心诉求,精准匹配合适的产品信息,具备和用户良好的沟通能力,有团队协作意识和服务意识; 3.爱琢磨,善思考: 热衷于用户心理研究,善于从用户数据中提炼用户需求,利用个性化、精细化运营手段,提升用户体验。 【岗位要求】 1.18-26 周岁,自考大专以上学历; 2.具有良好的亲和力、理解能力、逻辑协调和沟通能力; 3.积极乐观开朗,为人诚实守信,工作积极主动,注重团队合作; 4.愿意服务于高端客户,并且通过与高端客户面对面沟通有意愿提升自己的综合能力; 5.愿意参加公益活动,具有爱心和感恩之心。 【培养路径】 1.上千堂课程;房产知识、营销知识、交易知识、法律法规、客户维护、目标管理、谈判技巧、心理学、经济学; 2.成长陪伴:一对一的师徒辅导 3.线上自主学习平台:乐有家学院,专业团队制作,每周大咖分享 4.储备及管理课堂: 干部训练营、月度/季度管理培训会 【晋升发展】 营销【精英】发展规划:A1 置业顾问-A6 资深置业专家 营销【管理】发展规划:(入职次月后就可竞聘) 置业顾问-置业经理-店长-营销副总经理-营销副总裁-营销总裁 内部【竞聘】公司职能岗位:如市场、渠道拓展中心、法务部、按揭经理等都是内部竞聘 【联系人】 小明主任 15888888888(微信同号) |


|:----|

2、PUT 请求

前面我们已经创建了索引。接下来,我们就可以往索引库中添加一些文档了。可以通过 PUT 请求直接完成该操作。在 Elasticsearch 中,每一个文档都有唯一的 ID。也是使用 JSON 格式来描述数据。例如:


PUT /customer/_doc/1{  "name": "John Doe"}
复制代码



如果在 customer 中,不存在 ID 为 1 的文档,Elasticsearch 会自动创建

3、添加职位信息请求

PUT /job_idx/_doc/29097{
"area": "深圳-南山区", "exp": "1年经验", "edu": "大专以上", "salary": "6-8千/月", "job_type": "实习", "cmp": "乐有家", "pv": "61.6万人浏览过 / 14人评价 / 113人正在关注", "title": "桃园 深大销售实习 岗前培训", "jd": "薪酬待遇】 本科薪酬7500起 大专薪酬6800起 以上无业绩要求,同时享有业绩核算比例55%~80% 人均月收入超1.3万 【岗位职责】 1.爱学习,有耐心: 通过公司系统化培训熟悉房地产基本业务及相关法律、金融知识,不功利服务客户,耐心为客户在房产交易中遇到的各类问题; 2.会聆听,会提问: 详细了解客户的核心诉求,精准匹配合适的产品信息,具备和用户良好的沟通能力,有团队协作意识和服务意识; 3.爱琢磨,善思考: 热衷于用户心理研究,善于从用户数据中提炼用户需求,利用个性化、精细化运营手段,提升用户体验。 【岗位要求】 1.18-26周岁,自考大专以上学历; 2.具有良好的亲和力、理解能力、逻辑协调和沟通能力; 3.积极乐观开朗,为人诚实守信,工作积极主动,注重团队合作; 4.愿意服务于高端客户,并且通过与高端客户面对面沟通有意愿提升自己的综合能力; 5.愿意参加公益活动,具有爱心和感恩之心。 【培养路径】 1.上千堂课程;房产知识、营销知识、交易知识、法律法规、客户维护、目标管理、谈判技巧、心理学、经济学; 2.成长陪伴:一对一的师徒辅导 3.线上自主学习平台:乐有家学院,专业团队制作,每周大咖分享 4.储备及管理课堂: 干部训练营、月度/季度管理培训会 【晋升发展】 营销【精英】发展规划:A1置业顾问-A6资深置业专家 营销【管理】发展规划:(入职次月后就可竞聘) 置业顾问-置业经理-店长-营销副总经理-营销副总裁-营销总裁 内部【竞聘】公司职能岗位:如市场、渠道拓展中心、法务部、按揭经理等都是内部竞聘 【联系人】 小明主任15888888888(微信同号)"}
复制代码


Elasticsearch 响应结果:


{    "_index": "job_idx",    "_type": "_doc",    "_id": "29097",    "_version": 1,    "result": "created",    "_shards": {        "total": 2,        "successful": 2,        "failed": 0    },    "_seq_no": 0,    "_primary_term": 1}
复制代码



使用 ES-head 插件浏览数据:


四、修改职位薪资

1、需求

因为公司招不来人,需要将原有的薪资 6-8 千/月,修改为 15-20 千/月

2、执行 update 操作

POST /job_idx/_update/29097{    "doc": {        "salary": "15-20k/月"    }}
复制代码

五、删除一个职位数据

1、需求

ID 为 29097 的职位,已经被取消。所以,我们需要在索引库中也删除该岗位。

2、DELETE 操作

DELETE /job_idx/_doc/29097
复制代码

六、批量导入 JSON 数据

1、bulk 导入

为了方便后面的测试,我们需要先提前导入一些测试数据到 ES 中。在资料文件夹中有一个 job_info.json 数据文件。我们可以使用 Elasticsearch 中自带的 bulk 接口来进行数据导入。


  1. 上传 JSON 数据文件到 Linux

  2. 执行导入命令


curl -H "Content-Type: application/json" -XPOST "node1:9200/job_idx/_bulk?pretty&refresh" --data-binary "@job_info.json"
复制代码

2、查看索引状态

GET _cat/indices?index=job_idx
复制代码


通过执行以上请求,Elasticsearch 返回数据如下:


[    {        "health": "green",        "status": "open",        "index": "job_idx",        "uuid": "LS0fkOS3SWGlOCp5u28yIA",        "pri": "1",        "rep": "1",        "docs.count": "6764",        "docs.deleted": "0",        "store.size": "23.2mb",        "pri.store.size": "11.6mb"    }]
复制代码


七、根据 ID 检索指定职位数据

1、需求

用户提交一个文档 ID,Elasticsearch 将 ID 对应的文档直接返回给用户。

2、实现

在 Elasticsearch 中,可以通过发送 GET 请求来实现文档的查询。



GET /job_idx/_search{    "query": {        "ids": {            "values": ["46313"]        }    }}
复制代码


八、根据关键字搜索数据

1、需求

搜索职位中带有「销售」关键字的职位

2、实现

检索 jd 中销售相关的岗位


GET  /job_idx/_search {    "query": {        "match": {            "jd": "销售"        }    }}
复制代码



除了检索职位描述字段以外,我们还需要检索 title 中包含销售相关的职位,所以,我们需要进行多字段的组合查询。


GET  /job_idx/_search{    "query": {        "multi_match": {            "query": "销售前期各项资料统筹亚马逊",            "fields": [                "title",                "jd"            ]        }    }}
复制代码


更多地查询:


官方地址:开始使用 Elasticsearch | Elastic Videos

九、根据关键字分页搜索

1、使用 from 和 size 来进行分页

在执行查询时,可以指定 from(从第几条数据开始查起)和 size(每页返回多少条)数据,就可以轻松完成分页。


from = (page – 1) * size


GET  /job_idx/_search{    "from": 0,    "size": 6,    "query": {        "multi_match": {            "query": "销售",            "fields": [                "title",                "jd"            ]        }}
复制代码


2、使用 scroll 方式进行分页

前面使用 from 和 size 方式,查询在 1W-5W 条数据以内都是 OK 的,但如果数据比较多的时候,会出现性能问题。Elasticsearch 做了一个限制,不允许查询的是 10000 条以后的数据。如果要查询 1W 条以后的数据,需要使用 Elasticsearch 中提供的 scroll 游标来查询。


在进行大量分页时,每次分页都需要将要查询的数据进行重新排序,这样非常浪费性能。使用 scroll 是将要用的数据一次性排序好,然后分批取出。性能要比 from + size 好得多。使用 scroll 查询后,排序后的数据会保持一定的时间,后续的分页查询都从该快照取数据即可。


1)第一次使用 scroll 分页查询


此处,我们让排序的数据保持 1 分钟,所以设置 scroll 为 1m


GET /job_idx/_search?scroll=1m{    "query": {        "multi_match": {        "query": "销售",        "fields": ["title", "jd"]        }    },    "size": 100}
复制代码



执行后,我们注意到,在响应结果中有一项:


"_scroll_id": "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAA0WUmQ4SjlTTGxSTldrSkt3dDg1eHRuQQ=="


后续,我们需要根据这个_scroll_id 来进行查询


2)第二次直接使用 scroll id 进行查询


GET _search/scroll?scroll=1m{    "scroll_id": "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAA4WUmQ4SjlTTGxSTldrSkt3dDg1eHRuQQ=="}
复制代码



字数: 8125 / 50000


发布于: 刚刚阅读数: 3
用户头像

Lansonli

关注

微信公众号:三帮大数据 2022.07.12 加入

CSDN大数据领域博客专家,华为云享专家、阿里云专家博主、腾云先锋(TDP)核心成员、51CTO专家博主,全网六万多粉丝,知名互联网公司大数据高级开发工程师

评论

发布
暂无评论
大数据ELK(十):使用VSCode操作猎聘网职位搜索案例_ELK_Lansonli_InfoQ写作社区