美文网首页
ElasticSearch入门

ElasticSearch入门

作者: 程南swimming | 来源:发表于2020-06-16 15:19 被阅读0次

参考
https://blog.csdn.net/zhenwei1994/article/details/94013059

介绍

image.png

安装

Mac上安装ES可以有很多方法
brew update
brew install elasticsearch
查看安装信息
brew info elasticsearch
官网下载https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.1.zip
cd elasticsearch-5.5.1/  进入解压后的目录
/bin/elasticsearch  启动
访问[http://localhost:9200/](http://localhost:9200/)看到输出

启动

前台 elasticsearch
后台 elasticsearch -d
若是es的前台运行,则用ctrl + c来停止。
若是es的后台运行,则用kill 进程号来停止。

安装可视化界面`

使用

查看当前节点的所有 Index
curl -X GET 'http://localhost:9200/_cat/indices?v'
status:集群状态。集群共有green、yellow或red中的三种状态。green代表一切正常(集群功能齐全),yellow意味着所有的数据都是可用的,但是某些复制没有被分配(集群功能齐全),red则代表因为某些原因,某些数据不可用。如果是red状态,则要引起高度注意,数据很有可能已经丢失。
新建索引
curl -X PUT 'localhost:9200/weather'
删除索引
curl -X DELETE 'localhost:9200/weather'

创建索引的mapping
{
  "test_type": { # # 在index中创建一个新的type(相当于table)
      "properties": {
        "name": {  #field1
          "type": "string", #字段类型
          "analyzer": "ik_max_word",
          "index": "not_analyzed"
        },
        "age": {  #field2
          "type": "integer"
        }
      }
    }
  }

es支持的数据类型


image.png

增删改查https://www.ruanyifeng.com/blog/2017/08/elasticsearch.html

PUT {index}/{type}/{id}

如果我们要访问一个文档元数据应该包括囊括 index/type/id 这三种类型,很好理解。

curl -X PUT 'localhost:9200/accounts/person/1' -d '
{
  "user": "张三",
  "title": "工程师",
  "desc": "数据库管理"
}' 
请求路径是/accounts/person/1,最后的1是该条记录的 Id。它不一定是数字,任意字符串(比如abc)都可以。
新增记录的时候,也可以不指定 Id,这时要改成 POST 请求。
curl -X POST 'localhost:9200/accounts/person' -d '
{
  "user": "李四",
  "title": "工程师",
  "desc": "系统管理"
}'
服务器返回的 JSON 对象里面,_id字段就是一个随机字符串。
curl 'localhost:9200/accounts/person/1?pretty=true'
上面代码请求查看/accounts/person/1这条记录,URL 的参数pretty=true表示以易读的格式返回。
返回的数据中,found字段表示查询成功,_source字段返回原始记录。
curl -X DELETE 'localhost:9200/accounts/person/1'
更新记录就是使用 PUT 请求,重新发送一次数据。
curl -X PUT 'localhost:9200/accounts/person/1' -d '
{
    "user" : "张三",
    "title" : "工程师",
    "desc" : "数据库管理,软件开发"
}' 
记录的 Id 没变,但是版本(version)从1变成2,操作类型(result)从created变成updated
新建索引
curl -X PUT 'localhost:9200/weather'
{"acknowledged":true,"shards_acknowledged":true,"index":"weather"}

上手demo

ES是一个服务,采用C/S结构,用client连接

client-ES支持的客户端连接方式

1 REST API ,端口 9200

这种连接方式对应于架构图中的RESTful style API这一层,这种客户端的连接方式是RESTful风格的,使用http的方式进行连接

image

2 Transport 连接 端口 9300

  这种连接方式对应于架构图中的Transport这一层,这种客户端连接方式是直接连接ES的节点,使用TCP的方式进行连接
image
ES提供了多种编程语言客户端,java、python等
ES提供了两个JAVA REST client 版本:Java Low Level REST Client 和Java High Level REST Client
参考https://www.cnblogs.com/leeSmall/p/9218779.html
"localhost", 9200是es服务器所在的主机和端口
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>6.2.4</version> #请使用与服务端ES版本一致的客户端版本
</dependency>
RestHighLevelClient client = new RestHighLevelClient(
        RestClient.builder(
                new HttpHost("localhost", 9200, "http"),
                new HttpHost("localhost", 9201, "http")));

es分词

倒排索引的基础就是分词。所谓分词可以简单理解为将一个完整的句子切割为一个个单词的过程。es分词包含写时分词以及读分词


image.png
写分词

ES的默认分词设置是standard,这个在中文分词时就比较尴尬了,会单字拆分,比如搜索关键词“清华大学”,这时候会按“清”,“华”,“大”,“学”去分词,英文则是按照空格去分词。

  1. 设置mapping的时候,每个filed的type,analyzer,index分别代表什么意思?
    analyzer是指定分词器,如果不设置这个字段就是默认分词器
    index:是否索引,默认为true。如果你需要根据该字段进行查询或排序,则需要将该字段index设置为true,否则设置为false
  2. type设置为text,keyword分别代表什么意思?
    ----field设置为text会分词,keyword不会分词
    https://zhuanlan.zhihu.com/p/43072517
    5.X以上版本没有string类型了,换成了text和keyword作为字符串类型。
该指令可以查询text字段的分词结果
POST 索引/_analyze
{
  "field": "msg",
  "text": "Eating an apple a day keeps doctor away"
}

读时分词器默认与写时分词器默认保持一致

通过用户姓名搜索用户列表,名字必须完全匹配。如 输入 “贾跃” 不会检索出”贾跃亭“
6.0之前的操作
properties: {
          <column_name>: {type: string, index: not_analyzed}
     }
6.0之后:
指定type为keyword就可以了
那么想模糊搜索怎么办呢?

es查询

https://juejin.im/post/5d2d300b6fb9a07ec56ea9bb

curl 'localhost:9200/accounts/person/_search'  -d '
{
  "query" : { "match" : { "desc" : "软件" }}
}'
查询API

等值(term查询:QueryBuilders.termQuery(name,value);
多值(terms)查询:QueryBuilders.termsQuery(name,value,value2,value3...);
范围(range)查询:QueryBuilders.rangeQuery(name).gte(value).lte(value);
存在(exists)查询:QueryBuilders.existsQuery(name);
模糊(wildcard)查询:QueryBuilders.wildcardQuery(name,+value+);
组合(bool)查询: BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();

term结合bool使用时:should是或,must是与,must_not是非(还有一种filter)
text写分词:
默认分词器:中文按每个字,英文按空格
读分词器:
match会把查询条件分词,然后再去精确查找
term不会把查询条件分词,完全匹配搜索
wildcard是常用意义的模糊查询
(match代表匹配查询,包含单词即可;term是完全匹配查询,即不对搜索词进行分词器分析,文档中必须完整包含整个搜索词汇)

track应用:
1:mapping field设置为keyword写不会分词
2:精确查询用term,不要用match查中文(会使得包含每个字的都出现)
3:模糊查询用wildcard

问题:
1:建立索引的时候副本和分片怎么确认
2:分页查询 2.1from size
3:order by
4:limit

相关文章

网友评论

      本文标题:ElasticSearch入门

      本文链接:https://www.haomeiwen.com/subject/bexhxktx.html