ElasticSearch使用
elasticearch是基于lucene开发的搜索引擎框架,适用于需要实时搜索功能的服务,它能够搭建集群,以及自身已经携带了分片功能(每一个片区都是一个lucene的倒排索引),能够更好的减少搜索的时间。
elasticsearch和solr的选择:
需要使用实时搜索的或者大数据时代,就选es,它可以比以前快50倍的速度!!!
反之可以选用solr。
es和mysql的对比(理解):
elasticsearch和mysql类似
索引库和数据库(database)类似
types(类型)和数据库表(tables)类似(7.x中过时了,8.x中将彻底废弃)
document(文档)和数据库中的每一条数据类似
安装
1.去官网下载压缩包,有各个版本的,下载完成解压即可:
2.目录结构:
3.配置文件:
因为es的端口是9200,其他的软件如果需要使用这个端口,就会出现跨域问题(在一个连接中,使用另一个不同ip不同端口的服务),需要配置:
在elasticsearch的conf目录中找到:elasticsearch.yml文件,在最下面添加
http.cors.enabled: true
http.cors.allow-origin: "*"
这两行配置,即可解决跨域问题。
4.启动elasticsearch:
双击即可。
运行完毕,在浏览器访问这个地址:
出现这个,就代表es安装完毕!
安装可视化界面
es本身只是一个服务,并没有一个可视化的界面,我们就需要安装一个插件:elasticsearch-head 来支持可视化。
1.下载:
在github上下载插件包,下载完毕,解压即可。
2.配置es-head环境:
es-head是由node.js支持开发的,如果我们想要运行es-head插件,就必须安装node.js.
安装node.js:
去官网下载,然后双击下一步傻瓜式安装即可。
安装完成,打开cmd,输入:node -v命令查看版本号,如果显示版本,代表node.js安装完毕。
安装完毕node.js,进入es-head的pom.xml目录下,在此处打开命令行,输入npm install,下载所需文件。
注:如果出现这个错误,那么现实的是哪一个,就下载哪一个即可解决。
npm install phantomjs-prebuilt@2.1.16 --ignore-scripts
你报错什么版本,就对应什么版本
运行es-head: 在pom.xml所在的目录下打开命令行,输入:
npm run start
即可启动es-head
y以上即安装了es还有可视化页面es-head
es索引操作
es采用的是restful风格的访问方式,来及行增删改查索引、文档的操作。
1.添加索引库(直接添加mappings)
PUT http://ip:port/索引库名称
JSON:
{
"mappings":{
"properties":{
"属性名(列名)":{
"type":"类型"
},
...
}
}
}
2.创建索引库(先创建,后添加mappings规定)
首先使用
PUT http://ip:端口/索引库名称
创建索引库,
在使用:
PUT http://ip:端口/索引库名称/_mapping
JSON:
{
"properties":{
"属性名"{
设置的规则
}
}
}
效果同第一种。
注:在es6.x中有type这个属性,类似于数据库中的一张表,但是在7.x中逐渐停用了这个,在8.x中就放弃了,在7.x之前要添加mapping的话,和这个方式就不一样了
以第一种方式为例:
PUT http://ip:端口/索引库名
JSON:
{
“mappings”:{
"type(表名)":{
"properties":{
"属性名":{
设置规则...
},
....
}
}
}
}
现在已经不用这种方式了
3.删除索引库
DELETE http://ip:端口号/索引库名称
即把整个的索引库删除掉
es文档操作
1.添加文档
POST http://ip:端口号/索引库/_doc/id
(此处的id表示你添加的文档的id,一般和你保存数据的id保持一致,
_doc:es7.x之后,默认types(表)为_doc,并且不建议再自定义)
Json:
{
"属性名":"属性值",
...
}
即可添加,这种的可以在没有索引库的情况下使用,他会自动的创建索引库,但是属性的类型只能靠es来猜。
2.修改文档
方式1(不推荐):直接覆盖
POST http://ip:端口号/索引库名称/_doc/你要修改的文档id
json:
{
"属性值":"要修改的值"
}
不推荐使用,因为当有一个属性没有从新赋值,那么它覆盖之前的时候,就会变为空。
方式2:推荐
POST http://ip:端口号/索引库名称/_doc/文档id/_update
json:
{
"doc":{
"属性名":"修改的值",
...
}
}
这种方式,写了那个属性,就修改哪一个,不写不修改。
3.删除文档: 和删除索引库操作类似,只不过需要加上id
DELETE http://ip:端口号/索引库/_doc/文档id
即可删除文档
重点*es的查询
1.简单查询
根据文档的id查询
GET http://ip:端口号/索引库/_doc/文档的id
结果:
根据条件查询(类似于mysql的模糊查询)
GET http://ip:端口号/索引库名/_doc/_search
JSON:
{
"query":{
"match":{
"查询字段":"值"
}
}
}
把不用的字段隐藏掉
过滤之后的结果:
就会把我们没有用到的tatil隐藏起来
对查询结果进行排序(也就是mysql中的order by,也可以对分数进行排序):
结果:
就会根据id进行降序排列(asc反之).
对查询的数据分页(相当于mysql的limit):
结果:
bool:boolean类型的,当文档满足了这些条件,才会被查询出来。
must(相当于and的意思):
should(相当于or的意思,多个条件只要满足一个,就会被查询):
结果:
must_not(相当于not,只要不满足这些条件的,就会被查询出来)
结果:
filter(过滤条件): 可以使用这个里面的range 获得范围内的数据: gt:大于 gte:大于等于 lt:小于 lte:小于等于
当我们要对一个属性中的值,给多个条件时,就可以使用空格分割:
例如:
名字中包含‘’张""李"的,这时候就可以使用了
高亮显示查询:
对结果中的关键字,进行高亮显示。
我们还可以自定义标签内容
这样我们就可以按照需求,让关键字高亮的显示了。
属性(域)中的type的参数:text和keyword的区别
text默认是可以被分词器解析,而keyword则不能被分词器解析,只能作为一个整体来查询。
term为关键词查询,他所查询的时候,是直接拿着查询数据,去找倒排索引中的分词之后的词典(索引)中查找,而不会先把搜索条件分词在查找。
例如我们使用默认分词器(standard)分存储了张三的文档,那么倒排索引中所存方的就是’张’,‘三’,如果使用term查询’张三’这个词,是查不到数据的,因为词典(索引)中没有张三的这个词,只有‘张’,‘三’。
如果我们使用ik分词器,把张三作为整个词存放到文档中,这个时候直接使用term搜索’张三’是可以查到的,但是单个的查找’张’,‘三’,是查找不到,因为里面就没有这两个的词。
match是代表的模糊查询,只要包含,就能查出来,但是需要keyword表示的字段时,也不会查找出来,因为keyword是没有被分词的。