elasticsearch从安装到入门

安装jdk之后
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用户
[root@SHB-L0039546 es-5.1.2]# groupadd elsearch
[root@SHB-L0039546 es-5.1.2]# 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"
}
表示结果正常

es使用
在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请求了。

猜你喜欢

转载自oaibf.iteye.com/blog/2354450