ElasticSearch 7 学习记录
date
May 20, 2023
slug
ES7-learn
status
Published
tags
ElasticSearch
summary
ElasticSearch 7 概念、API、集成 Spring学习记录
type
Post
Language
安装
sudo mkdir elasticsearch
cd elasticsearch
# 安装 IK 分词器(版本必须与 ES 保持一致)
sudo mkdir -p plugins/ik
cd plugins/ik
sudo wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.6.2/elasticsearch-analysis-ik-7.6.2.zip
sudo unzip elasticsearch-analysis-ik-7.6.2.zip
cd ../../
# 配置文件夹权限
sudo mkdir data
sudo chown -R 1000:root data
sudo chown -R 1000:root plugins启动
# docker-compose.yaml
version: '3.3'
services:
elasticsearch:
image: elasticsearch:7.6.2
container_name: elasticsearch
environment:
- "cluster.name=elasticsearch" #设置集群名称为elasticsearch
- "discovery.type=single-node" #以单一节点模式启动
- "ES_JAVA_OPTS=-Xms128m -Xmx256m" #设置使用jvm内存大小
volumes:
- ./plugins:/usr/share/elasticsearch/plugins #插件文件挂载
- ./data:/usr/share/elasticsearch/data #数据文件挂载
ports:
- 8200:9200
- 8300:9300 sudo docker-compose up -d测试
GET http://es:8200/_analyze
{
"analyzer": "ik_max_word",
"text": "安装 IK 分词器"
}- ik_max_word: 会将文本做最细粒度的拆分
- ik_smart: 会做最粗粒度的拆分
概念
- Index: 索引,类似于关系型数据库中的数据库
- Mapper: 映射,类似于关系型数据库中的数据表结构
- Document: 文档,类似于关系型数据库中的数据
- Filed:字段,类似于关系型数据库中的表字段
- Cluster: 集群
- Node: 节点
类型
字符串:
- text 用于全文索引,该类型的字段将通过分词器进⾏分词
- keyword 不分词,只能搜索该字段的完整的值
数值型
- long, integer, short, byte, double, float, half_float, scaled_float
数值型 boolean
- boolean
二进制
- binary 该类型的字段把值当做经过 base64 编码的字符串,默认不存储,且不可搜索
范围类型
- 范围类型表示值是一个范围,而不是⼀个具体的值
- integer_range, float_range, long_range, double_range, date_range
- 比如 age 的类型是 integer_range,那么值可以是 {"gte" : 20, "lte" : 40};搜索 "term" : {"age": 21} 可以搜索该值
日期
- date 由于 JSON 没有 date 类型,所以 ES 通过识别字符串是否符合 format 定义的格式来判断是否为date类型
- format默认为:strict_date_optional_time||epoch_millis
- "2022-01-01" "2022/01/01 12:10:30" 这种字符串格式
创建 index
# 创建名为 hello 的索引
PUT http://es:8200/hello创建 mapper
PUT http://es:8200/hello/_mapping
{
"properties": {
"title": {
"type": "text"
},
"name": {
"type": "keyword"
}
}
}创建 doc
POST http://es:8200/hello/_doc
{
"title": "ES7教程",
"name": "hello"
}搜索
Term 精确搜索
term查询被用于精确值匹配,这些精确值可能是数字、时间、布尔或者那些not_analyzed的字符串
term查询对于输入的文本不分析 ,所以它将给定的值进行精确查询
{
"query":{
"term":{
"name": "hello"
}
}
}Terms 多值精确搜索
terms查询和term查询一样,但它允许你指定多值进行匹配,如果这个字段包含了指定值中的任何一个值,那么这个文档满足条件
{
"query":{
"terms":{
"name": ["hello", "world"]
}
}
}Match 匹配搜索
- 无论你在任何字段上进行的是全文搜索还是精确查询,
match查询是你可用的标准查询
- 如果你在一个全文字段上使用
match查询,在执行查询前,它将用正确的分析器去分析查询字符串
- 如果在一个精确值的字段上使用它,例如数字、日期、布尔或者一个
not_analyzed字符串字段,那么它将会精确匹配给定的值
{
"query":{
"match":{
"name":"hello"
}
}
}提高精度
可以使用
match 查询的 operator 参数来控制精度。默认情况下,match 查询使用 OR 操作符将查询字符串中的词汇与文档中的词汇进行匹配。但是,您可以使用 and 操作符将查询字符串中的词汇视为必须匹配的所有单词。{
"query": {
"match": {
"title": {
"query": "BROWN DOG!",
"operator": "and"
}
}
}
}控制精度
match 查询支持 minimum_should_match 最小匹配参数,这让我们可以指定必须匹配的词项数用来表示一个文档是否相关。我们可以将其设置为某个具体数字,更常用的做法是将其设置为一个百分数,因为我们无法控制用户搜索时输入的单词数量。
{
"query": {
"match": {
"title": {
"query": "quick brown dog",
"minimum_should_match": "75%"
}
}
}
}Multi_Match 多字段匹配搜索
multi_match查询可以在多个字段上执行相同的match查询
{
"query": {
"multi_match": {
"query": "hello",
"fields": [
"name",
"title"
]
}
}
}Match_All 全部搜索
{
"query":{
"match_all":{
}
}
}Rage 范围搜索
range查询找出那些落在指定区间内的数字或者时间
- 被允许的操作符如下
gt大于gte大于等于lt小于lte小于等于
{
"query":{
"range":{
"name":{
"gte": 1
}
}
}
}组合多查询
bool 查询
可以用
bool 查询来实现你的需求。这种查询将多查询组合在一起,成为用户自己想要的布尔查询。它接收以下参数must文档必须匹配这些条件才能被包含进来。此条件会影响评分_score
must_not文档必须不匹配这些条件才能被包含进来。此条件不会影响评分_score
should如果满足这些语句中的任意语句,将增加_score,否则,无任何影响。它们主要用于修正每个文档的相关性得分。
filter必须匹配,但它不影响评分_score、过滤模式来进行。这些语句对评分没有贡献,只是根据过滤标准来排除或包含文档。
constant_score 查询
- 尽管没有
bool查询使用这么频繁,constant_score查询也是你工具箱里有用的查询工具。它将一个不变的常量评分应用于所有匹配的文档。它被经常用于你只需要执行一个 filter 而没有其它查询(例如,评分查询)的情况下。
- 可以使用它来取代只有 filter 语句的
bool查询。在性能上是完全相同的,但对于提高查询简洁性和清晰度有很大帮助
{
"constant_score": {
"filter": {
"term": { "category": "ebooks" }
}
}
}