ElasticSearch學習筆記

1、ElasticSearch學習筆記

擼一門技術,必先登其官網,扒其皮,喝其血html

官網地址:www.elastic.co/products/el…java

官方中文文檔地址:www.elastic.co/guide/cn/el…node

1.1.ElasticSearch簡介

ElasticSearch是一個分佈式搜索服務,提供的是一組Restful API,底層基於Lucene,採用多shard(分片)的方式保證數據安全,而且提供自動resharding的功能。是目前全文搜索引擎的首選,能夠快速的存儲、搜索和分析海量數據,Springboot經過整合Spring Data ElasticSearch爲咱們提供了很是方便的檢索功能支持。linux

1.2.ElasticSearch原始安裝

系統環境

  • CentOS 7.6.1810
  • jdk 1.8.0_201

所需安裝文件

  • elasticsearch-6.6.0.tar.gz
  • jdk-8u201-linux-x64.tar.gz
  • elasticsearch-head-master.zip
  • node-v10.15.1-linux-x64.tar.gz

elasticsearch安裝方法

tar -zxvf elasticsearch-6.6.0.tar.gz -C /opt/module/ # 解壓安裝包
複製代碼
[root@localhost elasticsearch-6.6.0]# mkdir data # 建立數據文件夾(6.0自帶logs文件夾)
複製代碼
vi elasticsearch.yml # 修改配置文件
複製代碼
cluster.name: my-application # 集羣名稱(多集羣時候只需節點名稱一直便可)
node.name: node-102 # 節點名稱
path.data: /opt/module/elasticsearch-6.6.0/data # 數據路徑
path.logs: /opt/module/elasticsearch-6.6.0/logs # 日誌路徑
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
network.host: 192.168.1.8 # 網絡地址
http.port: 9200 # 端口
discovery.zen.ping.unicast.hosts: ["hadoop102"] # 主機名
複製代碼

注意:node.name能夠隨便取,可是一個集羣中不能重複,注意path.data前不能有空格,冒號後必須有一個空格git

elasticsearch常見問題解決

問題一:ERROR: bootstrap checks failedgithub

su root
vi /etc/security/limits.conf
複製代碼
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
複製代碼

問題二:max number of threads [1024] for user [lish] likely too low, increase to at least [2048]spring

vi /etc/security/limits.d/90-nproc.conf
* soft nproc 2048
複製代碼

問題三:max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]sql

vi /etc/sysctl.conf
vm.max_map_count=655360
sysctl -p
複製代碼

elasticsearch啓動

elasticsearch禁止使用root用戶啓動,須要新建一個testuser用戶docker

[testuser@hadoop102 elasticsearch-6.6.0]$ ./bin/elasticsearch
複製代碼

**訪問地址:**http://192.168.1.8:9200/數據庫

ElasticSearch插件安裝

插件地址:github.com/zt111579833…

Nodejs安裝

tar -zxvf node-v10.15.1-linux-x64.tar.gz -C /opt/module/
複製代碼
vi /etc/profile
export NODE_HOME=/opt/module/node-v10.15.1-linux-x64
export PATH=$PATH:$NODE_HOME/bin
source /etc/profile 
複製代碼

elasticsearch-head-master安裝

