Elasticsearch3 git补充, es基本查询, es 组合查询, mapping介绍, ik分词, term和match的区别
git补充
# 1 你们公司用的github,码云,还是gitlab? # 2 公司用github? # 3 协同开发,要上远程仓库(github,码云,还是gitlab) # 4 中小型公司,放到码云上,公司没有实力搭一个gitlab,相关技术人员,自己没有服务器 # 5 你们公司,写了一个价值1千万的项目,那把它放到码云上,公司放心吗?第三方 # 6 自己搭git仓库,gitlab,免费开源的git仓库,公司自己服务器, # 7 刚开始用svn,用git,bitbucket,一个仓库不能超过2g,ios那边 # 8 禅道,自己自有的,协同管理平台 # 9 你写好代码,提到git上,新员工,公司1kw的项目,敢不敢信任你的代码,有人去给你看, # 10 项目已经写好了,测试人测出bug来了,在协同管理平台提交bug,----》上级领导---》看到它提的bug----》转给你----》最显眼的位置,---》正在解决(变绿)---》点已解决---》测试那看到了---》 # 11 你在开发中,遇到冲突怎么办? -两种情况会出现冲突: -多个人在同一个分支上开发,两个人改了同一行代码,先提交的人没问题,后提交的会出冲突 -合并分支的时候出现冲突 # 12 pycharm实操冲突及解决(大部分都不用命令,pycharm点点点) 用两个账号,这两个问题都重现一下(在码云上) # 你的代码多久提交一次---》一个功能写完了,测着没问题提交一下,都个人用同一个分支开发,你要时不时的pull---》
# 1 排序 GET lqz/doc/_search { "query": { "match": { "from": "gu" } }, "sort": [ { "age": { "order": "desc" } } ] } # 升序 GET lqz/doc/_search { "query": { "match": { "from": "gu" } }, "sort": [ { "age": { "order": "asc" } } ] } # 并不是所有类型都支持排序(只允许数字类型做排序) GET lqz/doc/_search { "query": { "match": { "from": "gu" } }, "sort": [ { "name": { "order": "asc" } } ] }
# match和match_all的区别? mach表示要查询,根据字段查,match_all查所有 GET lqz/doc/_search { "query": { "match_all": {} } } #2 分页 GET lqz/doc/_search { "query": { "match_all": {} }, "sort": [ { "age": { "order": "desc" } } ], "from": 2, "size": 1 } # "from": 2,代表从第二条开始, 取一条"size": 1 # 有了这个查询,如何分页? 一页有10条数据 第一页: "from": 0, "size": 10 第二页: "from": 10, "size": 10 第三页: "from": 20, "size": 10
# 多个条件,and ,or ,not # 对到es中就是布尔查询,must,should,must_not,filter # 1 组合查询之must # 查询form gu和age=30的数据 与的关系 GET lqz/doc/_search { "query": { "bool": { "must": [ { "match": { "from": "gu" } }, { "match": { "age": "30" } } ] } } } # 查询form gu数据() GET lqz/doc/_search { "query": { "bool": { "must": [ { "match": { "from": "gu" } } ] } } } # 同上 GET lqz/doc/_search { "query": { "match": { "from": "gu" } } } # 2 组合查询之should,或者的条件 GET lqz/doc/_search { "query": { "bool": { "should": [ { "match": { "from": "gu" } }, { "match": { "tags": "闭月" } } ] } } } # 3 组合查询之must_not 取反 都不符合 GET lqz/doc/_search { "query": { "bool": { "must_not": [ { "match": { "from": "gu" } }, { "match": { "tags": "可爱" } }, { "match": { "age": 18 } } ] } } } # `filter`条件过滤查询,过滤条件的范围用`range`表示,`gt`表示大于,大于多少呢 # gt:大于 lt:小于 gte:大于等于 lte:小于等于 GET lqz/doc/_search { "query": { "bool": { "must": [ { "match": { "from": "gu" } } ], "filter": { "range": { "age": { "gt": 25 } } } } } } # 查询年龄小于等于18的所有数据 GET lqz/doc/_search { "query": { "bool": { "filter": { "range": { "age": { "lte": 18 } } } } } }
# 2 对结果进行过滤,类似于如下 select * from user; select name,age from user; # 对应到es的查询 GET lqz/doc/_search { "query": { "match": { "name": "顾老二" } }, "_source": ["name", "age"] }
# 3 结果高亮显示(默认情况) 默认情况加<em>变为斜体 得到<em>石</em><em>头</em> GET lqz/doc/_search { "query": { "match": { "name": "石头" } }, "highlight": { "fields": { "name": {} } } } # 定制高亮显示的样式 <b class='key' style='color:red'>gu</b> GET lqz/doc/_search { "query": { "match": { "from": "gu" } }, "highlight": { "pre_tags": "<b class='key' style='color:red'>", # 前面的标签 <em> "post_tags": "</b>", # 后面的标签 </em> "fields": { "from": {} } } } # 总结: 混合开发,你知道怎么处理 前后端分离,你怎么处理?<b class='key' style='color:red'>串直接以josn格式返回,前端自行渲染 # 用的最多就是match+布尔+高亮+分页
# 聚合查询 # 1 聚合查询之avg select max(age) as my_avg from user; # 相当于这句 GET lqz/doc/_search { "query": { "match": { "from": "gu" } }, "aggs": { "my_avg": { # 自己命名字段 "avg": { # avg方法 "field": "age" } } }, "_source": ["name", "age"] # 显示字段 } # 2 聚合查询之max,size=0表示不取数据,只要max的结果 GET lqz/doc/_search { "query": { "match": { "from": "gu" } }, "aggs": { "my_max": { "max": { "field": "age" } } }, "size": 0 } # 3 聚合之min GET lqz/doc/_search { "query": { "match": { "from": "gu" } }, "aggs": { "my_min": { "min": { "field": "age" } } }, "size": 0 } # 4 聚合查询之sum GET lqz/doc/_search { "query": { "match": { "from": "gu" } }, "aggs": { "my_sum": { "sum": { "field": "age" } } }, "size": 0 } # 5 聚合之分组 下方代码分组统计个数 GET lqz/doc/_search { "size": 0, "query": { "match_all": {} }, "aggs": { "age_group": { "range": { "field": "age", "ranges": [ { "from": 15, "to": 20 }, { "from": 20, "to": 25 }, { "from": 25, "to": 30 } ] } } } }
# 查看索引信息---》mapping字典---》映射(类型,表类型,表结构) GET lqz # 6.x以后一个索引只能有一个映射类型(只能有一个表) # 创建映射(如果不设置,加入数据会有一套默认的) # 创建索引,并设置映射 PUT books # 先安装ik分词器 { "mappings": { "properties":{ "title":{ "type":"text", "analyzer": "ik_max_word" # text类型可以指定分词max_word还是smart 配置中文分词器 }, "price":{ "type":"integer" }, "addr":{ "type":"keyword" }, "company":{ # 对象类型 "properties":{ "name":{"type":"text"}, "company_addr":{"type":"text"}, "employee_count":{"type":"integer"} } }, "publish_date":{"type":"date","format":"yyy-MM-dd"} } } } # 插入测试数据 PUT books/_doc/1 { "title":"大头儿子小偷爸爸", "price":100, "addr":"北京天安门", "company":{ "name":"我爱北京天安门", "company_addr":"我的家在东北松花江傻姑娘", "employee_count":10 }, "publish_date":"2019-08-19" } PUT books/_doc/2 { "title":"白雪公主和十个小矮人", "price":"99", "addr":"黑暗森里", "company":{ "name":"我的家乡在上海", "company_addr":"朋友一生一起走", "employee_count":10 }, "publish_date":"2018-05-19" } # 执行以下代码,会多出age字段,以为没有设置映射,会默认为long类型 PUT books/_doc/3 { "title":"白雪公主和十个小矮人", "price":"99", "addr":"黑暗森里", "age":18 } # 查看映射 GET books GET books/_mapping # 映射是什么?映射有什么用? 规定了表结构(不是强制的),规定了哪个字段是可以用来全文检索,是否是数字类型,布尔类型 # mapping类型一旦确定,以后就不能修改了,但是可以插入字段
# 全文检索,有了映射,决定了我可以对某个字段做全文检索 # es默认分词对英文友好,使用中文分词器(es的插件),ik(作者,中国人,elasticsearch开源社区负责人) # 是es的一个插件(es如何安装插件) - 第一种:命令行(内置插件) bin/elasticsearch-plugin install analysis-smartcn 安装中文分词器 -第二种:url安装(第三方插件) # 下载处右键复制链接地址 bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.5.0/elasticsearch-analysis-ik-7.5.0.zip -第三种:手动安装(推荐用) -下载,解压到es的plugins路径下,重启es即可 # 不要套很多层,解压成文件夹,名字可改为analysis-ik,可不改 -注意:ik分词器跟es版本一定要对应 # 启动时会看到这一条,表示已安装 [2020-05-09T12:05:50,125][INFO ][o.e.p.PluginsService ] [LAPTOP-41G9JFOT] loaded plugin [analysis-ik] # 两种分词方式 # ik_smart:分词分的 # ik_max_word :分词分的多 # ik_smart分的词少,粒度大 (测试ik分词器安装是否成功) GET _analyze { "analyzer": "ik_smart", "text": "上海自来水来自海上" } # ik_max_word分的词多,粒度小 GET _analyze { "analyzer": "ik_max_word", "text": "上海自来水来自海上" } # 在创建映射的时候配置 # 以后你的操作: -文章标题:ik_max_word -文章内容:ik_smart -摘要 -作者 -创建时间 # 通过ik分词搜索标题 GET books/_doc/_search { "query":{ "match":{ "title":"白雪" } } } # 配置 IKAnalyzer.cfg.xml用来配置自定义的词库 surname.dic 中国姓氏 preposition.dic 中文停顿词(过滤用的)
# match:我们今天出去玩 ----》分词---》按分词去搜 #term:我们今天出去玩---》直接拿着[我们今天出去玩]--->去索引中查询 # 查不到内容,直接拿着 Python爬虫 去查,因为没有Python爬虫的索引,所以查不到。如果改成"title":"爬虫"可以收到有爬虫索引的。如果改成"title":"python"查不到东西 GET books/_search { "query":{ "term":{ "title":"Python爬虫" } } } # 能查到,而且带python的都查出来了 # Python 爬虫 分了词,分别拿着这两个词去查,带python关键字,带爬虫关键字都能查到 GET books/_search { "query":{ "match":{ "title":"Python爬虫" } } }