我第一次尝试使用Elasticsearch
首先
由于要处理使用Elasticsearch的项目,
我计划先进行安装并学习相关内容。
我已有以下的预先知识。
-
- SQLではなくて、RESTAPIで動かす
-
- インストールして起動すれば動く
-
- あいまい検索とかにもつかえる
- 早くて使いやすいらしい
除此之外,我还不了解其他任何事情。
环境
-
- CentOS7.2
- java1.8.0_152
Elasticsearch的定义
从公式网页摘录
这是一个解决各种使用情况的分布式RESTful搜索/分析引擎。它是Elastic Stack的核心,用于存储数据,使得可以搜索预期的结果以及非预期的结果。
总结其他要点:
1. 非常快速
2. 可以从各种语言访问
3. 简单且值得欢呼
我在那里看到这样的描述。真是一切皆好的好事连连。
然后,即使阅读了首页,我仍然完全不知道该做什么。
让我们开始学习Elasticsearch吧(视频)。
您可以在官方网页上注册地址,
然后观看教学视频。
接下来,我们将以教学视频内容为基础进行说明。
公式页面 | 开始尝试Elasticsearch
Github
下载和安装
在公式网页上点击下载按钮
这次我们会复制地址并使用Curl命令。
[ryuji@ryuji ~]$ curl https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.1.1.tar.gz | tar xzf -
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 27.1M 100 27.1M 0 0 5263k 0 0:00:05 0:00:05 --:--:-- 6969k
使用命令进行启动。
[ryuji@ryuji ~]$ cd elasticsearch-6.1.1/
[ryuji@ryuji elasticsearch-6.1.1]$ bin/elasticsearch
我們將進行啟動確認,如果返回以下結果就代表成功。
[ryuji@ryuji ~]$ curl http://localhost:9200/
{
"name" : "ydN1dXT",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "iF-7FAZxTqSgDpy1Uy84qA",
"version" : {
"number" : "6.1.1",
"build_hash" : "bd92e7f",
"build_date" : "2017-12-17T20:23:25.338Z",
"build_snapshot" : false,
"lucene_version" : "7.1.0",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
然后,按照与Elasticsearch相似的步骤,安装和启动可视化工具Kibana。
[ryuji@ryuji ~]$ curl https://artifacts.elastic.co/downloads/kibana/kibana-6.1.1-linux-x86_64.tar.gz | tar xzf -
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 61.6M 100 61.6M 0 0 2359k 0 0:00:26 0:00:26 --:--:-- 4951k
[ryuji@ryuji ~]$ cd kibana-6.1.1-linux-x86_64/
[ryuji@ryuji kibana-6.1.1-linux-x86_64]$ bin/kibana
虽然可以通过浏览器确认,但无法连接…
经过调查发现,这是因为elasticsearch只能从本地主机进行连接。我们将修改配置。
我们将在vim elasticsearch-6.1.1/config/elasticsearch.yml中添加以下设置。
network.host: 0.0.0.0
这个配置的话,可以从任何地方访问,所以可能不太好。需要注意。
添加设置后,重新启动elasticsearch。
遇到以下错误并失败了…。
ERROR: [3] bootstrap checks failed
[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
[2]: max number of threads [3857] for user [ryuji] is too low, increase to at least [4096]
[3]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
似乎是在打开主机时出现了错误。
需要更改错误的3个上限设置。
我在这里花了相当长的时间。
本来应该在/etc/security/limits.conf中更改设置,
但在我的环境下,不知为何设置没有生效。
为了先行动起来,我们暂时决定放宽限制,根据以下设定逐步进行。
[ryuji@ryuji elasticsearch-6.1.1]$ sudo sh -c "ulimit -n 65536 && exec su $LOGNAME"
[ryuji@ryuji elasticsearch-6.1.1]$ sudo sysctl -w vm.max_map_count=262144
vm.max_map_count = 262144
[ryuji@ryuji elasticsearch-6.1.1]$ sudo sh -c "ulimit -u 4096 && exec su $LOGNAME"
通过这个方法成功启动了。
但是,仍然无法从浏览器中打开kibana。
因为看起来Kibana也需要打开主机,所以我会在vim elasticsearch-6.1.1/config/elasticsearch.yml中添加以下设置。
network.host: 0.0.0.0
在这里,顺便一提,我意识到我没有开放端口!!我已经开放了9200号和5601号端口。
终于打开了!这花了我大约3个小时!!!我现在还只是在公式视频教程的大约3分钟处。让我深刻地感受到了我对服务器设置知识的无知。
让我们尝试添加、更新和删除数据
那么,我们马上开始进行各种操作!
基本知識
与RDB进行比较的表格。
数据插入
POST /Index/Type/document_id
在名为Index的数据库的Type表中插入document_id的记录。
# +--- Index name
# | +--- Type name
# | | +--- Document ID
# | | |
# V V V
PUT /library/books/1
{
"title": "Norwegian Wood",
"name": {
"first": "Haruki",
"last": "Murakami"
},
"publish_date": "1987-09-04T00:00:00+0900",
"price": 19.95
}
获取数据
GET /library/books/1
执行结果
{
"_index": "library",
"_type": "books",
"_id": "1",
"_version": 1,
"found": true,
"_source": {
"title": "Norwegian Wood",
"name": {
"first": "Haruki",
"last": "Murakami"
},
"publish_date": "1987-09-04T00:00:00+0900",
"price": 19.95
}
}
更新
- PUTでアップデート
将价格更新为29.95元。
PUT /library/books/1
{
"title": "Norwegian Wood",
"name": {
"first": "Haruki",
"last": "Murakami"
},
"publish_date": "1987-09-04T00:00:00+0900",
"price": 29.95
}
- POSTでアップデート
价格将增加到10。
POST /library/books/1/_update
{
"doc": {
"price": 10
}
}
在文档中添加新的字段
增加价格_jpy。
POST /library/books/1/_update
{
"doc": {
"price_jpy": 1800
}
}
获得数据的结果
{
"_index": "library",
"_type": "books",
"_id": "1",
"_version": 5,
"found": true,
"_source": {
"title": "Norwegian Wood",
"name": {
"first": "Haruki",
"last": "Murakami"
},
"publish_date": "1987-09-04T00:00:00+0900",
"price": 10,
"price_jpy": 1800
}
}
可以确认价格_JPY已经添加了。
删除数据
- Document単位
DELETE /library/books/1
获取了数据的执行结果 de
{
"_index": "library",
"_type": "books",
"_id": "1",
"found": false
}
- Index単位
DELETE /library
获取到的数据执行结果
{
"error": {
"root_cause": [
{
"type": "index_not_found_exception",
"reason": "no such index",
"resource.type": "index_expression",
"resource.id": "libray",
"index_uuid": "_na_",
"index": "libray"
}
],
"type": "index_not_found_exception",
"reason": "no such index",
"resource.type": "index_expression",
"resource.id": "libray",
"index_uuid": "_na_",
"index": "libray"
},
"status": 404
}
让我们尝试搜索数据
事前准备
将搜索的数据整合为一个集合。
POST /library/books/_bulk
{"index": {"_id": 1}}
{"title": "The quick brown fox", "price": 5}
{"index": {"_id": 2}}
{"title": "The quick brown fox jumps over the lazy dog", "price": 15}
{"index": {"_id": 3}}
{"title": "The quick brown fox jumps over the quick dog", "price": 8}
{"index": {"_id": 4}}
{"title": "Brown fox and brown dog", "price": 2}
{"index": {"_id": 5}}
{"title": "Lazy dog", "price": 9}
各种搜索
进行全文搜索
GET /library/books/_search
限制文件数量。以下示例为3份。
GET /library/books/_search?size=3
在标题中进行关键词搜索。关键词是“狐狸”。
GET /library/books/_search
{
"query": {
"match": {
"title": "fox"
}
}
}
总结
这次就到这里吧。
除此之外,似乎还可以通过各种不同的搜索条件进行搜索,
并且还可以进行模糊搜索等等。
感觉并不像我想象中的那么困难呢。