[root@hadoop102 sortware]# unzip elasticsearch-head-master.zip -d /opt/module/
複製代碼
[root@hadoop102 elasticsearch-head-master]# npm install grunt --save
複製代碼
npm install -g cnpm --registry=https://registry.npm.taobao.org
複製代碼
npm install -g grunt-cli
複製代碼
vim Gruntfile.js
複製代碼
options: {
    hostname:'0.0.0.0',
    port: 9100,
    base: '.',
    keepalive: true
}
複製代碼
# 檢查head根目錄下是否存在base文件夾 沒有:將 _site下的base文件夾及其內容複製到head根目錄下
mkdir base
cp base/* ../base/
複製代碼
[root@hadoop102 module]# chown -R luokangyuan:luokangyuan elasticsearch-head-master/
複製代碼
[luokangyuan@hadoop102 elasticsearch-head-master]$ grunt server -d
複製代碼
npm install grunt-contrib-clean -registry=https://registry.npm.taobao.org
npm install grunt-contrib-concat -registry=https://registry.npm.taobao.org
npm install grunt-contrib-watch -registry=https://registry.npm.taobao.org 
npm install grunt-contrib-connect -registry=https://registry.npm.taobao.org
npm install grunt-contrib-copy -registry=https://registry.npm.taobao.org 
npm install grunt-contrib-jasmine -registry=https://registry.npm.taobao.org
複製代碼
http://192.168.1.8:9100/
複製代碼
vi elasticsearch.yml
http.cors.enabled: true
http.cors.allow-origin: "*"
複製代碼

1.3.ElasticSearch的docker安裝

啓動Docker

[root@localhost /]# systemctl start docker
複製代碼

搜索鏡像

[root@localhost /]# docker search elasticsearch
複製代碼

使用鏡像加速器下載

[root@localhost /]# docker pull registry.docker-cn.com/library/elasticsearch
複製代碼

檢查是否安裝成功

[root@localhost /]# docker images
複製代碼

啓動ElasticSearch

docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d -p 9200:9200 -p 9300:9300 --name ES01 5acf0e8da90b
複製代碼

檢查是否啓動

[root@localhost /]# docker ps
複製代碼

訪問測試

http://192.168.1.14:9200/
複製代碼

1.4.ElasticSearch核心概念

Cluster集羣

集羣就是包含了多個節點,每個節點屬於哪個集羣是經過一個集羣名稱配置。

Node節點

集羣中的一個節點,節點也存在名稱,默認是隨機分配一個名稱,默認節點會加入到一個elasticsearch集羣中。

Index索引

索引包含的是一大推類似結構的文檔數據,例如咱們的商品索引,訂單索引等,類比於咱們的數據庫。

Type類型

每個索引裏面能夠有一個或者多個typetypeindex中的一個邏輯數據分類,好比個人博客系統,一個索引,能夠定義用戶數據type,能夠定義文章數據type,也能夠定義評論數據type,類比數據庫的表。

Document文檔

文檔是ElasticSearch中最小的數據單元,一條Document能夠是一條文章數據,一條用戶數據,一條評論數據,一般使用JSON數據結構來表示,每一個index下的type中,存儲多個document,類別數據庫中的行。

Field字段

FieldElasticSearch中的最小單位,一個document裏面粗在多個Field字段,每一個Field就是一個數據字段,類比數據庫中的列。

mapping映射

數據如何存儲在索引上,須要一個約束配置,例如數據類型,是否存儲,查詢的時候是否分詞等等,類比數據庫彙總的約束。

ElasticSearch和數據庫對別

關係型數據庫Mysql 非關係型數據庫ElasticSearch
數據庫Database 索引Index
表Table 類型Type
數據行Row 文檔Document
數據列Column 字段Field
約束Schema 映射Mapping

ElasticSearch核心概念圖解

WX20190223-173048@2x

1.5.Springboot集成ElasticSearch

Springboot默認使用Spring Data Elasticsearch模塊進行操做,同時也存在另一個操做ElasticSearch的模塊,那就是jest

使用Jest與ElasticSearch進行交互

Jest的GitHub地址:github.com/searchbox-i…

Jest文檔地址:github.com/searchbox-i…

第一步:增長POM 文件

<dependency>
    <groupId>io.searchbox</groupId>
    <artifactId>jest</artifactId>
    <version>5.3.4</version>
</dependency>
複製代碼

第二步:增長ElasticSearch配置項

spring:
 elasticsearch:
 jest:
 uris: http://192.168.1.9:9200/
複製代碼

第三步:使用JestClient進行交互

public class Users {
    // 標示主鍵字段
    @JestId
    private Integer id;
    private Integer code;
    private String name;
    private String sex;
    private String age;
    private String notes;
}
複製代碼
@Autowired
JestClient jestClient;

@Test
public void contextLoads() {
    // 給es中保存一份文檔
    Users users = new Users();
    users.setId(2);
    users.setCode(123456);
    users.setAge("87");
    users.setName("魯班七號");
    users.setSex("男");
    users.setNotes("王者峽谷人見人想揍的小魯班");

    // 構建一個王者榮耀的索引和英雄角色類型
    Index build = new Index.Builder(users).index("wzry").type("yxjs").build();

    try {
        jestClient.execute(build);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

@Test
public void testSeach(){
    // 測試搜索es中知足條件的數據
    String json = "{\n" +
        " \"query\" : {\n" +
        " \"match\" : {\n" +
        " \"notes\" : \"峽谷小人\"\n" +
        " }\n" +
        " }\n" +
        "}";
    Search build = new Search.Builder(json).addIndex("wzry").addType("yxjs").build();
    try {
        SearchResult execute = jestClient.execute(build);
        System.out.println(execute.getJsonString());
    } catch (IOException e) {
        e.printStackTrace();
    }
}
複製代碼

最後測試

http://192.168.1.9:9200/wzry/yxjs/2
複製代碼

使用Spring Data Elasticsearch

官方文檔地址:docs.spring.io/spring-data…

第一步:增長POM文件

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
複製代碼

第二步:增長配置項

spring:
 data:
 elasticsearch:
 cluster-name: elasticsearch
 cluster-nodes: 192.168.1.9:9300
 repositories:
 enabled: true
複製代碼

第三步:進行數據交互

@Document(indexName = "study", type = "book")
public class Book {
    private Integer id;
    private String name;
    private String notes;
}
複製代碼
public interface BookRepository extends ElasticsearchRepository<Book, Integer> {
}
複製代碼
@Autowired
BookRepository bookRepository;

@Test
public void testSpringDataEs(){
    Book book = new Book();
    book.setId(11);
    book.setName("一個陌生女人的來信");
    book.setNotes("還不錯");
    bookRepository.index(book);
}
複製代碼

注意:若是啓動報錯,多是spring data elasticsearch和elasticsearch存在版本對應關係

版本對應參考官方文檔:github.com/spring-proj…

spring data elasticsearch elasticsearch
3.2.x 6.5.0
3.1.x 6.2.2
3.0.x 5.5.0
2.1.x 2.4.0
2.0.x 2.2.0
1.3.x 1.5.2

版本不適配解決方法

  • 查看spring data elasticsearch的版本號
  • 安裝對應版本的elasticsearch便可
  • 固然也能夠根據安裝的elasticsearch版本改變Springboot版本

解決辦法示例:

# 安裝對應版本的elasticsearch
[root@localhost /]# docker pull registry.docker-cn.com/library/elasticsearch:2.4
複製代碼
# 啓動對應版本的elasticsearch
[root@localhost /]# docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d -p 9201:9200 -p 9301:9300 --name ES14 01e5bee1e059
複製代碼

我我的本次測試環境:

  • Springboot:1.5.19
  • elasticsearch:2.4

附錄一:使用的Linux命令

  • mkdir 建立文件夾
  • pwd 查看當前所在路徑
  • scp -r CentOS-7-x86_64-Minimal-1810.iso root@192.168.1.8:/opt/sortware 在當前文件上傳文件到指定服務器文件夾
  • cat /etc/centos-release 查看系統版本
  • rm -rf jdk-8u201-linux-i586.tar.gz 不提示的遞歸刪除文件或者文件夾
  • tar -zxvf jdk-8u201-linux-x64.tar.gz 解壓
  • hostnamectl查看主機名
  • whereis sudoers 查找文件位置
  • ls -l /etc/sudoers 查看文件權限
  • chmod -v u+w /etc/sudoers 加入可寫權限
  • firewall-cmd --state 查看防火牆狀態
  • systemctl stop firewalld.service 關閉防火牆

附錄二:CentOs7安裝jdk1.8

1.上傳安裝文件

/opt/sortware/jdk-8u201-linux-x64.tar.gz
複製代碼

2.解壓

tar -zxvf jdk-8u201-linux-x64.tar.gz
複製代碼

3.重命名

mv jdk1.8.0_201 jdk1.8
複製代碼

4.打開系統配置文件

vi /etc/profile
複製代碼

5.添加環境變量

## Java
export JAVA_HOME=/opt/sortware/jdk1.8
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
複製代碼

6.重啓配置文件

source /etc/profile
複製代碼

7.查看版本

java -version
複製代碼

附錄三:CentOs7安裝docker

CentOs7安裝步驟

附錄四:經常使用docker命令

刪除全部容器

docker rm `docker ps -a -q`
複製代碼

查看存在的鏡像

docker images
複製代碼

查看全部啓動的容器

docker ps -a
複製代碼

中止容器

docker stop
複製代碼

搜索倉庫

docker search elasticsearch
複製代碼

拉取倉庫

docker pull registry.docker-cn.com/library/elasticsearch
複製代碼
相關文章
相關標籤/搜索