本期视频登录后即可观看

ElasticSearch 搜索入门

5 集视频
1小时4分钟

本期Laravel视频教程我们结合Laravel视频教程一起学习Elasticsearch的基础知识,这是我第一次偷懒,因为我觉得官方视频的质量还是相当不错的,可以作为引导大家进入搜索世界大门的最佳教程,但是这不是我们的目标,我们的目标是自己实现对Elasticsearch的高级封装,结合之前我们学过的所有知识

张三丰 2019.08.04 17:35

ik中文分词插件安装了,docker容器重启了,但是系统还是把中文分为每一个中文汉字了, 根据百度搜索,修改默认分词器的代码:

PUT /users { "settings" : { "index" : { "analysis.analyzer.default.type": "ik_max_word" } } } 执行结果: { "error": { "root_cause": [ { "type": "resource_already_exists_exception", "reason": "index [users/lsmbG-YgQh2uXZL9Lwnbvw] already exists", "index_uuid": "lsmbG-YgQh2uXZL9Lwnbvw", "index": "users" } ], "type": "resource_already_exists_exception", "reason": "index [users/lsmbG-YgQh2uXZL9Lwnbvw] already exists", "index_uuid": "lsmbG-YgQh2uXZL9Lwnbvw", "index": "users" }, "status": 400 }

================ 该怎么解决这个问题呢?

张三丰 2019.08.04 17:39

ik 的github提供的设置方式: POST /users/_mapping {

"properties": {

"user_name": {

"type": "text",

"analyzer": "ik_max_word",

"search_analyzer": "ik_smart"

}

}

}

执行结果依然报错: { "error": { "root_cause": [ { "type": "illegal_argument_exception", "reason": "Mapper for [user_name] conflicts with existing mapping:\n[mapper [user_name] has different [analyzer]]" } ], "type": "illegal_argument_exception", "reason": "Mapper for [user_name] conflicts with existing mapping:\n[mapper [user_name] has different [analyzer]]" }, "status": 400 }

===============

我应该如何设置,使用ik分词器替代默认的分词器呢?

张三丰 2019.08.04 18:00

发现设置分词解析器的时候,必须在添加数据之前,如果索引已经有数据,设置会失败。

那么请问,针对已有数据的索引(例如:article),一开始使用的是默认分词器,现在想替换为Ik分词器有什么办法吗?

国营 2019.08.04 23:17

这个肯定要先添加分词器啊,因为提交数据就是交给es建索引的过程,建索引首先要分词,不使用中分的话他就会使用默认的分词器。对于已经有的索引,批量删了重新索引就行了,视频里介绍批量处理的方法了

张三丰 2019.08.05 17:04

IK中文分词插件,针对中文 词组 解析的比较好,但是如果查询单个汉字,是查询不到数据的。

我看了官方的issue,说是单个中文字,如果要创建索引,后台的负担会非常重,默认不支持单个字查询。

不知道有没有其他解决办法?

是否使用了ik中文分词插件,就无法查询单个中文字了呢?

国营 2019.08.05 22:21

你前边自己都把答案回复的很完美了,分词的意义就在于此,如果允许所有单字都建索引那就压根不需要分词了,也不是完全不能单字。不要纠结这个东西,分词的时候分词器是根据词典分的,词典也分种类,有的规模小,有的规模大,大部分项目都是选择规模小的,为的就是少建点儿索引,让搜索系统效率更高,节省计算资源,没必要太把搜索当回事,大部分项目中,它就起个辅助作用,不是主角

张三丰 2019.08.06 16:54

悲剧了,请允许我再提一个问题 1.我创建了索引,设置了location的type为 geo_point, (这个geo_point 可以随意定义?还是有什么依据和要求?我没搞明白这个相当于外键的类型,从哪里来的?) 2.我填充数据 demo数据 { "name":"儿童" , "tag":"家人", "remark":"带有外键的数据测试" , "location":{ "lat":100.123502, "lot":214.023145 } }

3.报错了: { "index" : { "_index" : "tb_mobile_asset", "_type" : "_doc", "_id" : "nEfUZ2wBrsE94XreyXgQ", "status" : 400, "error" : { "type" : "mapper_parsing_exception", "reason" : "failed to parse field [location] of type [geo_point]", "caused_by" : { "type" : "parse_exception", "reason" : "field must be either [lat], [lon] or [geohash]" } } } },

国营 2019.08.07 01:27

低级错误了,看来晚上熬夜精力确实容易眼花,原因提示的很清楚 "reason" : "field must be either [lat], [lon] or [geohash]" ,你的demo数据不对 “lot”肯定是不行的,得符合字段要求才行

爱laravel 2019.08.13 02:58

laravel分布式存储,像fastdfs的解决方案来一期视频

yang 2019.12.21 09:28

老哥 你那个 多刷新 几次 就进入 下雪那个页面了, 是 nginx 限流么, 还是 代码层面的, 在 laravel 中间件种 进行限制吗

国营 2019.12.21 10:13

代码限制,laravel文档中有这个东西

微信扫码登录