ElasticSearch8.8.2快速入门(一)

一、什么是搜索引擎?

根据用户需求和一定算法,运用特定的策略检索出指定信息反馈给用户的一门检索技术。

二、为什么使用搜索引擎?和MySQL比有哪些优势?

1、性能更加强大,亿级数据可以做到瞬间响应。

2、匹配部分关键字可以查询出结果。

3、关键字之间可以不连续。

4、匹配到的关键字可以高亮显示。

5、写错一两个字母或汉字也可以查询出结果。

6、输入框带有提示词。

ElasticSearch性能更高,功能更加强大,用户体验更好。

三、搜索引擎的底层原理——倒排索引

1、正排索引 可以快速地查找某个文档里包含哪些词项。

2、倒排索引 可以快速查找包含某个词项的文档有哪些。

倒排索引由两部分组成,文档列表和倒排索引区。

新增:向文档列表中新增一条记录,根据索引字段进行分词,把关键词和文档位置信息保存到倒排索引区。

查询:先对用户输入的条件进行分词,再根据分词结果在倒排索引区中找到关键词对应的位置信息列表,最后根据位置信息找到文档列表,将结果返回给用户。

四、docker安装elasticsearch和kibana

1、安装elasticsearch

rm -rf /opt/elasticsearch
mkdir -p /opt/elasticsearch/{config,plugins}
chmod -R 777 /opt/elasticsearch

cat <<EOF> /opt/elasticsearch/config/elasticsearch.yml
xpack.security.enabled: false
xpack.license.self_generated.type: basic
xpack.security.transport.ssl.enabled: false  # 不配报错
xpack.security.enrollment.enabled: true
http.host: 0.0.0.0
EOF

docker network create elastic

docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
--net elastic \
--restart=always \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms512m -Xmx512m" \
-v /opt/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /opt/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d docker.elastic.co/elasticsearch/elasticsearch:8.8.2

chmod -R 777 /opt/elasticsearch
# 1.设置java客户端访问es的密码
docker exec -it elasticsearch bin/elasticsearch-reset-password -u elastic  -i 
# 2.设置kibana客户端访问es密码
docker exec -it elasticsearch bin/elasticsearch-reset-password -u kibana_system -i  
# -i 表示自定义密码
# 回车之后输入各自密码,密码不要忘记了

2、安装kibana

Kibana是一个开源的分析与可视化平台,专为与Elasticsearch协同工作而设计。

通过ip地址:5601访问

docker run --name kibana \
--net elastic \
-v /opt/kibana/config:/usr/share/kibana/config \
-p 5601:5601 -d docker.elastic.co/kibana/kibana:8.8.2

cat <<EOF> /opt/kibana/config/kibana.yml
server.host: "0.0.0.0"  # 不配报错
server.shutdownTimeout: "5s"
elasticsearch.hosts: [ "http://ip地址:9200" ] # 输入自己的ip地址
elasticsearch.username: "kibana_system"  # 不能用 elastic 
elasticsearch.password: "123456"  # 注意:此处的密码改成自己设置的密码。
i18n.locale: "zh-CN"
EOF

docker restart kibana

# 登录kibana ,注意需要使用elastic 用户登录。不能使用 kibana_system 这个用户登录。

3、安装中文分词器

elasticsearch 默认的内置分词器对中文的分词效果可能并不理想,因为它们主要是针对英文等拉丁语系的文本设计的。如果要在中文文本上获得更好的分词效果,我们可以考虑使用中文专用的分词器。
IK 分词器是一个开源的中文分词器插件,特别为 Elasticsearch 设计和优化。它在中文文本的分词处理上表现出色,能够根据中文语言习惯进行精细的分词。                    

原文链接:https://blog.csdn.net/qq_39939541/article/details/131619209

# 1.把elasticsearch-analysis-ik-8.8.2.zip上传到/opt/elasticsearch/plugins目录
# 2.解压
unzip elasticsearch-analysis-ik-8.8.2.zip -d ik-analyzer
# 3.删除压缩包
rm -rf elasticsearch-analysis-ik-8.8.2.zip 
# 4.重启es容器
docker restart elasticsearch

五、elasticsearch相关概念

indices(index复数)索引库             相当于MySQL数据库

type类型                                相当于MySQL表      一个索引库只能有一个type,从7.x开始废弃了

document文档                       相当于MySQL行

field字段                                相当于MySQL列

mapping映射                         相当于MySQL约束

_id文档编号                           相当于MySQL的id主键

六、索引库的DSL

查看所有索引库

GET /_cat/indices

GET /_cat/indices?v

创建一个名为caibao的索引库,具有3个分片,2个副本

PUT /caibao
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 2
  }
}

删除索引库

DELETE /caibao 

 查看一个索引库的详细信息

GET /caibao

索引库不能修改! 

 七、映射相关DSL

创建映射

POST /caibao/_mapping
{
  "properties": {
   "title": {
      "type": "text",  //字符串有两种类型,分别为text和keyword,text表示分词,keyword表示不分词
      "index": true,     //默认为true,true为创建索引,可以不写
      "analyzer": "ik_max_word"  //选择ik分词器
    },
    "images": {
      "type": "keyword",
      "index": false
    },
    "price": {
      "type": "double"   //double类型的数字
    }
  }
}

查看映射

GET /caibao/_mapping

映射不能修改!只能删库,重新声明库和映射!

八、文档的CRUD

1、新增——增加一行数据

