elasticsearch从安装到入门

[b]安装jdk之后[/b]
es下载: https://www.elastic.co/downloads/elasticsearch
解压 /usr/local/elasticsearch/es-5.1.2
运行./bin/elasticsearch 即可
异常:
Caused by: java.lang.RuntimeException: can not run elasticsearch as root
解决
创建elsearch用户组及elsearch用户
# groupadd elsearch
# useradd es -g elsearch -p zookeeper123

更改elasticsearch文件夹及内部文件的所属用户及组为 elsearch:es
cd /usr/local/
chown -R es:elsearch elasticsearch

切换到elsearch用户再启动
su - es
cd /usr/local/elasticsearch/es-5.1.2
./bin/elasticsearch
后台启动 + -d

异常:
java.lang.UnsupportedOperationException: seccomp unavailable: CONFIG_SECCOMP not compiled into kernel, CONFIG_SECCOMP and CONFIG_SECCOMP_FILTER are needed
elasticsearch-5.0.1 只支持内核3.5以上版本的linux操作系统
centos6.5报错

验证安装
再命令行执行
curl 'http://localhost:9200/?pretty'
出现结果
{
"name" : "kGsFjdu",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "6K-D_etVQ_GAvgsGUNhRfA",
"version" : {
"number" : "5.1.2",
"build_hash" : "c8c4c16",
"build_date" : "2017-01-11T20:18:39.146Z",
"build_snapshot" : false,
"lucene_version" : "6.3.0"
},
"tagline" : "You Know, for Search"
}
表示结果正常

[b]es使用[/b]
在megacorp索引中给employee类型增加一条记录id为1
curl -XPUT 'http://localhost:9200/megacorp/employee/1' -d'
{
"first_name" : "John",
"last_name" : "Smith",
"age" : 25,
"about" : "I love to go rock climbing",
"interests": [ "sports", "music" ]
}';
curl -XPUT 'http://localhost:9200/megacorp/employee/2' -d'
{
"first_name" : "Jane",
"last_name" : "Smith",
"age" : 32,
"about" : "I like to collect rock albums",
"interests": [ "music" ]
}';
curl -XPUT 'http://localhost:9200/megacorp/employee/3' -d'
{
"first_name" : "Douglas",
"last_name" : "Fir",
"age" : 35,
"about": "I like to build cabinets",
"interests": [ "forestry" ]
}';

查询megacorp索引下employee类型id为1的记录
curl -XGET 'http://localhost:9200/megacorp/employee/1'
查询所有信息
curl -XGET 'http://localhost:9200/megacorp/employee/_search'
简单条件查询
curl -XGET 'http://localhost:9200/megacorp/employee/_search?q=last_name:Smith'
match 查询法
curl -XGET 'http://localhost:9200/megacorp/employee/_search' -d'
{
"query" : {
"match" : {
"last_name" : "Smith"
}
}
}'
结构化搜索的限定条件 filter(过滤器):
{
"query" : {
"filtered" : {
"filter" : {
"range" : {
"age" : { "gt" : 30 } <1>
}
},
"query" : {
"match" : {
"last_name" : "Smith" <2>
}
}
}
}
}

下面2种的区别是 第一种是分词之后匹配 第二种是全词匹配
{
"query" : {
"match" : {
"about" : "rock climbing"
}
}
}

{
"query" : {
"match_phrase" : {
"about" : "rock climbing"
}
}
}
高亮搜索
{
"query" : {
"match_phrase" : {
"about" : "rock climbing"
}
},
"highlight": {
"fields" : {
"about" : {}
}
}
}

分组统计
1.统计每个兴趣爱好有几个人
{
"aggs": {
"all_interests": {
"terms": { "field": "interests" }
}
}
}
结果
{
...
"hits": { ... },
"aggregations": {
"all_interests": {
"buckets": [
{
"key": "music",
"doc_count": 2
},
{
"key": "forestry",
"doc_count": 1
},
{
"key": "sports",
"doc_count": 1
}
]
}
}
}
2.查询结果再分组
{
"query": {
"match": {
"last_name": "smith"
}
},
"aggs": {
"all_interests": {
"terms": {
"field": "interests"
}
}
}
}
结果
...
"all_interests": {
"buckets": [
{
"key": "music",
"doc_count": 2
},
{
"key": "sports",
"doc_count": 1
}
]
}
3.分组之后再统计 select avg(age),interests from employee where ... group by interests
{
"aggs" : {
"all_interests" : {
"terms" : { "field" : "interests" },
"aggs" : {
"avg_age" : {
"avg" : { "field" : "age" }
}
}
}
}
}
结果
...
"all_interests": {
"buckets": [
{
"key": "music",
"doc_count": 2,
"avg_age": {
"value": 28.5
}
},
{
"key": "forestry",
"doc_count": 1,
"avg_age": {
"value": 35
}
},
{
"key": "sports",
"doc_count": 1,
"avg_age": {
"value": 25
}
}
]
}

除此之外还有很多功能,比如建议、地理定位、过滤、模糊以及部分匹配等

