商城-商品搜索(Elasticsearch、IK分词器、Kibana使用)
1. Elasticsearch安装
本章节将采用Docker安装,不过在市面上还有很多采用linxu安装,关于linux安装,已经提供了安装手册,这里就不讲了。
(1)docker镜像下载
docker pull elasticsearch:5.6.8
查看已经安装好了,所以在此我不安装了
(2)安装es容器
docker run -di --name=changgou_elasticsearch -p 9200:9200 -p 9300:9300 elasticsearch:5.6.8
9200端口(Web管理平台端口) 9300(服务默认端口)
浏览器输入地址访问:http://192.168.2.132:9200/
(3)开启远程连接
上面完成安装后,es并不能正常使用,elasticsearch从5版本以后默认不开启远程连接,程序直接连接会报如下错误:
failed to load elasticsearch nodes : org.elasticsearch.client.transport.NoNodeAvailableException: None of the configured nodes are available: [{#transport#-1}{5ttLpMhkRjKLkvoY7ltUWg}{192.168.211.132}{192.168.211.132:9300}]
我们需要修改es配置开启远程连接,代码如下:
登录容器
docker exec -it changgou_elasticsearch /bin/bash
进入config目录
修改elasticsearch.yml配置
同时添加下面一行代码:
cluster.name: my-application
跨域配置
http.cors.enabled: true
http.cors.allow-origin: "*"
network.host: 192.168.2.132
其中:
http.cors.enabled: true:此步为允许elasticsearch跨域访问,默认是false。
http.cors.allow-origin: "*":表示跨域访问允许的域名地址(*表示任意)。
重启docker
docker restart changgou_elasticsearch
(4)系统参数配置
重启后发现重启启动失败了,这时什么原因呢?这与我们刚才修改的配置有关,因为elasticsearch在启动的时候会进行一些检查,比如最多打开的文件的个数以及虚拟内存区域数量等等,
如果你放开了此配置,意味着需要打开更多的文件以及虚拟内存,所以我们还需要系统调优
修改vi /etc/security/limits.conf ,追加内容 (nofile是单个进程允许打开的最大文件个数 soft nofile 是软限制 hard nofile是硬限制 )
* soft nofile 65536
* hard nofile 65536
修改vi /etc/sysctl.conf,追加内容 (限制一个进程可以拥有的VMA(虚拟内存区域)的数量)
vm.max_map_count=655360
执行下面命令 修改内核参数马上生效
sysctl -p
重新启动虚拟机,再次启动容器,发现已经可以启动并远程访问
reboot
小提示:如果想让容器开启重启,可以执行下面命令
docker update --restart=always 容器名称或者容器id
2. IK分词器安装
(1)安装ik分词器
IK分词器下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases
找到自己需要的版本5.6.8,下载
将ik分词器上传到服务器上,老师没讲,可以参考网上的步骤:https://www.cnblogs.com/dazhan/p/9371818.html,等项目做完了试下
查找所有容器
docker ps -a
找出我们想要的容器名字 ,查找容器长ID
docker inspect -f '{{.ID}}' XXXX
拷贝本地文件到容器
docker cp 本地路径 容器长ID:容器路径,请注意,两边路径都要加上文件名+文件后缀
docker cp /Users/xubowen/Desktop/auto-post-advance.py 07f22eb41bb5f34c56af95b9258e3228283cbf4b77d3041a750503b836e7f869:/root/auto-post-advance.py
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
查看已经拷贝好了
然后解压,并改名字为ik
将ik目录拷贝到docker容器的plugins目录下
(2)IK分词器测试
访问:http://192.168.2.132:9200/_analyze?analyzer=ik_smart&pretty=true&text=我是程序员
访问:http://192.168.2.132:9200/_analyze?analyzer=ik_max_word&pretty=true&text=我是程序员
补充知识:
ES可视化插件ES-HEAD也已经安装好了
但是我们打算换一个专业的工具
3. Kibana使用-掌握DSL语句
我们上面使用的是elasticsearch-head插件实现数据查找的,但是elasticsearch-head的功能比较单一,我们这里需要一个更专业的工具实现对日志的实时分析,也就是我们接下来要讲的kibana。
Kibana 是一款开源的数据分析和可视化平台,它是 Elastic Stack 成员之一,设计用于和 Elasticsearch 协作。您可以使用 Kibana 对 Elasticsearch 索引中的数据进行搜索、查看、交互操作。
您可以很方便的利用图表、表格及地图对数据进行多元化的分析和呈现。
Kibana 可以使大数据通俗易懂。它很简单,基于浏览器的界面便于您快速创建和分享动态数据仪表板来追踪 Elasticsearch 的实时数据变化。
搭建 Kibana 非常简单。您可以分分钟完成Kibana 的安装并开始探索 Elasticsearch 的索引数据 — 没有代码、不需要额外的基础设施。
Kibana下载安装
我们项目中不再使用linux,直接使用Docker,所有这里就不演示在windows的下载安装了。
(1)镜像下载
docker pull docker.io/kibana:5.6.8
为了节省时间,虚拟机中已经存在该版本的镜像了
(2)安装kibana容器
由于已经安装好了,所以我先停用,然后移除
//停用
docker stop kibana
//移除
docker rm kibana
执行如下命令,开始安装kibana容器
docker run -it -d -e ELASTICSEARCH_URL=http://192.168.2.132:9200 --name kibana --restart=always -p 5601:5601 kibana:5.6.8
ELASTICSEARCH_URL=http://192.168.2.132:9200:是指链接的ES地址
restart=always:每次服务都会重启,也就是开启启动
5601:5601:端口号
(3)访问测试
访问http://192.168.2.132:5601
如下:
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
DSL语句使用
Query DSL结构化查询介绍
Query DSL是一个Java开源框架用于构建类型安全的SQL查询语句。采用API代替传统的拼接字符串来构造查询语句。
目前Querydsl支持的平台包括JPA,JDO,SQL,Java Collections,RDF,Lucene,Hibernate Search。elasticsearch提供了一整套基于JSON的查询DSL语言来定义查询。
Query DSL当作是一系列的抽象的查询表达式树(AST)特定查询能够包含其它的查询,(如 bool ), 有些查询能够包含过滤器(如 constant_score),
还有的可以同时包含查询和过滤器 (如 filtered). 都能够从ES支持查询集合里面选择任意一个查询或者是从过滤器集合里面挑选出任意一个过滤器,
这样的话,我们就可以构造出任意复杂(maybe 非常有趣)的查询了。
索引操作
(1)查询所有索引
GET /_cat/indices?v
结果如下:
(2)删除某个索引
DELETE /userinfo
(3)新增索引
PUT /user
(4)创建映射
PUT /user/userinfo/_mapping
{"properties": {"name":{"type": "text","analyzer": "ik_smart","search_analyzer": "ik_smart","store": false},"city":{"type": "text","analyzer": "ik_smart","search_analyzer": "ik_smart","store": false},"age":{"type": "long","store": false},"description":{"type": "text","analyzer": "ik_smart","search_analyzer": "ik_smart","store": false}}
}
(5)新增文档数据
PUT /user/userinfo/1
{"name":"李四","age":22,"city":"深圳","description":"李四来自湖北武汉!"
}
我们再增加3条记录:
#新增文档数据 id=2
PUT /user/userinfo/2
{"name":"王五","age":35,"city":"深圳","description":"王五家住在深圳!"
}#新增文档数据 id=3
PUT /user/userinfo/3
{"name":"张三","age":19,"city":"深圳","description":"在深圳打工,来自湖北武汉"
}#新增文档数据 id=4
PUT /user/userinfo/4
{"name":"张三丰","age":66,"city":"武汉","description":"在武汉读书,家在武汉!"
}#新增文档数据 id=5
PUT /user/userinfo/5
{"name":"赵子龙","age":77,"city":"广州","description":"赵子龙来自深圳宝安,但是在广州工作!","address":"广东省茂名市"
}#新增文档数据 id=6
PUT /user/userinfo/6
{"name":"赵毅","age":55,"city":"广州","description":"赵毅来自广州白云区,从事电子商务8年!"
}#新增文档数据 id=7
PUT /user/userinfo/7
{"name":"赵哈哈","age":57,"city":"武汉","description":"武汉赵哈哈,在深圳打工已有半年了,月薪7500!"
}
(6)修改数据
a.替换操作
更新数据可以使用之前的增加操作,这种操作会将整个数据替换掉,代码如下:
#更新数据,id=4
PUT /user/userinfo/4
{"name":"张三丰","description":"在武汉读书,家在武汉!在深圳工作!"
}
使用GET命令查看:
#根据ID查询
GET /user/userinfo/4
b.更新操作
我们先使用下面命令恢复数据:
#恢复文档数据 id=4
PUT /user/userinfo/4
{"name":"张三丰","age":66,"city":"武汉","description":"在武汉读书,家在武汉!"
}
使用POST更新某个列的数据
#使用POST更新某个域的数据
POST /user/userinfo/4/_update
{"doc":{"name":"张三丰","description":"在武汉读书,家在武汉!在深圳工作!"}
}
使用GET命令查看:
#根据ID查询
GET /user/userinfo/4
(7)删除Document
#删除数据
DELETE user/userinfo/7
数据查询
(1)查询所有数据
(2)根据ID查询
#根据ID查询
GET /user/userinfo/2
(3)Sort排序
#搜索排序
GET /user/_search
{"query":{"match_all": {}},"sort":{"age":{"order":"desc"}}
}
(4)分页
#分页实现
GET /user/_search
{"query":{"match_all": {}},"sort":{"age":{"order":"desc"}},"from": 0,"size": 2
}
解释:
from:从下N的记录开始查询
size:每页显示条数
过滤查询
(1)term过滤
term主要用于分词精确匹配,如字符串、数值、日期等(不适合情况:1.列中除英文字符外有其它值 2.字符串值中有冒号或中文 3.系统自带属性如_version)
#过滤查询-term
GET _search
{"query":{"term":{"city":"武汉"}}
}
(2)terms 过滤
terms 跟 term 有点类似,但 terms 允许指定多个匹配条件。 如果某个字段指定了多个值,那么文档需要一起去做匹配 。
#过滤查询-terms 允许多个Term
GET _search
{"query":{"terms":{"city":["武汉","广州"]}}
}
(3) range 过滤
range过滤允许我们按照指定范围查找一批数据。例如我们查询年龄范围
#过滤-range 范围过滤
#gt表示> gte表示=>
#lt表示< lte表示<=
GET _search
{"query":{"range": {"age": {"gte": 30,"lte": 57}}}
}
(4)exists过滤
exists 过滤可以用于查找拥有某个域的数据
#过滤搜索 exists:是指包含某个域的数据检索
GET _search
{"query": {"exists":{"field":"address"}}
}
(5) bool 过滤
bool 过滤可以用来合并多个过滤条件查询结果的布尔逻辑,它包含一下操作符:
- must : 多个查询条件的完全匹配,相当于 and。
- must_not : 多个查询条件的相反匹配,相当于 not。
- should : 至少有一个查询条件匹配, 相当于 or。
这些参数可以分别继承一个过滤条件或者一个过滤条件的数组:
#过滤搜索 bool
#must : 多个查询条件的完全匹配,相当于 and。
#must_not : 多个查询条件的相反匹配,相当于 not。
#should : 至少有一个查询条件匹配, 相当于 or。
GET _search
{"query": {"bool": {"must": [{"term": {"city": {"value": "深圳"}}},{"range":{"age":{"gte":20,"lte":99}}}]}}
}
(6) match_all 查询
可以查询到所有文档,是没有查询条件下的默认语句。
#查询所有 match_all
GET _search
{"query": {"match_all": {}}
}
(7) match 查询
match查询是一个标准查询,不管你需要全文本查询还是精确查询基本上都要用到它。
如果你使用 match 查询一个全文本字段,它会在真正查询之前用分析器先分析match一下查询字符:
#字符串匹配
GET _search
{"query": {"match": {"description": "武汉"}}
}
(8)prefix 查询
以什么字符开头的,可以更简单地用 prefix ,例如查询所有以张开始的用户描述
#前缀匹配 prefix
GET _search
{"query": {"prefix": {"name": {"value": "赵"}}}
}
(9)multi_match 查询
multi_match查询允许你做match查询的基础上同时搜索多个字段,在多个字段中同时查一个
#多个域匹配搜索
GET _search
{"query": {"multi_match": {"query": "深圳","fields": ["city","description"]}}
}
完整DSL语句代码
#查看所有索引
GET /_cat/indices?v#删除某个索引
DELETE /skuinfo#新增索引
PUT /user#创建映射
PUT /user/userinfo/_mapping
{"properties": {"name":{"type": "text","analyzer": "ik_smart","search_analyzer": "ik_smart","store": false},"city":{"type": "text","analyzer": "ik_smart","search_analyzer": "ik_smart","store": false},"age":{"type": "long","store": false},"description":{"type": "text","analyzer": "ik_smart","search_analyzer": "ik_smart","store": false}}
}#新增文档数据 id=1
PUT /user/userinfo/1
{"name":"李四","age":22,"city":"深圳","description":"李四来自湖北武汉!"
}#新增文档数据 id=2
PUT /user/userinfo/2
{"name":"王五","age":35,"city":"深圳","description":"王五家住在深圳!"
}#新增文档数据 id=3
PUT /user/userinfo/3
{"name":"张三","age":19,"city":"深圳","description":"在深圳打工,来自湖北武汉"
}#新增文档数据 id=4
PUT /user/userinfo/4
{"name":"张三丰","age":66,"city":"武汉","description":"在武汉读书,家在武汉!"
}#新增文档数据 id=5
PUT /user/userinfo/5
{"name":"赵子龙","age":77,"city":"广州","description":"赵子龙来自深圳宝安,但是在广州工作!","address":"广东省茂名市"
}#新增文档数据 id=6
PUT /user/userinfo/6
{"name":"赵毅","age":55,"city":"广州","description":"赵毅来自广州白云区,从事电子商务8年!"
}#新增文档数据 id=7
PUT /user/userinfo/7
{"name":"赵哈哈","age":57,"city":"武汉","description":"武汉赵哈哈,在深圳打工已有半年了,月薪7500!"
}#更新数据,id=4
PUT /user/userinfo/4
{"name":"张三丰","description":"在武汉读书,家在武汉!在深圳工作!"
}#根据ID查询
GET /user/userinfo/4#恢复文档数据 id=4
PUT /user/userinfo/4
{"name":"张三丰","age":66,"city":"武汉","description":"在武汉读书,家在武汉!"
}#使用POST更新某个域的数据
POST /user/userinfo/4/_update
{"doc":{"name":"张三丰","description":"在武汉读书,家在武汉!在深圳工作!"}
}#根据ID查询
GET /user/userinfo/4#删除数据
DELETE user/userinfo/4#查询所有
GET /user/_search#根据ID查询
GET /user/userinfo/2#搜索排序
GET /user/_search
{"query":{"match_all": {}},"sort":{"age":{"order":"desc"}}
}#分页实现
GET /user/_search
{"query":{"match_all": {}},"sort":{"age":{"order":"desc"}},"from": 0,"size": 2
}#过滤查询-term
GET _search
{"query":{"term":{"city":"武汉"}}
}#过滤查询-terms 允许多个Term
GET _search
{"query":{"terms":{"city":["武汉","广州"]}}
}#过滤-range 范围过滤
#gt表示> gte表示=>
#lt表示< lte表示<=
GET _search
{"query":{"range": {"age": {"gte": 30,"lte": 57}}}
}#过滤搜索 exists:是指包含某个域的数据检索
GET _search
{"query": {"exists":{"field":"address"}}
}#过滤搜索 bool
#must : 多个查询条件的完全匹配,相当于 and。
#must_not : 多个查询条件的相反匹配,相当于 not。
#should : 至少有一个查询条件匹配, 相当于 or。
GET _search
{"query": {"bool": {"must": [{"term": {"city": {"value": "深圳"}}},{"range":{"age":{"gte":20,"lte":99}}}]}}
}#查询所有 match_all
GET _search
{"query": {"match_all": {}}
}#字符串匹配
GET _search
{"query": {"match": {"description": "武汉"}}
}#前缀匹配 prefix
GET _search
{"query": {"prefix": {"name": {"value": "赵"}}}
}#多个域匹配搜索
GET _search
{"query": {"multi_match": {"query": "深圳","fields": ["city","description"]}}
}
商城-商品搜索(Elasticsearch、IK分词器、Kibana使用)相关推荐
- ElasticSearch——IK分词器的下载及使用
ElasticSearch--IK分词器的下载及使用 1.什么是IK分词器 ElasticSearch 几种常用分词器如下: 分词器 分词方式 StandardAnalyzer 单字分词 CJKAna ...
- ElasticSearch IK 分词器快速上手
简介: ElasticSearch IK 分词器快速上手 一.安装 IK 分词器 1.分配伪终端 我的 ElasticSearch 是使用 Docker 安装的,所以先给容器分配一个伪终端.之后就可以 ...
- ElasticSearch ik分词器基础知识analyzer
概述 有两种analyzer,你根据自己的需要自己选吧,但是一般是选用ik_max_word 如果是ik_max_word的话: 会将文本做最细粒度的拆分,比如会将"中华人民共和国国歌&qu ...
- elastic ik分词搜索_php环境下使用elasticSearch+ik分词器进行全文搜索
php中文网最新课程 每日17点准时技术干货分享 首先需要说明的一点是,如果需要启用ik分词器,那么分词器的版本必须与es版本一致,即6.3.0的分词器需要同样6.3.0版本的es支持. 安装java ...
- ik分词器 mysql php_php环境下使用elasticSearch+ik分词器进行全文搜索
首先需要说明的一点是,如果需要启用ik分词器,那么分词器的版本必须与es版本一致,即6.3.0的分词器需要同样6.3.0版本的es支持. 安装java win-64bit的安装包需要去java英文官网 ...
- 狂神聊 ElasticSearch(IK分词器+Rest+集成SpringBoot+实战爬虫项目+完整代码及资料)
Bilibili 搜索关注:狂神说 Java(和狂神一起学习,共同进步) 公众号:狂神说(文章日更) 狂神聊 ElasticSearch 版本:ElasticSearch 7.6.1(全网最新了) 6 ...
- 电商项目商品搜索模块 - ESik分词器安装
2019独角兽企业重金招聘Python工程师标准>>> 洋鼹鼠-满足国人一切海外需求! 洋鼹鼠PC端搜索商品 com.ningpai.site.goods.controller.Go ...
- elasticsearch IK分词器的安装、使用与扩展
ES 的默认分词器(standard)不支持中文分词,满足不了平时的需求,所以需要用能够支持中文分词的 IK 分词器.而且 IK 分词器也是支持英文分词的. 本文介绍下IK分词器的安装.基本使用方法: ...
- ElasticSearch IK分词器安装
2019独角兽企业重金招聘Python工程师标准>>> Elasticsearch 默认是带分词器了,对英文是按固定的英文的空格,或者"-"进行分词,但是对中文分 ...
- 谷粒商城高级篇之ik分词器
分词器 ik分词器的地址:https://github.com/medcl/elasticsearch-analysis-ik 找到对应版本的分词器 cd /mydata/elasticsearch/ ...
最新文章
- 在吗?认识一下JWT(JSON Web Token) ?
- 机器学习、超参数、最优超参数、网格搜索、随机搜索、贝叶斯优化、Google Vizier、Adviser
- CouchDB 简单HTTP接口使用说明
- Vue.js 技术揭秘学习 (3) render
- Nginx(四)------nginx 负载均衡
- 怀旧服服务器怎么调整显卡性能,用顶级配置玩wow怀旧服是怎样的体验?
- Qt 串口类QSerialPort 使用笔记
- linux脚本语言求累加和,Linux Shell脚本语言与数学表达式
- 最近公司需要监测网络PING写了一个脚本
- HTML/CSS常用标签属性及样式
- JAVA发布栅格图层_基于 WebGL实现自定义栅格图层踩坑实录
- python动态运行py代码_Python 动态执行
- 物理学基石 —— 波、电磁波、微波
- Program Variant Scheduling job
- 梨花众创 - 微信支付宝收款二维码合并器
- mysql 中国省份城市数据库表
- CST软件基本操作 —2
- C语言编程-7_4 字符统计
- ACCV 2020 Mutual Guidance
- 机器学习-朴素贝叶斯(基础讲解+代码实现+图像展示)
热门文章
- python熊猫弹幕_GitHub - woaishui/danmu: Python 弹幕包 A live danmu package for python
- 《实时控制软件设计》第一次阅读笔记
- 二度云抢先成为首批工信部(.vip/.xyz/.club)域名注册管理机构
- 吉林大学软件学院——UML作业1
- 秋天到了,有哪些秋季必备的育儿小常识?
- Protege新手入门(基础篇)
- 基于机智云物联网平台的智能电梯管理系统
- 工程经济—成本与费用
- Blood闪烁特效制作
- Vue2.0之H5元素Audio属性currentTime、duration应用