我第一次尝试使用Elasticsearch

首先

由于要处理使用Elasticsearch的项目,
我计划先进行安装并学习相关内容。
我已有以下的预先知识。

    • SQLではなくて、RESTAPIで動かす

 

    • インストールして起動すれば動く

 

    • あいまい検索とかにもつかえる

 

    早くて使いやすいらしい

除此之外,我还不了解其他任何事情。

环境

    • CentOS7.2

 

    java1.8.0_152

Elasticsearch的定义

从公式网页摘录

这是一个解决各种使用情况的分布式RESTful搜索/分析引擎。它是Elastic Stack的核心,用于存储数据,使得可以搜索预期的结果以及非预期的结果。

总结其他要点:
1. 非常快速
2. 可以从各种语言访问
3. 简单且值得欢呼

我在那里看到这样的描述。真是一切皆好的好事连连。

然后,即使阅读了首页,我仍然完全不知道该做什么。

让我们开始学习Elasticsearch吧(视频)。

您可以在官方网页上注册地址,
然后观看教学视频。
接下来,我们将以教学视频内容为基础进行说明。

公式页面 | 开始尝试Elasticsearch
Github

下载和安装

在公式网页上点击下载按钮

スクリーンショット 2017-12-23 11.08.34.png
スクリーンショット 2017-12-23 11.09.05.png
スクリーンショット 2017-12-23 10.57.55.png

这次我们会复制地址并使用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号端口。

image.png

终于打开了!这花了我大约3个小时!!!我现在还只是在公式视频教程的大约3分钟处。让我深刻地感受到了我对服务器设置知识的无知。

让我们尝试添加、更新和删除数据

那么,我们马上开始进行各种操作!

基本知識

与RDB进行比较的表格。

ElasticsearchRDBIndexデータベースTypeテーブル  Documentレコード

数据插入

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"
    }
  }
}

总结

这次就到这里吧。
除此之外,似乎还可以通过各种不同的搜索条件进行搜索,
并且还可以进行模糊搜索等等。
感觉并不像我想象中的那么困难呢。

广告
将在 10 秒后关闭
bannerAds