一,安装

官网: https://www.elastic.co/

elasticsearch 下载地址: https://www.elastic.co/cn/downloads/elasticsearch

kibana 下载地址: https://www.elastic.co/cn/downloads/kibana

可视化工具 elasticsearch-head : https://github.com/mobz/elasticsearch-head

ik分词插件: https://github.com/medcl/elasticsearch-analysis-ik/

<u>以上程序官方都可以提供了docker安装方式</u>


1,创建用户并启动es

注意1:ES启动默认会占用1G以上 内存 修改config/jvm.options 下的 -Xms512m -Xmx1g 参数
注意1:es5之后的都不能使用添加启动参数或者修改配置文件等方法启动了,必须要创建用户 。

启动报错,以及一些坑爹结果办法

2, https://juejin.im/post/5cb81bf4e51d4578c35e727d

3, https://www.jianshu.com/p/7903f5f741a5

创建用户:

#添加用户
adduser elasticsearch
#设置密码
passwd elasticsearch
#授权
chown -R elasticsearch elasticsearch-7.6.2
su elasticsearch
#启动
bin/elasticsearch

启动成功后就可以在访问127.0.0.1:9200 响应了json数据。

后台运行以及停止:

#-d 守护进程启动;-p 指定保存pid的文件名称
bin/elasticsearch -d -p pid.txt
#停止
pkill -F pid

https://www.elastic.co/guide/en/elasticsearch/reference/current/starting-elasticsearch.html

2,安装elasticsearch-head

下载项目代码到本地,然后在项目根目录npm install,然后npm run start即可。

访问地址 http://localhost:9100/

跨域问题以及如何外网访问,修改配置文件config/elasticsearch.yml

network.host: 0.0.0.0  # 内外网都可以访问,默认就127.0.0.1:9200可以

#以下两个配置是安装elasticsearch-head需要配置的跨域
# 开启跨域访问支持,默认为false
http.cors.enabled: true
# # 跨域访问允许的域名地址,(允许所有域名)以上使用正则
http.cors.allow-origin: "*"

3,安装kibana

解压压缩包,修改config/kibana.yml 中的es主机地址(字段elasticsearch.hosts),然后运行bin目录下的可执行文件,<u>自带了node环境</u>。

访问地址http://localhost:5601/ 默认打开是英文的,可以配置为中文,修改kibana.yml中的i18n.locale字段的值为zh-CN

linux下可以使用rpm的安装方式来后台,或者安装service,或者nohup bin/kibana >> /dev/null 2>&1 &

*停止:查询pid然后kill ps -ef | grep kibana*

默认只能本地访问,修改配置文件kibana.yml中的server.host: "0.0.0.0"

https://www.elastic.co/guide/en/kibana/current/rpm.html

4,安装创建ik分词器

解压后将所有文件放到elasticsearch的plugins/ik/ 目录下。

二,使用

1,elasticsearch

基本概念

mysqlelasticsearch
databaseindex
tabletype(类型),7.x标记为过时,8.x会本剔除
rowsdocument
columnfile
schemamapping

2,ik分词器

GET _analyze
{
  "analyzer": "ik_smart",
  "text": "使用编辑器键入请求并将它们提交到 Elasticsearch"
}

GET _analyze
{
  "analyzer": "ik_max_word",
  "text": "使用编辑器键入请求并将它们提交到 Elasticsearch"
}

ik分词器的两个算法ik_max_wordik_smartik_max_word最大分词,尽可能的多的拆分出词。ik_smart智能分词。

ik分词器添加自定义字典:

plugins/ik/config/目录下创建mydict.dic文件,在里面写自定义的词,一行一个。修改同级目录下的IKAnalyzer.cfg.xml配置文件,添加<entry key="ext_dict">mydict.dic</entry>

<properties>
    <comment>IK Analyzer 扩展配置</comment>
    <!--用户可以在这里配置自己的扩展字典 -->
    <entry key="ext_dict">mydict.dic</entry>
     <!--用户可以在这里配置自己的扩展停止词字典-->
    <entry key="ext_stopwords"></entry>
    <!--用户可以在这里配置远程扩展字典 -->
    <!-- <entry key="remote_ext_dict">words_location</entry> -->
    <!--用户可以在这里配置远程扩展停止词字典-->
    <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>

3,Rest风格操作

方法url描述
PUThotstname:9200/索引名称/类型名称/文档id创建文档并指定id
POSThotstname:9200/索引名称/类型名称创建文档(随机id)
POSThotstname:9200/索引名称/类型名称/文档id/_update修改文档
DELETEhotstname:9200/索引名称/类型名称/文档id删除文档
GEThotstname:9200/索引名称/类型名称/文档id通过id查询文档
POSThotstname:9200/索引名称/类型名称/_search查询所有数据

官网文档地址 https://www.elastic.co/guide/en/elasticsearch/reference/7.6/rest-apis.html

ex:

3.1,增删改

