Docker 安装 elasticsearch 和操作

一:elasticsearch: Docker方式安装
# 1.获取镜像
docker pull elasticsearch:7.14.0
2.运行es
docker run -d -e ES_JAVA_POTS="-Xms256m -Xmx256m"  -e "discovery.type=single-node" -p 9200:9200  -p 9300:9300 --name es elasticsearch:7.14.0

//映射对应的分词器

docker run -v /root/es/ik-7.14.0:/usr/share/elasticsearch/plugins/ik-7.14.0 -d -e ES_JAVA_POTS="-Xms256m -Xmx256m" -e "discovery.type=single-node" -p 9200:9200 -p 9300:9300 --name es elasticsearch:7.14.0

//问题解决:
https://blog.csdn.net/qq_43308337/article/details/90069371
sysctl -w vm.max_map_count=262144
sysctl -a|grep vm.max_map_count
在 /etc/sysctl.conf文件最后添加一行
vm.max_map_count=262144
source sysctl.conf
docker logs -f es
3.访问ES
curl http://localhost:9200/

二:Docker方式安装kibana


1.获取镜像
docker pull kibana:7.14.0
#2.运行 kibana
docker run -d --name kibana -p 5601:5601 kibana:7.14.0

# 3.进入客器连接到ES.重启k1bana容器,访问 htt0://10.15 8.3:5581

# 4.基于数据卷加战配置文件方式运行
docker run -d --name kibana -p 5601:5601 -v /root/config:/usr/share/kibana/config kibana:7.14.0

三:elasticsearch 索引

# 1 查询索引 -v 格式化显示

GET /_cat/indices?v

# 2 创建索引
PUT /products

PUT /orders
{
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 0
  }
}
# 3 删除索引
DELETE /products

四:elasticsearch 映射

映射 类型:
字符串类型:keyword  text
数字类型:integer long
小数类型:float double
布尔类型:boolean
日期类型:date

// 创建映射类型

PUT /products
{
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 0
  },
  "mappings": {
    "properties": {
        "id":{
            "type":"integer"
        },
        "title":{
            "type":"keyword"
        },
        "price":{
            "type":"double"
        },
        "created_at":{
            "type":"date"
        },
        "description":{
            "type":"text"
        }
    }
  }
}
五:elasticsearch  文档

# 1 添加文档  手动 指定文档id
POST /products/_doc/2
{
    "title":"iphon13",
    "price":13.4,
    "created_at":"2022-04-24",
    "description":"很好用"
}
# 2 添加文档  自动创建文档id
POST /products/_doc/
{
    "title":"iphon12",
    "price":13.4,
    "created_at":"2022-04-24",
    "description":"很好用"
}

# 3文档查询:
GET /products/_doc/5

# 4 删除文档
DELETE /products/_doc/1

# 5 更新文档 这种方式:删除、原始文档 从新开始添加
PUT /products/_doc/4QyYWoAB69iYBBWP7pcr
{
  "title":"小浣熊"
}

# 6 更新文档 这种方式:基于指定字段更新 是先把老的查出来 再更新对应的字段
POST /products/_doc/4gyfWoAB69iYBBWPm5f1/_update
{
  "doc" :{
      "title":"iphone15"
  }
}

#  7 文档批量操作
# 批量添加:
POST /products/_doc/_bulk
{"index":{"_id":4}}
  {"title":"小浣熊1","price":13.4,"created_at":"2022-04-24","description":"很好用"}
{"index":{"_id":5}}
  {"title":"小浣熊2","price":13.4,"created_at":"2022-04-24","description":"很好用"}
  
# 8 批量添加 更新 删除
POST /products/_doc/_bulk
{"index":{"_id":6}}
  {"title":"小浣熊1","price":13.4,"created_at":"2022-04-24","description":"很好用"}
{"update":{"_id":5}}
  {"doc":{"title":"小鱼肚父" }}
{"delete":{"_id":4}}

六:高级查询query DSL :

语法:
 get /索引名/_doc/_search {json 格式请求体数据}
 get /索引名/_search {json 格式请求体数据}
# 1 query DSL 语法 查询所有 match_all
GET /products/_doc/_search
{
  "query":{
    "match_all":{}
  }
}
# 2 query DSL 语法  关键词查询 (term)
# keyword 类型 搜索 要搜索全部内容,不分词
# text 类型 默认 es 标准分词器 中文单子分词  英文 单词分词
GET /products/_search
{
  "query": {
    "term": {
      "title": {
        "value": "小鱼肚父"
      }
    }
  }
}

#3 query DSL 语法  范围查询 (range)
GET /products/_search
{
  "query": {
    "range": {
      "price": {
        "gte": 0,
        "lte": 20
      }
    }
  }
}
# 4 query DSL 语法  前缀查询 (prefix)
GET /products/_search
{
  "query": {
    "prefix": {
      "title": {
        "value": "小浣"
      }
    }
  }
}
#5 query DSL 语法  通配符查询 (wildcard)?用来匹配一个任意字符 * 用来匹配多个任意字符
GET /products/_search
{
  "query": {
    "wildcard": {
      "title": {
        "value": "小*"
      }
    }
  }
}

