SQL:like %查询内容%,如果是大数据,就算有索引也十分慢
https://mirrors.huaweicloud.com/elasticsearch/?C=N&O=D
下载解压即可
bin:启动文件
config:配置文件
log4j2:日志配置文件
jvm.options java虚拟机相关配置
elesticsearch.yml 配置文件!默认9200端口
plugins:插件
启动:点击bin/elasticsearch.bat,然后再浏览器访问http://127.0.0.1:9200/,出现以下
{
"name" : "DESKTOP-0U1AJ4S",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "AzTUTxy6Sbq1-j-jU1A2rw",
"version" : {
"number" : "7.2.0",
"build_flavor" : "default",
"build_type" : "zip",
"build_hash" : "508c38a",
"build_date" : "2019-06-20T15:54:18.811730Z",
"build_snapshot" : false,
"lucene_version" : "8.0.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
下载地址:https://github.com/mobz/elasticsearch-head/ (需要先安装npm)
#使用cnpm安装依赖
cnpm install
或者npm install
#启动
npm run start
#打开C:\tools\ES\elasticsearch-7.2.0\config\elasticsearch.yml,在最后追加
http.cors.enabled: true
http.cors.allow-origin: "*"
#保存,重启ES服务,访问http://localhost:9100/
点击连接,显示:集群健康值: green (0 of 0)
版本要一致https://mirrors.huaweicloud.com/kibana/7.2.0/?C=N&O=D
解压后打开bin/kibana.bat,访问 http://localhost:5601
汉化
C:\tools\ES\kibana-7.2.0-windows-x86_64\config\kibana.yml中追加
i18n.locale: "zh-CN"
与ES版本一致https://github.com/medcl/elasticsearch-analysis-ik/tree/v7.2.0
Relational DB | Elasticsearch |
---|---|
数据库(database) | 索引(indices) (就和数据库一样) |
表(tables) | types (逐渐会被弃用) |
行(rows) | documents (文档) |
字段(columns) | fields |
索引是映射类型的容器,es中的索引是一个非常大的集合。索引存储了映射类型的字段和其他设置,然后它们被存储到各个分片上
- 一个集群至少有一个节点,而一个节点就是一个es进程,节点可以有多个默认索引,如果创建索引,那么索引将会有5个分片(primary shard,又称主分片)构成的,每一个主分片都会有一个副本(replica shard,又称复制分片
- 主分片和对应的复制分片都不会在同一个节点内,这样有利于某个节点挂掉了,数据也不至于丢失。
- 实际上,一个分片是一个Lucene索引,一个包含倒排索引的文件目录,倒排索引的结构使得ES在不扫描全部文档的情况下,就能告诉我们哪些文档包含特定的关键字
如通过博客标签来搜索博客文章,那么倒排索引就是这样一个结构
博客文章(原始数据) | 索引列表(倒排索引) | ||
---|---|---|---|
博客文章ID | 标签 | 标签 | 博客文章ID |
1 | python | python | 1,2,3 |
2 | python | linux | 3,4 |
3 | linux,python | ||
4 | linux |
如果要搜索含有puthon标签的文章,那相对于查找所有的原始数据而言,查找倒排索引后的数据会快得多,只需要查看标签这一栏,然后获取相关的文章ID即可,完全过滤掉无关的所有数据,提高效率
倒排索引级文档分词成关键字与文档id之间的映射
分词:即把一段中文或者别的划分成一个个关键字,我么在搜素时会把自己的信息进行分词,会把数据库中或者索引库中的数据进行分词,然后进行一个匹配操作,默认的中文分词是将每一个分词看成一个词,比如"好好学习"会被分为"好",“好”,“学”,“习”,这显然是不符合要求得,所以我们需要安装中文分词器IK来解决问题。
IK提供了两个分词算法:ik_smart和ik_max_word,其中ik_smart为最少切分,ik_max_word为最细粒度划分
使用kibana测试,查看不同的分词效果
自己需要的词,需要手动加入到分词器的字典中
IK分词器增加自己的配置
<properties>
<comment>IK Analyzer 扩展配置comment>
<entry key="ext_dict">my.dicentry>
<entry key="ext_stopwords">entry>
properties>
method | url地址 | 描述 |
---|---|---|
PUT | localhost:9200/索引名称/类型名称/文档id | 创建文档(指定文档id) |
POST | localhost:9200/索引名称/类型名称 | 创建文档(随机文档id) |
POST | localhost:9200/索引名称/类型名称/文档id/_update | 修改文档 |
DELETE | localhost:9200/索引名称/类型名称/文档id | 删除文档 |
GET | localhost:9200/索引名称/类型名称/文档id | 查询文档通过文档id |
POST | localhost:9200/索引名称/类型名称/文档id/_search | 查询所有数据 |
基本测试
#在kibana中创建命令并执行
PUT /索引名/类型名/id
{请求体}
#执行后可在head插件中查看到创建的索引
2、类型
指定类型(创建规则)
#创建索引但没有创建字段,创建规则
PUT /test2
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"age": {
"type": "long"
},
"birthday": {
"type": "date"
}
}
}
}
#获取,可以查看具体的信息
GET test2
#_doc默认类型,具体类型在未来将会被弃用
PUT /test3/_doc/1
{
"name": "李四",
"age": 3,
"birth": "1993-2-11"
}
GET test3
#如果自己的文档没有指定,那么es就会给我们默认配置字段类型
#扩展:通过命令elasticsearch索引情况
GET _cat/health
1、还是使用PUT即可,然后执行覆盖(但是如果数据丢失,覆盖后会只有覆盖的数据)
2、使用POST
#通过DELETE命令实现删除,根据请求判断是删除索引还是删除文档记录
DELETE test1
基本操作
#1、添加记录
POST /test3/user/2
{
"name": "李四",
"age": 24,
"birth": "1993-2-11",
"tags": ["直男","成绩好"]
}
#2、获取,简单搜索(通过id)
GET /test3/user/1
#通过search
GET test3/user/_search?q=name:张三
#3、修改(推荐使用update的形式)
PUT /test3/user/3
{
"name": "anan",
"age": 23,
"birth": "1999-2-11",
"tags": ["美丽","成绩好"]
}
POST /test3/user/3/_update
{
"doc": {
"name": "anan123"
}
}
复杂查询搜索
#1、默认查询所有
GET test3/user/_search
{
"query": {
"match": {
"name": "李四"
}
}
}
#多个条件之间用空格隔开,只要满足其中一个就可以查出,这个时候可以通过score进行基本判断
GET test3/user/_search
{
"query": {
"match": {
"tags":"男 美丽"
}
}
}
#查询到的hit表示索引和文档的信息,查询的结果总数,然后就是查询出来的具体的文档,数据中的数据都可以遍历出来了
#2、结果过滤,只查询name,age
GET test3/user/_search
{
"query": {
"match": {
"name": "李四"
}
}
, "_source": ["name","age"]
}
#3、排序
#如按照年龄倒排并分页
GET test3/user/_search
{
"query": {
"match": {
"name": "李四"
}
},
"sort": [
{
"age": {
"order": "desc"
}
}
],
"from": 0,
"size": 2
}
#一般分页实现为/search/{current}/{pagesize}
#4、多条件查询
#must相当于and,should相当于or
GET test3/user/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "李四"
}
},
{
"match": {
"age": 24
}
}
]
}
}
}
#5、not 查询name不是李四的人
GET test3/user/_search
{
"query": {
"bool": {
"must_not": [
{
"match": {
"name": "李四"
}
}
]
}
}
}
#6、过滤器filter
gt大于 gte大于等于 lt小于 lte小于等于
#将查询结果按照年龄最大30,最小20的进行过滤
GET test3/user/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "李四"
}
}
],
"filter": {
"range": {
"age": {
"gte": 20,
"lte": 30
}
}
}
}
}
}
精确查询!
关于分词
关于分词*
两个类型:text keyword
#1、创建索引
PUT testdb
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"desc": {
"type": "keyword"
}
}
}
}
#2、put数据
PUT testdb/_doc/2
{
"name": "张三学习英语 name",
"desc": "张三学习英语 desc2"
}
#3、text没有被分词器解析,keyword表示一个整体
GET _analyze
{
"analyzer": "keyword",
"text": "张三学习英语name"
}
#将会被拆分
GET _analyze
{
"analyzer": "standard",
"text": "张三学习英语name"
}
#4、精确查询
#keyword类型的字段不会被分词器解析
GET testdb/_search
{
"query": {
"term": {
"name": "三"
}
}
}
GET testdb/_search
{
"query": {
"term": {
"desc": "张三学习英语 desc1"
}
}
}
#5、精确查询多个值
PUT testdb/_doc/3
{
"test1": "22",
"test2": "2021-5-19"
}
PUT testdb/_doc/4
{
"test1": "33",
"test2": "2021-5-20"
}
GET testdb/_search
{
"query": {
"bool": {
"should": [
{
"term": {
"test1": "22"
}
},
{
"term": {
"test1": "33"
}
}
]
}
}
}
高亮查询
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1BpmTter-1625021445261)(C:\Go\笔记\images\1621404848937.png)]
#采用自定义高亮条件
GET test3/user/_search
{
"query": {
"match": {
"name": "李四"
}
},
"highlight": {
"pre_tags": ""
,
"post_tags": "",
"fields": {
"name": {}
}
}
}