创建
PUT /test/type1/2
{
  "name":"张三",
  "age":"109"
}
查询
GET /test/type1/2

PUT my_index
{
  "mappings": {
    "properties": {
      "tags": {
        "type":  "keyword"
      }
    }
  }
}

修改
POST /test/type1/2/_update
{
 "doc":{
   "name":"张三三"
 }
}

删除 
DELETE /test2

关键字数据类型 https://www.elastic.co/guide/en/elasticsearch/reference/current/keyword.html

keyword类型的不会被解析拆分

3.2,查询

查询官网的详细文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/search.html

添加一些数据
PUT /studyes/users/1
{
  "name":"Ruanun",
  "age":13,
  "desc":"一顿操作猛如虎,一看工资2500。",
  "tags":["java", "宅", "影视", "直男"]
}

PUT /studyes/users/2
{
  "name":"张三",
  "age":19,
  "desc":"法外狂徒。",
  "tags":["吊炸天", "活泼"]
}

PUT /studyes/users/3
{
  "name":"大漠",
  "age":3,
  "desc":"木瓜大盗",
  "tags":["吊炸天", "活泼"]
}

PUT /studyes/users/4
{
  "name":"张五",
  "age":6,
  "desc":"张武很牛逼",
  "tags":["吊炸天"]
}

简单查询

GET /studyes/users/_search?q=name:张

_score字段,表示成绩,匹配度。越大越匹配。

结果:

{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 0.6548753,
    "hits" : [
      {
        "_index" : "studyes",
        "_type" : "users",
        "_id" : "2",
        "_score" : 0.6548753,
        "_source" : {
          "name" : "张三",
          "age" : 19,
          "desc" : "法外狂徒。",
          "tags" : [
            "吊炸天",
            "活泼"
          ]
        }
      },
      {
        "_index" : "studyes",
        "_type" : "users",
        "_id" : "4",
        "_score" : 0.6548753,
        "_source" : {
          "name" : "张五",
          "age" : 6,
          "desc" : "张武很牛逼",
          "tags" : [
            "吊炸天"
          ]
        }
      }
    ]
  }
}

过滤额结果字段:

GET /studyes/users/_search
{
  "query": {
    "match": {
      "name": "张三"
    }
  }
  , "_source": ["name", "age"]
}

只显示name,age字段。

排序:

GET /studyes/users/_search
{
  "query": {
    "match": {
      "name": "张三"
    }
  },
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ]
}

age字段降序

分页:

"from": 0, 从哪一条开始
"size": 20,每一页多少条记录

多个条件:

GET /studyes/users/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "张三"
          }
        },
        {
          "match": {
            "age": 9
          }
        }
      ]
    }
  }
}

must(and):并且的条件;should(or):或者;must_not(not):不是xxx。

过滤:

GET /studyes/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "张三"
          }
        }
      ],
      "filter": [
        {
          "range": {
            "age": {
              "gte": 1,
              "lte": 200
            }
          }
        }
      ]
    }
  }
}

age:1~200

gt 大于,gte 大于等于,lt 小于,lte 小于等于!

多个条件,满足一个就ok:以空格分隔

GET /studyes/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "tags": "吊 男"
          }
        }
      ]
    }
  }
}

match:会使用分词器解析;term :直接查询精确的

查询结果高亮(highlight):

GET /studyes/_search
{
  "query": {
    "match": {
      "name": "张"
    }
  },
  "highlight": {
    "fields": {
      "name": {}
    }
  }
}

默认是家里em标签"<em>张</em>三三"

自定义高亮标签:

GET /studyes/_search
{
  "query": {
    "match": {
      "name": "张"
    }
  },
  "highlight": {
    "fields": {
      "name": {}
    },
    "pre_tags": "<p class='highlight' style='color:red'>",
    "post_tags": "</p>"
  }
}

结果: "<p class='highlight' style='color:red'>张</p>三"

4,客户端

es官方文档:https://www.elastic.co/guide/en/elasticsearch/client/index.html

springboot引入依赖

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

注意修改版本,保持和你安装的es版本一直

<elasticsearch.version>7.6.2</elasticsearch.version>

目前网络上的教程几乎都是使用es的transportClient,但是在es8开始就废弃transportClient了。目前推荐使用restClient进行增删改查。

application.yml中配置信息:

spring:
  elasticsearch:
    rest:
      uris: http://192.168.18.137:9200
      connection-timeout: 5s
      read-timeout: 30s

urls是list,支持配置多个。uris: ["http://192.168.18.137:9200", "http://192.168.18.137:9200"]

网搜到的教程基本都是spring.data.elasticsearch.cluster-nodes这样配置的,这个已经过时了。

  • 使用时实现ElasticsearchCrudRepository接口来操作,复杂的使用ElasticsearchRestTemplate
  • 在使用es7的时候统一使用ElasticsearchRestTemplate或者ElasticsearchCrudRepository来操作。也不要使用ElasticsearchTemplate。