#6 query DSL 语法 多id查询
GET /products/_search
{
  "query": {
    "ids": {
      "values": ["5","6"]
    }
  }
}
#7 query DSL 语法 模糊查询 (fuzzy)
# 最大模糊错误 必须在0-2 之间
# 搜索关键词长度为2 不允许存在模糊
# 搜索关键词长度为3-5 允许1次模糊
# 搜索关键词长度大于5  不允最大2模糊
GET /products/_search
{
  "query": {
    "fuzzy": {
      "title": "小浣熊"
    }
  }
}
# 8布尔查询[bool]
# bool关键字:用来组合多个条件实现复杂查询
# must:相当于&&同时成立
# should:相当于成立一个就行
#must_not:相当于!不能满足任何一个
GET /products/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "ids":{
            "values": [1]
          }
          
        },
        {
          "term": {
            "title": {
              "value": "小浣熊"
            }
          }
        }
      ]
    }
  }
}

# 9 多字段查询 (multi_match)
GET /products/_search
{
  "query": {
    "multi_match": {
      "query": "很好用",
      "fields": ["title","description"]
    }
  }
}

# 10 默认字段分词查询 (query_string)
GET /products/_search
{
  "query": {
    "query_string": {
      "default_field": "description",
      "query": "很"
    }
  }
}

七:elasticsearch  分页查询

# 1 返回指定条数(size)
GET /products/_search
{
  "query": {
    "query_string": {
      "default_field": "description",
      "query": "很"
    }
  },
  "highlight": {
    "pre_tags": ["<span style='color:red;'> "], 
    "post_tags":["/span>"], 
    "fields": {
      "*":{}
    }
  },
  "size": 2
  
}
# 2 分页查询(form)
GET /products/_search
{
  "query": {
    "query_string": {
      "default_field": "description",
      "query": "很"
    }
  },
  "highlight": {
    "pre_tags": ["<span style='color:red;'> "], 
    "post_tags":["/span>"], 
    "fields": {
      "*":{}
    }
  },
  "from": 2, 
  "size": 2
  
}
# 3 指定字段排序(sort)
GET /products/_search
{
  "query": {
    "query_string": {
      "default_field": "description",
      "query": "很"
    }
  },
  "highlight": {
    "pre_tags": ["<span style='color:red;'> "], 
    "post_tags":["/span>"], 
    "fields": {
      "*":{}
    }
  },
  "from": 0, 
  "size": 7,
  "sort": [
    {
      "price": {
        "order": "asc"
      }
    }
  ]
  
}
# 4 返回指定字段(_souce)
GET /products/_search
{
  "query": {
    "query_string": {
      "default_field": "description",
      "query": "很"
    }
  },
  "highlight": {
    "pre_tags": ["<span style='color:red;'> "], 
    "post_tags":["/span>"], 
    "fields": {
      "*":{}
    }
  },
  "from": 0, 
  "size": 7,
  "sort": [
    {
      "price": {
        "order": "asc"
      }
    }
  ],
  "_source": ["title","price"]
  
}

八:elasticsearch   索引原理

倒排索引
(Inverted  Index)也叫反向索引,有反向索引必有正向索引。
通俗地来讲,正向索引是通过key找value,反向索引则是通过value找key。ES底层在检索时底层使用的就是倒排索引。
索引模型
现有索引和映射如下:
{
    "products”:{
        "mappings":{
            "properties":{
                "description":{"type":"text"},
                "price":{"type":"float"},
                "title":{"type" : "keyword"}
            }
        }
    }
}

九:elasticsearch   分词器

Analysis和Analyzer
Analysis:文本分析是把全文本转换一系列单词(term/token)的过程,也叫分词
(Analyzer)。Analysis是通过Analyzer来实现的。分词就是将文档通过Analyzer分成一个一个的 Term(关键词查询),每一个Term都指向包含这个Term的文档"。

Analyzer组成

●注意:在ES中默认使用标准分词器:StandardAnalyzer特点:中文单字分词  英文单词分词
我是中国人this is good man-->analyzer->我 是 中 国 人 this is good man

分析器(analyzer)都由三种构件组成的:character filters , tokenizers , token filters.

character filter 字符过滤器:
。在一段文本进行分词之前,先进行预处理,比如说最常见的就是,过滤html标签
(<span>hello<span>…> hello),&-->and (I&you--> I and you) 
tokenizers 分词器:
英文分词可以根据空格将单词分开,中文分词比较复杂,可以采用机器学习算法来分词。
Token filters Token过滤器:
将切分的单词进行加工。大小写转换(例将“Quick”转为小写),去掉停用词(例如停用词像“a”、“and”、“the”等等),加入同义词(例如同义词像“jump”和“leap”。
 注意:
三者顺序:Character Filters…>Tokenizer-->Token Filter
三者个数:Character Filters(0个或多个)+Tokenizer+TokenFilters(0个或多个)
----------------------------------------------------------------------------------------------------------
内置分词器
standard Analyzer       默认分词器,英文按单词分词,并小写处理 中文单字分词
simple   Analyzer       按照单词分词  英文统一转小写 去掉符号,中文按照空格分词。
stop     Analyzer       小写处理,停用词过滤(the,a,is)
whitespace Analyzer     按照空格切分,不转小写 不去掉标点符号
keyword   Analyzer     不分词,直接将输入当作输出

内置分词器测试

1 标准分词器:
# 标准分词器: 默认standard
PUT /tests
{
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 0
  },
  "mappings": {
    "properties": {
        "description":{
            "type":"text",
            "analyzer": "standard"
        }
    }
  }
}
PUT /tests
{
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 0
  },
  "mappings": {
    "properties": {
        "description":{
            "type":"text",
            "analyzer": "whitespace"
        }
    }
  }
}

