本期视频登录后即可观看
ElasticSearch 搜索入门
5 集视频
1小时4分钟
本期Laravel视频教程我们结合Laravel视频教程一起学习Elasticsearch的基础知识,这是我第一次偷懒,因为我觉得官方视频的质量还是相当不错的,可以作为引导大家进入搜索世界大门的最佳教程,但是这不是我们的目标,我们的目标是自己实现对Elasticsearch的高级封装,结合之前我们学过的所有知识
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 }
================ 该怎么解决这个问题呢?
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分词器替代默认的分词器呢?
发现设置分词解析器的时候,必须在添加数据之前,如果索引已经有数据,设置会失败。
那么请问,针对已有数据的索引(例如:article),一开始使用的是默认分词器,现在想替换为Ik分词器有什么办法吗?
这个肯定要先添加分词器啊,因为提交数据就是交给es建索引的过程,建索引首先要分词,不使用中分的话他就会使用默认的分词器。对于已经有的索引,批量删了重新索引就行了,视频里介绍批量处理的方法了
IK中文分词插件,针对中文 词组 解析的比较好,但是如果查询单个汉字,是查询不到数据的。
我看了官方的issue,说是单个中文字,如果要创建索引,后台的负担会非常重,默认不支持单个字查询。
不知道有没有其他解决办法?
是否使用了ik中文分词插件,就无法查询单个中文字了呢?
你前边自己都把答案回复的很完美了,分词的意义就在于此,如果允许所有单字都建索引那就压根不需要分词了,也不是完全不能单字。不要纠结这个东西,分词的时候分词器是根据词典分的,词典也分种类,有的规模小,有的规模大,大部分项目都是选择规模小的,为的就是少建点儿索引,让搜索系统效率更高,节省计算资源,没必要太把搜索当回事,大部分项目中,它就起个辅助作用,不是主角
悲剧了,请允许我再提一个问题 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]" } } } },
低级错误了,看来晚上熬夜精力确实容易眼花,原因提示的很清楚 "reason" : "field must be either [lat], [lon] or [geohash]" ,你的demo数据不对 “lot”肯定是不行的,得符合字段要求才行
laravel分布式存储,像fastdfs的解决方案来一期视频
老哥 你那个 多刷新 几次 就进入 下雪那个页面了, 是 nginx 限流么, 还是 代码层面的, 在 laravel 中间件种 进行限制吗
代码限制,laravel文档中有这个东西