POST /caibao/_doc/1
{
  "title": "小米13手机",
  "images": "https://cdn.cnbj1.fds.api.mi-img.com/product-images/xiaomi-13kb7buy/3371.png?x-fds-process=image/resize,q_90,f_webp",
  "price": 3499
}

2、修改

覆盖更新,会导致数据丢失

POST /caibao/_doc/1
{
  "title": "小米14手机"  
}

 更新指定字段

POST /caibao/_update/1
{
  "doc": {
    "title": "小米14手机"
  }
}

3、删除

DELETE /caibao/_doc/1

4、查询

①匹配查询

匹配所有字段

GET /caibao/_search
{
  "query": {
    "match_all": {}
  }
}
//同GET /caibao/_search,默认10条结果分页

匹配单个字段 

GET /caibao/_search
{
  "query": {
    "match": {
      "FIELD": "TEXT"
    }
  }
}
//operator不指定时,默认为or,即查询使用的关键词要满足or的关系,or查询出的结果要比and范围更大
GET /caibao/_search
{
  "query": {
    "match": {
      "title": {
        "query": "小米手机",
        "operator": "and"    
      }
    }
  }
}

 匹配多个字段

GET /caibao/_search
{
  "query": {
    "multi_match": {
      "query": "小米手机",
      "fields": ["title","attr.brand"],
      "operator": "and"
    }
  }
}

②词条查询

查询条件是最小分词,直接去倒排索引区查询,一般用于过滤条件上。

GET /caibao/_search
{
  "query": {
    "term": {
      "ram": {
        "value": "8G"
      }
    }
  }
}
//多词条查询,词条间为or的关系
GET /caibao/_search
{
  "query": {
    "terms": {
      "ram": [
        "8G",
        "16G"
      ]
    }
  }
}

③模糊查询

输入有误也可以查询到结果,中文不支持模糊查询。

GET /caibao/_search
{
  "query": {
    "fuzzy": {
      "title": {
        "value": "oppe",
        "fuzziness": 2   //编辑距离取值:0/1/2
      }
    }
  }
}

④范围查询

GET /caibao/_search
{
  "query": {
    "range": {
      "price": {
        "gte": 1000,  // gte:大于等于  gt:大于
        "lte": 3000   // lte:小于等于  lt:小于
      }
    }
  }
}

⑤布尔查询(组合查询)

GET /caibao/_search
{
  "query": {
    "bool": {
      "must": [               //must:交集    must_not:非    should:并集
        {
          "match": {
            "title": "手机"
          },{
            "range": {
              "price": {
                "gte": 1000,
                "lte": 3000
              }
            }
          }
        }
      ]
    }
  }
}

⑥过滤

过滤不影响得分,不会改变原有的排名。过滤类似于where,影响查询结果的行数。

GET /caibao/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "title": "手机"
          }
        }
      ],
      "filter": [
        {
          "range": {
            "price": {
              "gte": 1000,
              "lte": 2000
            }
          }
        }
      ]
    }
  }
}

⑦排序

GET /caibao/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "title": "手机"
          }
        }
      ]
    }
  },
  "sort": [
    {
      "price": {
        "order": "desc"
      },
      "stock": {
        "order": "asc"
      }
    }
  ]
}

⑧分页

from:从哪一条开始显示——(页码-1)*pageSize

size:每页显示条数

GET /caibao/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "title": "手机"
          }
        }
      ]
    }
  },
  "sort": [
    {
      "price": {
        "order": "desc"
      },
      "stock": {
        "order": "asc"
      }
    }
  ],
  "from": 4,
  "size": 4
}

⑨高亮显示

GET /caibao/_search
{
  "query": {...},
  "sort": [...],
  "from": 4,
  "size": 4,
  "highlight": {
    "fields": {"title": {}},
    "pre_tags": "<em>",       //前置标签
    "post_tags": "</em>"      //后置标签
  }
}

⑩结果集过滤

类似于select+列名

GET /caibao/_search
{
  "query": {...},
  "sort": [...],
  "from": 4,
  "size": 4,
  "highlight": {
    "fields": {"title": {}},
    "pre_tags": "<em>",       
    "post_tags": "</em>"      
  },
  "_source": ["title","stock","images"]
}

GET /caibao/_search
{
  "query": {...},
  "sort": [...],
  "from": 4,
  "size": 4,
  "highlight": {
    "fields": {"title": {}},
    "pre_tags": "<em>",       
    "post_tags": "</em>"      
  },
  "_source": {
    "includes": [    //includes同上,excludes不包含
      "title",
      "stock",
      "images"
    ]
  }
}

⑪聚合

aggregation aggs   三要素:聚合名称,聚合类型,聚合字段

聚合为桶term:类似于group by

度量:聚合函数,max  sum  min  avg  count   top_hits

GET /caibao/_search
{
  "size": 0, 
  "aggs": {
    "brandAgg": {
      "terms": {
        "field": "attr.brand.keyword"
      },
      "aggs": {
        "categoryAgg": {
          "terms": {
            "field": "attr.category.keyword"
          }
        },
        "priceAvg": {
          "avg": {
            "field": "price"
          }
        },
        "priceSum": {
          "sum": {
            "field": "price"
          }
        },
        "priceMax": {
          "max": {
            "field": "price"
          }
        },
        "priceMin": {
          "min": {
            "field": "price"
          }
        },
        "priceStats": {
          "stats": {      //统计max  sum  min  avg  count
          "field": "price"
          }
        }
      }
    },
    "priceTop": {
      "top_hits": {    
        "size": 3,
        "sort": [
          {
            "price": {
              "order": "desc"
            }
          }
        ]
      }
    }
  }
}

  • 12
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值