中文分词器:
在ES中支持中文分词器非常多如smartCNIK等,推荐的就是IK分词器。
安装IK
开源分词器lk的github: https://github.com/medcl/elasticsearch-analysis-ik
注意:IK分词器的版本要你安装ES的版本一致
注意:Docker容器运行ES安装插件目录为 /usr/share/elasticsearch/plugins
# 1.下载对应版本
.[es0linux~] wget 
https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.14.0/elasticsearch-analysis-ik-7.14.0.zip
# 2.解压
-[es@linux~1S unzip elasticsearch-analysis-ik-6.2.4.zip #先使用yuminstall -yunzip
#3.移动到es安装目录的plugins目录中
[es0linux~]$ 1s elasticsearch-6.2.4/plugins/
[esPlinux~1s mv elasticsearch elasticsearch-6.2.4/plugins/
[es@linux~]$ 1s elasticsearch-6.2.4/plugins/ elasticsearch
[eselinux~]S 1s elasticsearch-6.2.4/plugins/elasticsearch/
    commons-codec-1.9.jar config httpclient-4.5.2.1arplugin-descriptor.properties
    commong-logging-1.2.jar elasticsearch-analynis-1k-6.2.4.jar httpcore-4.4.4.1ar 自动 2.0x 
    
# ik 2种
# ik_smart :会做最粗粒度的拆分
# ik_max_word :将文本做最细粒度的拆分
POST /_analyze
{
  "analyzer": "ik_max_word",
  "text": "中华人民共和国国歌"
}
PUT /tests
{
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 0
  },
  "mappings": {
    "properties": {
        "description":{
            "type":"text",
            "analyzer": "ik_max_word"
        }
    }
  }
}

    
=========================================
扩展词、停用词配置
IK支持自定义 扩展词典 和 停用词典
扩展词典:就是有些词并不是关键词,但是也希望被ES用来作为检索的关键词,可以将这些
词加入扩展词典。
停用词典:就是有些词是关键词,但是出于业务场景不想使用这些关键词被检索到,可以将这些词放入停用词典。

定义扩展词典和停用词典可以修改IK分词器中config目录中 IKAnalyzercfg.xml 这个文件。
1.修改vim IKAnalyzer.cfg.xml

<?xmlversion="1.0"encoding=“UTF-8"?>
<!DOCTYPE properties SYSTEM"http://java.sun.com/dtd/properties.dtd"><properties>
<comment>IK Analyzer 扩展配置</comment><!--用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict">ext dict.dic</entry><!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords">ext_stopword.dic</entry></properties>

===================
过滤查询:
过滤查询
<filter query>,其实准确来说,ES中的查询操作分为2种:查询(query)和过滤(filter)。
查询即是之前提到的query查询,它(查询)默认会计算每个返回文档的得分,然后根据得分排序。
而过滤(filter)只会筛选出符合的文档,并不计算得分,而且它可以缓存文档。所以,单从性能考虑,过滤比查询更快。换句话说过滤适合在大范围筛选数据,而查询则适合精确匹配数据,一般应用时,,应先使用过滤操作过谑数据,,然后使用查询匹配数据。
使用:
GET /ems/emp/_search
"query":("bool":{"must*:[
("match_al1":{}} //查询条件],
"filter":{....} //过滤条件
)
·注意:
在执行filter和query时先执行filter在执行query
Elasticsearch会自动缓存经常使用的过滤器,以加快性能
常见过滤类型有: 
term  匹配字段
terms   多个字段
ranage  范围过滤
exists  存在字段的过滤
dis 等filter。

十:springboot 整合:

整合应用
1 引入依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

2 配置客户端
@Configuration
public class RestClientConfig extends AbstractElasticsearchConfiguration{
    
    @Override
    @Bean
    public RestHighLevelClient elasticsearchClient(){
        final ClientConfiguration clientConfiguration=ClientConfiguration.builder()
                                                .connectedTo(17216.9110:9208")
                                                .build();
    return RestClients.create(clientConfiguration).rest();
    }
}

-------

客户端对象
ElasticsearchOperations
RestHighLevelClient推荐
ElasticsearchOperations
特点:始终使用面向对象方式操作ES
索引:用来存放相似文档集合
映射:用来决定放入文档的每个字段以什么样方式录入到ES中字段类型分词器.
文档:可以被索引最小单元ison数据格式

注:以上为es 初步探索内容

猜你喜欢

转载自blog.csdn.net/weixin_37855495/article/details/124497557