[TOC] > [阮一峰参考文档](http://www.ruanyifeng.com/blog/2017/08/elasticsearch.html) ## 概述 - 需要 java8 环境 以 `REST API` 格式进行操作 快速地储存、搜索和分析海量数据 ### Node 与 Cluster ``` Elastic 本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个 Elastic 实例。 单个 Elastic 实例称为一个节点(node)。一组节点构成一个集群(cluster) ``` ### Index 可看做数据库 `curl -X GET 'http://localhost:9200/_cat/indices?v'` ### Document Index 里面单条的记录称为 Document(文档)。许多条 Document 构成了一个 Index。 就是一条记录 ``` { "user": "张三", "title": "工程师", "desc": "数据库管理" } ``` ### Type 根据规划,Elastic 6.x 版只允许每个 Index 包含一个 Type,7.x 版将会彻底移除 Type。 ## 安装 ``` $ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.1.zip $ unzip elasticsearch-5.5.1.zip $ cd elasticsearch-5.5.1/ $ ./bin/elasticsearch ``` 测试 `curl localhost:9200` ``` { "name" : "atntrTf", "cluster_name" : "elasticsearch", "cluster_uuid" : "tf9250XhQ6ee4h7YI11anA", "version" : { "number" : "5.5.1", "build_hash" : "19c13d0", "build_date" : "2017-07-18T20:44:24.823Z", "build_snapshot" : false, "lucene_version" : "6.6.0" }, "tagline" : "You Know, for Search" } ``` ## 新建和删除 Index (新建库) ### 新建 ``` curl -X PUT 'localhost:9200/weather' ``` 返回 ``` { "acknowledged":true, "shards_acknowledged":true } ``` ### 删除 `curl -X DELETE 'localhost:9200/weather'` ## 中文分词设置 `./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v5.5.1/elasticsearch-analysis-ik-5.5.1.zip` > 上面代码安装的是5.5.1版的插件,与 Elastic 5.5.1 配合使用。 凡是需要搜索的中文字段,都要单独设置一下 demo ``` curl -X PUT 'localhost:9200/accounts' -d ' { "mappings": { "person": { "properties": { "user": { "type": "text", "analyzer": "ik_max_word", "search_analyzer": "ik_max_word" }, "title": { "type": "text", "analyzer": "ik_max_word", "search_analyzer": "ik_max_word" }, "desc": { "type": "text", "analyzer": "ik_max_word", "search_analyzer": "ik_max_word" } } } } }' //======== search_analyzer是搜索词的分词器。 ik_max_word分词器是插件ik提供的,可以对文本进行最大数量的分词 ``` > 首先新建一个名称为accounts的 Index,里面有一个名称为person的 Type。person有三个字段 > 这三个字段都是中文,而且类型都是文本(text),所以需要指定中文分词器,不能使用默认的英文分词器 ## 数据操作 ### 新增记录 #### 以 PUT 方式,需要在url 中添加id ``` $ curl -X PUT 'localhost:9200/accounts/person/1' -d ' { "user": "张三", "title": "工程师", "desc": "数据库管理" }' ``` 返回 ``` { "_index":"accounts", "_type":"person", "_id":"1", "_version":1, "result":"created", "_shards":{"total":2,"successful":1,"failed":0}, "created":true } ``` #### 以post 方式 ,不需要加 id 自动生成的id 是个随机数 ``` $ curl -X POST 'localhost:9200/accounts/person' -d ' { "user": "李四", "title": "工程师", "desc": "系统管理" }' ``` 返回 ``` { "_index":"accounts", "_type":"person", "_id":"AV3qGfrC6jMbsbXb6k1p", "_version":1, "result":"created", "_shards":{"total":2,"successful":1,"failed":0}, "created":true } ``` > 生成数据时如果没有先创建 index 即`accounts`也不会报错,而是直接手动生成对应的index ### 查看记录 `curl 'localhost:9200/accounts/person/1?pretty=true'` - pretty=true 返回易读的格式 - accounts/person/1 id 为1 success ``` { "_index" : "accounts", "_type" : "person", "_id" : "1", "_version" : 1, "found" : true, "_source" : { "user" : "张三", "title" : "工程师", "desc" : "数据库管理" } } ``` error ``` { "_index" : "accounts", "_type" : "person", "_id" : "abc", "found" : false } ``` ### 删除记录 ` curl -X DELETE 'localhost:9200/accounts/person/1'` ### 更新记录 发送id相同的新数据替换 ``` $ curl -X PUT 'localhost:9200/accounts/person/1' -d ' { "user" : "张三", "title" : "工程师", "desc" : "数据库管理,软件开发" }' ``` 返回值 ``` { "_index":"accounts", "_type":"person", "_id":"1", "_version":2, //版本信息发送变化 "result":"updated", "_shards":{"total":2,"successful":1,"failed":0}, "created":false } ``` ### 返回所有记录 `curl 'localhost:9200/accounts/person/_search'` ``` { "took":2, "timed_out":false, "_shards":{"total":5,"successful":5,"failed":0}, "hits":{ "total":2, "max_score":1.0, "hits":[ ... took 返回记录数,本例是2条。 max_score:最高的匹配程度,本例是1.0。 hits:返回的记录组成的数组 ``` ### 全文搜索 GET 请求带有数据体 ``` $ curl 'localhost:9200/accounts/person/_search' -d ' { "query" : { "match" : { "desc" : "软件" }}, "from": 1, "size": 1 //Elastic 默认一次返回10条结果 }' ``` #### 逻辑运算 ``` $ curl 'localhost:9200/accounts/person/_search' -d ' { "query" : { "match" : { "desc" : "软件 系统" }} }' ``` 使用 or 查询 如果要使用 and 可使用下面的方式 ``` curl 'localhost:9200/accounts/person/_search' -d ' { "query": { "bool": { "must": [ { "match": { "desc": "软件" } }, { "match": { "desc": "系统" } } ] } } }' ``` ## 设置 ### 允许其他机器访问 Elastic 安装目录的 `config/elasticsearch.yml` `network.host: 0.0.0.0 ` ### 集成 > [集成](https://blog.csdn.net/zxc123e/article/details/79206526) ### 集成可视化 ``` yum –y install nodejs nodejs-npm npm install -g grunt-cli --registry=https://registry.npm.taobao.org npm install -g grunt-cli git clone git://github.com/mobz/elasticsearch-head.git cd elasticsearch-head npm install ``` 克隆下来之后,进入elasticsearch-head目录,修改其中的Gruntfile.js 在 `connect–>server–>options`对象下面添加:`hostname:"*"`,允许所有IP可以访问。 `vim _site/app.js`,修改 `http://localhost:9200`字段到本机ES端口与IP。 ## 问题 ### max file descriptors 4096 for elasticsearch process is too low 切换到root 用户 ``` vim /etc/security/limits.conf * soft nofile 65536 * hard nofile 131072 * soft nproc 2048 * hard nproc 4096 ``` ### max virtual memory areas vm.maxmapcount [65530] is too low ``` sudo sysctl -w vm.max_map_count=26214 ``` ### system call filters failed to install; check the logs and fix your configuration or disable system call filters at your own ris ``` bootstrap.memory_lock: false //修改此行 bootstrap.system_call_filter: false //添加此行 ```