安装部署

先前部署项目部署es的流程

下载elasticsearch

https://www.elastic.co/cn/downloads/elasticsearch

解压安装elasticsearch

修改配置文件,配置为单个节点

config/elasticsearch.yml
discovery,seed_hosts:[“127.0.0.1:9200”]
cluster.initial_master_nodes:[“node-1”]

因为部分elasticsearch支持的jdk版本不一样,所以可以自己再给elasticsearch配置一个jdk版本

启动elasticsearch

因为elasticsearch不能以root用户启动,所以 要新建一个用户用来启动elasticsearch

adduser 新用户名

passwd 初始化新用户的密码

使用root用户找到sudoers文件,赋予可读写权限

whereis sudoers

修改权限

chomd -v u+w sudoers的路径

进入sudoers文件,在root下添加

新用户用户名 ALL=(ALL) ALL

切换到新用户

su 新用户名

之后进入elasticsearch目录下,进入bin目录,后台运行elasticsearch

./elasticsearch -d

部署问题(使用版本为7.16)

启动配置

  • es的安装目录下的config/elasticsearch.yml

集群名设置

cluster.name: 集群名

节点名设置

node.name: 当前节点名

任何ip都能访问

network.host: 0.0.0.0

启动端口

http.port: 9200

jdk版本不对

一般使用的jdk为8版本,但是es版本不支持jdk8,所以要给es专门配置一套jdk

es要求的版本最低为11版本

所以,下载11版本的jdk,并在环境变量中配置ES_JAVA_HOME即可

启动权限问题

按照上述的方式配好用户后,可能还是会提示没有权限启动

启动的时候不能使用sudo方式,不然依旧是“不能以root用户启动es”的报错

最直接的方式就是新建一个用户后,把es的安装目录的权限分给新用户

例如(root用户下)

adduser es

chown -R es es安装目录

jvm警告

Java HotSpot™ 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
这个错误需要修改es安装目录下的config/jvm.optionsn
将
-XX:+UseConcMarkSweepGC
修改为
 -XX:+UseG1GC

无法使用问题

部署完之后不仅要访问ip:端口查看启动状态

也需要ip:端口/_cat/nodes?pretty检查是否正常

如果显示

{
    "error": {
        "root_cause": [
            {
                "type": "master_not_discovered_exception",
                "reason": null
            }
        ],
        "type": "master_not_discovered_exception",
        "reason": null
    },
    "status": 503
}

则还是没有准备,去安装目录下的conf/elasticsearch.yml中检查配置

查看两个内容,这两个节点的内容一定要一致

cluster.initial_master_nodes: ["node1"]
node.name: node1

文件权限与存储大小问题

报错内容

ERROR: [2] bootstrap checks failed. You must address the points described in the following [2] lines before starting Elasticsearch.
 bootstrap check failure [1] of [2]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
 bootstrap check failure [2] of [2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
 ERROR: Elasticsearch did not exit normally - check the logs at /usr/local/elasticsearch/elasticsearch/logs/my-application.log解决方案
切换到root用户修改一些内容
elasticsearch用户拥有的可创建文件描述的权限太低,至少需要65536,
vim /etc/security/limits.conf # 在最后面追加下面内容
es启动用户 hard nofile 65536
es启动用户 soft nofile 65536
max_map_count文件包含限制一个进程可以拥有的VMA(虚拟内存区域)的数量
vim /etc/sysctl.conf # 在最后面追加下面内容
vm.max_map_count=655360
执行 sysctl -p

介绍

es是一个分布式,高扩展,高实时的搜索与数据分析引擎,通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变的简单,本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据

核心概念

es是面向文档的搜索引擎

es和数据库的比对

数据库

es

数据库

索引


types


documents

字段

fields

文档

es的数据存储格式相当于索引下的类型里面的json格式的数据

因为es是面向文档的搜索,所以一个文档就是es中可搜索的最小的单元

类比于mysql中,就是把mysql中的一行数据以json的格式保存在es中

类型

相当于数据库的表,一个索引下可以有很对类型,但是在es6.0开始,type就已经主键废弃了,但是依旧可以设置多个类型,但是在7.0开始,一个索引只能有一种类型了(_doc)

索引

不同特性的文档存放在不同的索引里

索引名称必去全部都是小写

单个集群中可以定义任意多个索引

索引具有mapping和setting的概念,mapping用来定义文档字段的类型,setting用来定义不同数据的分布

基本操作

创建一个空的索引

创建一个0副本2分片的repledata索引

PUT /ropledata
{
  "settings": { 
    "number_of_shards": "2", 
    "number_of_replicas": "0"
  } 
}

修改副本数量(分片数量无法修改)

PUT ropledata/_settings 
{ 
  "number_of_replicas" : "2" 
}

删除索引

DELETE /ropledata

插入数据

插入数据的时候可以指定ID,不指定的话es会帮我们生成

id是101而不是数据中的"id":1

//指定id 
POST /ropledata/_doc/101 
{
  "id":1,
  "name":"且听_风吟",
  "page":"",
  "say":"欢迎点赞,收藏,关注,一起学习" 
}

修改数据

es的文档是不可以修改的,但是可以覆盖,es的数据修改本质上就是对文档的覆盖

es对数据的修改分为全局更新和局部更新

全局更新是替换操作,就算是数据一样也会执行替换操作

局部更新是只有遇到新得内容的时候才会去更新

所以局部更新会比全局更新效率高

全局更新

PUT /ropledata/_doc/101
{ 
  "id":1,
  "name":"且听_风吟",
  "page":"",
  "say":"再次欢迎点赞,收藏,关注,一起学习" 
}

局部更新

POST /ropledata/_update/101 
{
  "doc":
  {
    "say":"奥力给"
  } 
}

查询数据

GET /ropledata/_doc/101

删除数据

DELETE /ropledata/_doc/101

查询语句

查询当前索引下全部的内容,并返回指定属性值的数据内容

(因为7.0之后是没有type的概念了,所以使用了_doc,如果还有type的概念的话,可以把_doc替换为相对应的type名即可查询)

GET /topledata/_doc/_search
{
    "query":{
        "match_all":{

        }
    },
    "_source":["属性值","属性值"]
}

查询指定字符查找内容,并按照倒序排列,从第0条数据开始,查找10条数据(也就是分页查询)

GET /topledata/_doc/_search
{
    "query":{
        "mathc":{
            "属性值":"关键字"
        }
    },
    "sort":[
        {
            "属性字段":{
                "order":"desc"
                }
        }
    ],
    "from":0,
    "size":10
}

match

对于match而言,是根据分词来查询的,如果match中存在两个分词,那个他会一个一个查询,之后取他们的一个并集

可以使用match_phrase来指定精准查询不需要分词查

多条件查询

bool过滤可以用来合并多个过滤条件查询结果的布尔逻辑

must多个查询条件的完全匹配,相当于and

must_not多个查询条件的相反匹配,相当于not

should至少有一个查询条件匹配,相当于or

这些参数分别可以继承一个过滤条件或者一个过滤条件的数组

GET /topledata/_doc/_search
{
    "query":{
        "bool":{
            "must":[
                {
                    "match":{
                        "属性值":"关键词"
                            }
                    }
                ]
            },
            "filter":{
                "range":{
                       "关键词":{
                            "判断符":内容
                            }    
                    }
                }
    }
}

聚合分析

es5之后fielddata默认是false,需要开启这个才能进行聚合

GET /topledata/_mapping/product
{
    "properties":{
        "tags":{
            "type":"text",
            "fielddata":true
            }
      }
}

获取某一列以不同分组的总和,并以某个条件做排序操作,并使用range过滤指定范围的数据

terms和term类似,单terms允许指定多个匹配条件,如果某个字段指定了多个值,那么需要文档一起做匹配

GET /topledata/_doc/_search
{
    "query":{
        "match":{
            "属性值":"关键词"
        }
    },
    "aggs":{
        "聚合名称":{
            "terms":{
                "field":"属性值",
                "range":[
                     {
                        "from":值,
                        "to":值
                   },
                     {
                         "from":值,
                        "to":值
                    }       
                ],
                "order":{
                    "下面的那个aggs的名称":"desc"
                    }
                }
            },
            "aggs":{
                "自定义名称":{
                    "avg":{
                        "field":"属性值"
                        }
                    }
                }
    }
}

整合springboot

引入elasticsearch启动包

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

配置yml文件

spring:
  elasticsearch:
    uris: http://ip:端口
    #当前部署的es并没有账号和密码
    #username:
    #password:

测试内容

实体类

新建一个实体类来标识一个索引

@Data
@Document(indexName = "testdemo")
public class EsDemoModel {

    @Id
    private String id;

    @Field(type = FieldType.Text)
    private String name;

    @Field(type = FieldType.Text)
    private String team;
}

方法

和redis类似,拥有一个ElasticsearchRestTemplate可以引用

保存

@Test
    void EsSaveTest(){
        EsDemoModel esDemoModel = new EsDemoModel();
        esDemoModel.setName("panther");
        esDemoModel.setTeam("marvel");
        elasticsearchRestTemplate.save(esDemoModel);
    }

查询

@Test
    void EsSearchTest(){
        Query query = new NativeSearchQueryBuilder().withQuery(QueryBuilders.queryStringQuery("man").defaultField("name")).build();
        SearchHits<EsDemoModel> search = elasticsearchRestTemplate.search(query, EsDemoModel.class);
        List<EsDemoModel> collect = search.getSearchHits().stream().map(SearchHit::getContent).collect(Collectors.toList());
        System.out.println(collect);
    }

修改

es的操作和redis类似,如果遇到有相同_id的内容,就会覆盖,所以查出来之后再保存可以保证对一条数据的修改

删除

@Test
    void EsDelete(){
        Query query = new NativeSearchQueryBuilder().withQuery(QueryBuilders.queryStringQuery("super man").defaultField("name")).build();
        elasticsearchRestTemplate.delete(query,EsDemoModel.class);
    }