我们通过将HTTP后的请求方式由 PUT 改变为 GET 来获取文档,
同理,我们也可以将其更换为 DELETE 来删除这个文档,
HEAD 是用来查询这个文档是否存在的。
如果你想替换一个已经存在的文档,你只需要使用 PUT 再次发出请求即可

es集群
master 节点无需参与文档层面的变更和搜索,这意味着仅有一个 master 节点并不会因流量增长而成为瓶颈
作为用户,我们可以访问包括 master 节点在内的集群中的任一节点。每个节点都知道各个文档的位置,
并能够将我们的请求直接转发到拥有我们想要的数据的节点。无论我们访问的是哪个节点,
它都会控制从拥有数据的节点收集响应的过程,并返回给客户端最终的结果。这一切都是由 Elasticsearch 透明管理的

集群健康
集群健康(cluster health)。它的 status 有 green、yellow、red 三种;
GET /_cluster/health
状态 意义
green 所有主分片和从分片都可用
yellow 所有主分片可用,但存在不可用的从分片
red 存在不可用的主要分片

在Elasticsearch中,每一个字段都会默认被建立索引。也就是说,每一个字段都会有一个反向索引以便快速搜索。
而且,与大多数其他数据库不同的是ES可以在同一个查询中使用所有的反向索引,以惊人的速度返回查询结果。

文档元数据
_index
选择一个索引的名字。这个名称必须要全部小写,也不能以下划线开头,不能包含逗号
_type
_id
id是一个字符串,当它与_index以及_type组合时,就可以来代表Elasticsearch中一个特定的文档。我们创建了一个新的文档时,你可以自己提供一个_id,或者也可以让Elasticsearch帮你生成一个。

索引Id的生成策略
1.自己定义ID使用方法
PUT /{index}/{type}/{id}
{
"field": "value",
...
}
2.es自动生成自增长
POST /website/blog/
{
"title": "My second blog entry",
"text": "Still trying this out...",
"date": "2014/01/01"
}
自生成ID是由22个字母组成的,安全 universally unique identifiers 或者被称为UUIDs

在任意的查询字符串中添加pretty参数,类似上面的请求,Elasticsearch就可以得到优美打印的更加易于识别的JSON结果。
_source字段不会执行优美打印,它的样子取决于我们录入的样子

GET请求的返回结果中包含{"found": true}。这意味着这篇文档确实被找到了。如果我们请求了一个不存在的文档,我们依然会得到JSON反馈,只是found的值会变为false。
同样,HTTP返回码也会由'200 OK'变为'404 Not Found'。我们可以在curl后添加-i,这样你就能得到反馈头文件:

通常,GET请求会将整个文档放入_source字段中一并返回。但是可能你只需要title字段。你可以使用_source得到指定字段。如果需要多个字段你可以使用逗号分隔:
GET /website/blog/123?_source=title,text
现在_source字段中就只会显示你指定的字段:
{
"_index" : "website",
"_type" : "blog",
"_id" : "123",
"_version" : 1,
"exists" : true,
"_source" : {
"title": "My first blog entry" ,
"text": "Just trying this out..."
}
}

或者你只想得到_source字段而不要其他的元数据,你可以这样请求:
GET /website/blog/123/_source
这样结果就只返回:
{
"title": "My first blog entry",
"text": "Just trying this out...",
"date": "2014/01/01"
}

检查文档是否存在
如果确实想检查一下文档是否存在,你可以试用HEAD来替代GET方法,这样就是会返回HTTP头文件:

curl -i -XHEAD /website/blog/123
如果文档存在,Elasticsearch将会返回200 OK的状态码:

HTTP/1.1 200 OK
Content-Type: text/plain; charset=UTF-8
Content-Length: 0
如果不存在将会返回404 Not Found状态码:

curl -i -XHEAD /website/blog/124
HTTP/1.1 404 Not Found
Content-Type: text/plain; charset=UTF-8
Content-Length: 0
当然,这个反馈只代表了你查询的那一刻文档不存在,但是不代表几毫秒后它不存在,很可能与此同时,另一个进程正在创建文档。

更新整个文档
在Documents中的文档是不可改变的。所以如果我们需要改变已经存在的文档,
我们可以使用《索引》中提到的indexAPI来重新索引或者替换掉它:
PUT /website/blog/123
{
"title": "My first blog entry",
"text": "I am starting to get the hang of this...",
"date": "2014/01/02"
}
在反馈中,我们可以发现Elasticsearch已经将_version数值增加了:

{
"_index" : "website",
"_type" : "blog",
"_id" : "123",
"_version" : 2,
"created": false <1>
}
created被标记为 false是因为在同索引、同类型下已经存在同ID的文档。
在内部,Elasticsearch已经将旧文档标记为删除并且添加了新的文档。旧的文档并不会立即消失,但是你也无法访问他。Elasticsearch会在你继续添加更多数据的时候在后台清理已经删除的文件。
在本章的后面,我们将会在《局部更新》中介绍最新更新的API。这个API允许你修改局部,但是原理和下方的完全一样:
从旧的文档中检索JSON
修改它
删除修的文档
索引一个新的文档
唯一不同的是,使用了updateAPI你就不需要使用get然后再操作index请求了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值