1:本地安装es,解压,启动elasticsearch.bat
2:安装curl,配置环境变量,curl “http://localhost:9200/?pretty”
注意:windows命令行这里使用双引号,或者不加双引号
3:es交互:java语言使用es内置的客户端
其他语言使用RESTful API通过端口9200和es通信
4:es请求格式:curl -X<VERB> ‘<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>’ -d ‘<BODY>’
VERB:GET,PUT,POST等
PROTOCOL:http或者https
HOST:es集群中任意节点主机名,或者localhost代表本地机器上的节点
PORT:运行es http服务的端口号,默认9200
PATH:API的终端路径
QUERY_STRING:可选的查询字符串参数;例:-pretty将格式化输出json返回值
BODY:json格式的请求体
5:安装kibana,在本地浏览器访问http://localhost:5601(连接远程es需要在kibana.yml配置文件中修改elasticsearch.url),使用Develop Tools方便与es交互(Sense插件存在content type不支持的问题)
6:HTTP命令:
PUT:创建和更新文档
GET:检索文档
HEAD:检查文档是否存在(存在:200 - ok;不存在:404 not found)
DELETE:删除文档
(1)GET /index/type/_search 查询/index/type下所有信息,默认返回10条结果
(2)GET /index/type/_search?q=key:value 查询条件赋值给参数q(必须为q)
(3)GET /index/type/_search
{
“query” : {
“match” : {
“key” : “value”
}
}
} //使用查询表达式搜索,请求使用json构造
(4)GET /index/type/_search
{
"query" : {
"bool": {
"must": {
"match" : {
"last_name" : "smith" //match查询
}
},
"filter": {
"range" : {
"age" : { "gt" : 30 } //使用range过滤器(age>30)
}
}
}
}
}
(5)GET/index/type/_search
{
"query" : {
"match" : { //精确匹配使用:match_phrase
"key" : "value1 value2"
}
}
//高亮搜索:返回结果增加hightlight字段,包含匹配的key,value信息,使用html标签<em>
"highlight": {
"fields" : {
"about" : {}
}
}
}
//es搜索默认按照相关性得分排序(key中包含value1或者value2都能搜索出来)
查询匹配程度:区别于传统关系型数据库(一条记录要么匹配要么不匹配)
(6)GET /index/type/_search
{
"query": { //查找key1为value1的文档
"match": {
"key1": "value1"
}
},
"aggs" : { //聚合功能:基于数据做分析结果
"all_key2" : {
"terms" : { "field" : "key2" }, //对key2字段的value统计分析
"aggs" : {
//对统计后key2的每一个value的集合,求对应key3的平均值
"avg_age" : {
"avg" : { "field" : "key3" }
}
}
}
},
"sort": [
{ "date": { "order": "desc" }},
{ "_score": { "order": "desc" }}
] //按照date和_score排序(多级排序)
}
出现问题:
(1)未设置index的mapping时,第一次向索引中添加文档,会生默认成对应字段的类型信息;
(2)对某个字段排序或者聚合查询时,需要将key的value加载到内存提高查询速度,这个时候,字段的fileddata属性应该设置为true,而默认生成的mapping没有添加这个属性;
(3)解决办法:
PUT /index/_mapping/type?update_all_types
{
"properties": {
"key": {
"type": "text",
"fielddata": true
}
}
}
es的mapping支持创建,删除,增加字段,但不支持字段类型的修改;因此使用es时,需要提前创建好所有字段的mapping
(4)设置mapping示例:
curl -XPOST
"http://ip:port/index/type/_mapping?pretty" -d '
{
"_source":{"enabled":true},
"properties":{
"rtx":{
"type":"string",
"index":"not_analyzed",
"store":"true"
},
"timeStamp":{
"type":"date",
"format":"yyyy-MM-dd HH:mm:ss",
"index":"not_analyzed",
"store":"true"
},
"params":{
"type":"text",
"analyzer":"ik_smart"
}
}
}'
7:es集群原理:
(1)一个或多个节点共同承担数据和负载的压力;
(2)当有节点从集群添加或者移除,集群将会重新平均分布所有数据;
(3)主节点负责管理集群范围内所有变更,如节点,索引的添加删除;不涉及文档级别变更和搜索;
(4)用户可以将请求发送到集群中任何一个节点,每个节点都知道任意文档所处的位置;
8:GET /_cluster/health获取集群健康信息;
返回结果中的status字段:
(1)green:所有主分片和副本分片都正常运行
(2)yellow:所有主分片正常运行,副本分片存在不正常运行
(3)red:有主分片没能正常运行
9: (1)取回一个文档:GET /index/type/id?pretty
pretty参数使json响应体更加可读
(2)返回文档一部分:GET /index/type/id?_source=key1,key2
(3)检查文档是否存在:curl -i -XHEAD http://localhost:9200/website/blog/123
(仅仅代表检查的时候不存在)
(4)GET /_mget
{
"docs" : [
{
"_index" : "website",
"_type" : "blog",
"_id" : 2
},
{
"_index" : "website",
"_type" : "pageviews",
"_id" : 1,
"_source": "views"
}
]
} //取回多个文档
(5)POST /_bulk
{ "delete": { "_index": "website", "_type": "blog", "_id": "123" }}
{ "create": { "_index": "website", "_type": "blog", "_id": "123" }}
{ "title": "My first blog post" }
{ "index": { "_index": "website", "_type": "blog" }}
{ "title": "My second blog post" }
{ "update": { "_index": "website", "_type": "blog", "_id": "123", "retry_on_conflict" : 3} }
{ "doc" : {"title" : "My updated blog post"} }
//代价较小的批量操作
10:路由一个文档到一个分片中:
shard = hash(routing) % number_of_primary_shards
routing:可变值,默认时文档id
number_of_primary_shards:主分片的数量
11:新建,索引和删除单个文档
12:es搜索的三个概念:
映射(Mapping):描述数据在每个字段内如何存储
分析(Analysis):全文是如何处理使之可以被搜索
(1)字符串按顺序通过每个字符过滤器(去掉HTML或者转换&)
(2)字符串被分词器分为单个词条(遇到空格,标点等可能拆分成词条)
(3)词条按顺序通过每个token过滤器(小写化,删除无用词,增加词条)
领域特定查询语言(Query DSL):es强大灵活的查询语言:
13:es6.0之后
(1)不允许一个index下面有多个type
(2)字段类型使用text代替string
(3)字段index属性使用true false代替analyzed和not_analyzed
14:es分页:GET /_search?size=5&from=10
size:显示应该返回的结果数量,默认是10;
from:显示应该跳过的初始结果数量,默认是0
分布式系统深度分页存在问题:请求第10000页,结果从10001到10010,每个分片不得不产生前10010个结果外,协调节点对全部50050个结果排序最后丢弃掉这些结果中的50040个结果
15:内部对象如何被索引: