Elasticsearch学习笔记

一、概述。

ElasticSearch是一个基于Lucene的搜索服务器,提供了一个分布式多用户能力的全文搜索引擎,基于Restful Web接口。它是用Java语言开发,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定、可靠、快速,安装使用方便。不仅能对海量规模的数据完成分布式索引和检索,还能提供数据聚合分析。据国际权威的数据库产品评测机构DB Engines的统计,在2016年1月,Elastic Search已成为世界第一的搜索引擎应用。
ES是面向文档的。几个核心概念如下:
     Index:索引,做名词可以类比关系型数据库中的database,做动词可以理解为往索引中插入文档;
     Type:类型(从7.x开始逐渐移除此该概念, 最新版7.3.0已默认移除),可类比于关系型数据库中的Table;
     Document:文档,可类比于关系型数据库中的数据;
     Mapping:字段,可类比于关系型数据库中的字段;
ES有两种请求方式:
     Restful:统一资源定位的一种约束规则,追求简洁性能,uri中不应包含操作。
     CURL:命令行工具,以命令的方式执行Http请求。

二、安装。

推荐使用Docker安装运行。以目前最新版本为例,步骤如下:
1、dockers hub地址:https://hub.docker.com/_/elasticsearch
2、建立es专用用户:user add es
3、设置password:passwd es
4、将es用户加入docker用户组:sudo usermod -aG docker es
5、切换到es用户:su es
6、建立es数据目录:mkdir -rp /docker/elasticsearch/data  mkdir /docker/elasticsearch/logs
7、将以上两个目录设为所有人所有权限:chmod 777 /docker/elasticsearch/*
8、使用docker启动es:
docker run --name docker-elasticsearch -p 9200:9200 -p 9300:9300 -v /docker/elasticsearch/data:/usr/share/elasticsearch/data -v /docker/elasticsearch/logs:/usr/share/elasticsearch/logs -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" -e "discovery.type=single-node" -d elasticsearch:7.3.0
9、打开网址:demo.rener.cc:9200测试是否启动成功
--tips:(1) 因为es是所有人都可以访问的,所以为了安全,es默认不能访问本地目录,也就不能绑定本地目录,所以测试环 
        境中可以通过建立非root用户并设置目录权限的方式解决。
        (2)es是通过网络来判断是开发环境还是正式环境的。docker启动默认不是直连,所以是开发环境。

三、安装kibana

docker run -d --name docker-kibana --link docker-elasticsearch:elasticsearch -p 5601:5601 kibana:7.3.0

四、安装IK Analysis 中文分词器

1、GitHub地址:https://github.com/medcl/elasticsearch-analysis-ik
2、按照readme文档安装
3、重启es
4、手动创建Mapping并配置分词器:
PUT /comment
{
"mappings": {
    "properties": {
        "content":{
            "type": "text",
            "analyzer": "ik_max_word",
            "search_analyzer": "ik_smart"
            }
        }
    }
}

五、常用命令

kibana中Dev Tools中可使用Rest Ful命令操作ES,也比较推荐采用此方式。
0、查看健康状态:GET _cat/health     _cat是es本身的数据查看,包含count、nodes等多个查看es运行数据的命令
1、添加索引     PUT /user
2、查看索引     GET /user
3、删除索引     DELETE /user
4、查看全部索引     GET _cat/indices
5、添加文档     
PUT /user/_doc/4     //指定ID为4
{
    "name":"heihei",
    "age":"22",
    "sex":"man",
    "email":"[email protected]"
}

6、添加文档     
POST /user/_doc     //自动生成ID
{
    "name":"haha",
    "age":"22",
    "sex":"man",
    "email":"[email protected]"
}

7、更新文档:使用PUT再次提交,会重建索引
8、搜索:
    (1)简单搜索:GET /user/_search?q=name:zhangsan
    (2)获取全部:GET /user/_search
    (3)语法查询:   
           ①match
           ②term:精准匹配,不分词,较适用于数值类型的字段查询
           ③fuzzy:模糊匹配
           ④wildcard:可以使用通配符? *
           ⑤range:范围匹配
           ⑥filter:过滤器,不计算相关性
示例:

GET /user/_search
{
    "query": {
        "match": {  //match查询会进行分词,同类的还有matchAll:查询所有,matchPrase:短语匹配;match_phrase_prefix:短语前缀匹配
            "name": "zhangsan"
        }
    }
}

(4)复合查询示例:

GET /user/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "FIELD": "TEXT"
          }
        },
        {
          "term": {
            "FIELD": {
              "value": "VALUE"
            }
          }
        },
        {
          "bool": {
            "should": [
              {
                "match": {
                  "FIELD": "TEXT"
                }
              }
            ]
          }
        }
      ],
      "must_not": [
        {
          "match": {
            "FIELD": "TEXT"
          }
        }
      ],
      "filter": {
        "term": {
          "FIELD": "VALUE"
        }
      }
    }
  },
  "sort": [
    {
      "FIELD": {
        "order": "desc"
      }
    }
  ],
  "aggs": {
    "NAME": {
      "AGG_TYPE": {}
    }
  }, 
  "from": 0,
  "size": 20
}

9、聚合:

GET /user/_search
{
    "aggs": {
        "NAME": {
            "AGG_TYPE": {}     //avg/sum/min/max等
        }
    }
}

六、Java客户端

Elastic search客户端有Rest client(又包括RestHighLevelClient和RestLowLevelClient)和Transport client,前者通过Rest接口访问es,后者通过直接向node节点发送请求的方式访问。推荐使用RestHighLevelClient。Spring集成es可以通过Spring的Spring Data Elasticsearch,它是对官方api的封装,Spring boot可以使用spring-boot-starter-data-elasticsearch,提供了更好的封装,Repository中只需继承ElasticsearchRepository接口,即可使用其中封装好的多个类。但是,其更新较慢,至今不支持7.x以上版本的es,且使用的还是Transport client。

未完待续.......

Elasticsearch全文检索