ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
关系型数据库的缺点
- 无法打分
- 无分布式
- 无法解析搜索请求
- 效率低
- 无法分词
elasticsearch
安装elasticsearch
1.安装java jdk
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
2.安装elasticsearch
官网:http://www.elastic.co/products/elasticsearch
但是由于官网提供的elasticsearch带的插件不多,所以我们不使用这个。
我们使用elasticsearch-rtf:https://github.com/medcl/elasticsearch-rtf
3.运行
Mac/Linux:
cd elasticsearch/bin
./elasticsearch
sudo -u ops ES_JAVA_OPTS="-Xms2024m -Xmx2024m" ./bin/elasticsearch -d
Windows:
cd elasticsearch/bin
elasticsearch.bat
4.访问 127.0.0.1:9200
如果运行出现下面的错误:
Error occurred during initialization of VM
Could not reserve enough space for object heap
是由于内存空间不足,可以考虑更改默认内存的大小。用编辑器打开自己的elasticsearch路径\config\jvm.options
文件,可以看到
-Xms2g
-Xmx2g
改成512m即可
-Xms512m
-Xmx512m
保存之后,重新运行
安装elasticsearch-head插件,来可视化elasticsearch数据(相当于navicat)
Running with built in server
git clone git://github.com/mobz/elasticsearch-head.git
cd elasticsearch-head
npm install
npm run start
-
由于elasticsearch默认不允许第三方插件来连接,所以我们需要在elasticsearch-rtf目录中的elasticsearch.yml中修改配置,添加下面几行代码,注意:
之后有空格。
#
# Require explicit names when deleting indices:
#
#action.destructive_requires_name: true
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-methods: OPTIONS,HEAD,GET,POST,PUT,DELETE
http.cors.allow-headers: "X-Requested-With,Content-Type,Content-Length,X-User"
重启elasticsearch之后,查看 http://localhost:9100/,显示如下,即表示连接上了elasticsearch服务器
安装Kibana
kibana的版本必须要跟elasticsearch版本一致,可以通过127.0.0.1:9200查看elasticsearch的版本
进入kibana下载页面:http://www.elastic.co/downloads/kibana
下载完成后运行文件里面的命令,访问127.0.01:5601,进入Dev Tools下
我们将重点使用这个控制台来操作elasticsearch
elasticsearch概念
- 集群:一个或者多个节点组织在一起
- 节点:一个节点是集群中的一个服务器,由一个名字来标识,默认是一个随机的漫威角色的名字
- 分片:将索引划分为多份的能力,允许水平分割和扩展容量,多个分片响应请求,提供性能和吞吐量
- 副本:创建分片的一份或多份的能力,在一个节点失败,其他节点可以顶上
elasticsearch概念
elasticsearch | mysql |
---|---|
index(索引) | 数据库 |
type(类型) | 表 |
document(文档) | 行 |
fields | 列 |
倒排索引
倒排索引源于实际应用中需要根据属性的值来查找记录。这种索引表中的每一项都包含一个属性值和具有该属性值得各记录的地址。由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒叙索引(inverted index)。带有倒排索引的文件我们称为倒排索引文件,检查倒排文件(inverted file)。案例,对存储的数据进行分词。
例如:python写各大聊天系统的屏蔽脏话功能原理
关键词 | 文章 |
---|---|
python | 文章1,文章3 |
聊天 | 文章2 |
系统 | 文章3,文章4 |
屏蔽脏话 | 文章5 |
功能原理 | 文章6,文章7,文章8 |
关键词 | 文章 |
---|---|
python | 文章1,<2,10>,2 |
聊天 | 文章2,<12,25,100>,3 |
系统 | 文章3,<10>,1 |
屏蔽脏话 | 文章5,<50,60>,2 |
功能原理 | 文章6,<56,57,58>,3 |
倒排索引待解决的问题
- 大小写转换问题,如python和PYTHON应该为一个词
- 词干抽取,look和looking应该处理为一个词
- 分词,若屏蔽系统,应该分词为屏蔽,系统,还是应该是屏蔽系统
- 倒排索引文件过大-压缩编码
- tf-id的简单介绍
elasticsearch数据库的操作,包括增删改查
创建lagou索引
number_of_shards:分片的数量
number_of_replicas:备份的数量
运行,在head中就可以看到创建的索引库
我们也可以在head中自己添加索引
获取lagou中setting信息
GET lagou/_settings
获取所有索引下的setting信息
GET _all/_settings
或者
GET _settings
获取指定索引下的setting信息
GET .kibana,lagou/_settings
获取所有的索引信息
GET _all
更新数据
1.修改分片数量为2
PUT lagou/_settings
{
"number_of_replicas": 2
}
保存文档(type)到索引中去
PUT lagou/job/1
{
"title":"python",
"salary":15000,
"company":{
"name":"baidu",
"comapny_addr":"北京市软件园"
},
"publish_date":"2017-4-16",
"comments":15
}
lagou是索引,job是type,1是数据的id
其实我们也可以不用指明id,ES会自动生成
POST lagou/job/
{
"title":"Django",
"salary":30000,
"company":{
"name":"Meituan",
"comapny_addr":"杭州市西湖区"
},
"publish_date":"2017-4-16",
"comments":30
}
在head中查看数据
获取文档
GET lagou/job/1
获取文档中指定字段
GET lagou/job/1?_source=title,salary
修改文档
POST lagou/job/1/_update
{
"doc":{
"comments":20
}
}
删除
1.删除文档
DELETE lagou/job/1
2.删除索引
DELETE lagou
ES的批量操作
新建一个索引testdb,插入数据如下
1.一次性查询多条数据
GET _mget
{
"docs":[
{"_index":"testdb",
"_type":"job1",
"_id":1
},
{"_index":"testdb",
"_type":"job2",
"_id":2
}
]
}
GET testdb/job1/_mget
{
"ids":[1,2]
}
2.bulk 批量操作
批量导入可以合并多个操作,比如index,delete,update,create等等。也可以从一个索引导入到另一个索引中去。
一定是按照这种格式写,不要写成上面美化的格式
映射(mapping)
映射:当我们创建索引的时候,可以预先定义字段的类型以及相关属性
ES会根据JSON源数据的基础类型猜测你想要的字段映射。将输入的数据转变为可搜索的索引项。Mapping就是我们自己定义的字段的数据类型,同时告诉ES(即通过设置相关属性)如何索引数据以及可以被搜索。
作用:会让索引建立变的更加细致和完善
类型:静态映射和动态类型
内置类型
- string类型:text,keyword(string类型在es5开始已经废弃)
- 数字类型:long,interger,short,byte,double,float
- 日期类型:date
- bool类型:boolean
- binary类型:binary
- 复杂类型:object,nested
- geo类型:geo-point,geo-shape
- 专业类型:ip,competion
安装自己的要求创建索引
PUT lagoujob
{
"mappings": {
"job":{
"properties": {
"title":{
"type": "text",
"analyzer": "ik_max_word"
},
"salary":{
"type": "integer"
},
"city":{
"type": "keyword"
},
"company":{
"properties": {
"name":{
"type":"text"
},
"company_addr":{
"type":"text"
},
"employee_count":{
"type":"integer"
}
}
},
"pulish_date":{
"type": "date",
"format": "yyyy-MM-dd"
},
"comments":{
"type": "integer"
}
}
}
}
}
插入一条数据
PUT lagoujob/job/1
{
"title":"python",
"salary":15000,
"city":"BeiJing",
"company":{
"name":"baidu",
"comapny_addr":"北京市软件园",
"employee_count":50
},
"publish_date":"2017-4-16",
"comments":15
}