admin管理员组文章数量:1122866
搜索。。。
1、mysql的like具有局限性
# 体现在功能不全,性能低。不适用于全文搜索(日志或简历中搜索字段)、没有相关性搜索排名等等
select name from goods WHERE name LIKE "%苹果%"
2、试试elasticsearch 搜索
1、解决mysql like 的短板
2、它是分布式的
1)安装es和kibana
1、通过kibana 操作 es
2、通过docker安装elasticsearch,kibana
kibana安装时候的命令中 kibana的版本号要和es一致
3、安装好后就可以通过ip:port 访问 kibana
2) es 基本概念
1、7.x以后index 开始理解为table, type这个概念马上取消掉了,不管他就行了
2、schema 就是比如定义列的最大长度是什么类型,es里面叫它映射 mapping
3、索引一个数据就是mysql中的insert一个数据,把数据放进索引,就是mysql里的放进table
所以,索引有两个含义:动词(insert),名词(table)
4、操作起来就是resfulAPI,http的,1)添加数据用PUT 或者 POST (需要自己指定id,POST会自动生成id,PUT同样一条命令是更新,而POST同样一条命令,会再增加一行数据)2)获取数据GET 获取某一个数据 GET user/_source/13)搜索数据GET _search?q=xiaomingGET user/_search?q=xiaoming4) 通过request body查询index中所有GET user/_search{"query":{"match_all":{}}5)注意update数据用这种方式,POST user/_update/1{"doc":{"age":18}}不这样写容易覆盖6) DELETE /usr/_doc/2 # 删除一条#删除indexDELETE user7)批量操作数据(bulk), 批量获取(mget)
3)es全文查询
# 对于es来说 from和 size分页在数据量比较小的情况下可行,太大的话要用scroll
GET user/_search
{"query":{"match_all":{}},"from":4,"size":4
}query里面的查用到
复合查询,全文查询,术语查询
比如:搜住址里面的街道,注意大小写不敏感
模糊查询/匹配查询 match
match_phrase 精确查询 / 短语查询
1、我要搜Madison stree,结果必须两个分词都有,而且按顺序连着的
multi_match 查询
比如搜resume的时候,希望搜出来go语言的,但是不希望它出现want_learn那栏里的
这样搜索的时候指定title 和 desc里面出现的go语言
"multi_match":{"query":"go","fields":["title^2","desc"]}title^2 代表title里面查询出来的go权重高
query_string
"query_string":{"default_field":"address","query":"Madison OR street"
}
OR可以换成AND
4)term查询
1、term是不会分词的
小写+分词就是analyzer
存入倒排索引的时候会把大写全部改成小写,所以这时候term查Street就查不到
查street有
那为什么match能搜到呢?因为它在查询数据的时候也是和写入数据同样,
先分词,然后变成小写
2、term是原子查询,就是你写的是什么,它就搜什么
也正因此,如果你搜全是小写"madison street"还是搜不到,因为在倒排索引里
都已经分词了,没有原装的这两词
2> range查询
"range":{"age":{"gte":10, #大于等于 没有e就是没有等于"lte":20, #小于等于"boost":2.0 # 权重}
}
3> exists查询
# 查询出所有有age的数据
"exists":{"field":"age"
}
4> fuzzy 模糊查询
就是你搜golanl 搜索引擎也能知道你要搜 golang
"fuzzy":{"address":"streat"
}
依旧能搜索出来street,因为street和streat的编辑距离是1,很短
match也能做模糊查询
"match":{"address":{"query":"Midison","fuzziness":1 # 1表示开启模糊查询}
}
而直接用fuzzy不会进行分词
5)复合查询
就是用bool将其他查询语言拼凑起来
must表示里面的查询语句必须满足,和filter差不多,但是满足后会加分
should是满足与否无所谓,和不写的区别就是满足的话得分会高一些
must_not
filter 过滤,必须匹配
6)倒排索引
1、es底层存储数据使用的是倒排索引
2、英文的分词很简单,就是通过空格,并且都改成小写,防止后面搜索不到
3、6(1,0)分别代表 671出现在6号文档,出现过一次,在第0位
4、查询的时候,比如查Madison street,如果两个分词都符合得分最高,只符合一个的也会搜出来
5、写入和查询数据的时候都会分词
7)es Analyzer
1、写入数据----> es --analyzer–> 倒排索引
写入和搜索的时候都可以指定analyzer,search_analyzer
2、analyzer就是分词+大写变小写
3、搜索策略
如果写入和查询的时候你指明了analyzer,它们是互不影响的,否则按下图走
8)中文分词
1、词典匹配,比如词典里有没有中华牙膏,
2、基于统计
3、基于深度学习
4、用 IK 分词器
IK要和es的版本对应起来
直接将IK 放到es的外部挂载目录plugins里就行了
分词器之前就要设置好,否则后面不好改,因为之前的都是用原来的分词器分的,这部分数据怎么办?
5、扩展词库
将自己的专有名词加到词库中
在ik/config/ 下建自己的文件夹,里面建自己的mydic.dic 里面填入词汇,在 extra_stopword.dic中加入停用词
进入config vim IKAnalyzer.cfg.xml 将自己的加进去,使其生效
docker restart 容器id
本文标签: 搜索
版权声明:本文标题:搜索。。。 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1686609032a16604.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论