面试问到Elasticsearch看这一篇就够了

一、

1、查询商品详情:缓存,因为商品详解
2、查询商品页面:ES,因为数据太多,模糊查询慢
3、商品详情页面做成html静态页面,是为了更好的被搜索引擎收录
4、ES如何与数据库实现数据同步?
5、为什么ES模糊搜索的时候,不管是商品名还是商品详情页面包括关键字的都会查出来?
分词聚合查询
6、kibana:有点像postman测试
7、PDMan:
8、ELK,logstash插件,日志收集
输入(读取本地文件或者连接数据库)
输出(json)
添加数据的时候会自动映射类型
PUT应该是修改,修改发现没有数据就自动添加
POST是添加
lucene语言
es把type移除
pansoso!!
高亮

倒排和分词的区别

网盘搜索引擎原理:采用ES存储抓取的数据、抓取服务器
日志不能存放到数据库里,数据库是放持久化的数据,日志可以放到mongdb,es,redis(过期删除)中
9、
10、
11、
12、
13、
14、
15、
16
pansoso

二、为什么使用Elasticsearch框架?6.4.3版本

默认占用IGB内存
可以处理PB级别的数据,1PB=1024TB
大型分布式日志分析系统ELK:
Elasticsearch(存储日志)+logstash(收集日志)+kibana(展示数据)

Elasticsearch存储结构:JSON
关系型数据库 数据库 表 行 列
ES 索引 类型 文档 字段

9300(HTTP协议):ES节点间通讯使用,http协议端口号
9200(接口形式):ES和外部通讯的端口号,192.168.212.180:9200/索引/类型/id访问ES

三、kibana可视化插件

默认5601端口

创建索引

PUT  /mymayikt
GET  /mymayikt
DELETE  /mymayikt

创建/修改文档(行) :version会+1,乐观锁

PUT /索引/类型/id
PUT /mymayikt/user/1?version=6
{
	"name":"lh",
	"age":21,
	"sex":0
}
GET  /mymayikt/user/1

分配默认ID

POST   /mymayikt/user/
{
	"name":"lh",
	"age":21,
	"sex":0
}

查询所有数据

GET /mymayikt/user/_search

查询映射
默认映射为long类型
String类型分为:text(分词)和keyword(不分词)

GET /mymayikt/_mapping

查询设置
GET /mymayikt/_setting

number_of_shards : 5 五主分片
number_of_replicas : 1 每个主分片有几个副分片
总共10个分片

索引的主分片数量定义完之后就不能去修改了,副的可以改,为什么?
路由算法:hash(routing 文档id)%主分片数量

主分片对应的副分片不能放在同一台节点(服务器)上
文档映射

POST /mymayikt/_mapping/user

{
  "user":{
    "properties":{
       "age":{
         "type":"integer"
       },
        "sex":{
         "type":"integer"
       },
       "name":{
         "type":"text",
         "analyzer":"ik_smart",
       },
       "car":{
         "type":"keyword"   
       }
    }
  }
}

根据多个ID查询

GET /mymayikt/user/_search
{
"id":["1","2"]
}

条件查询

GET /mymayikt/user/_search?q=age:21

范围查询

GET /mymayikt/user/_search?q=age[30 TO 60]

降序排列

GET /mymayikt/user/_search?q=age[30 TO 60]&sort=age:desc

分页查询

GET /mymayikt/user/_search?q=age[30 TO 60]&sort=age:desc&from=0&size=2 

从0行开始,两条数据

DSL语言查询:POST请求,JSON格式查询
精确查询,不会分词查询

GET mymayikt/user/_search
{
  "query": {
    =="term"==: {
      "name": "xiaoming"
    } 
  }
}

根据汽车名称模糊查询支持分词查询
把奥迪a61分词去查询,中文会分为单个的,英文才会连起来,国外的框架

GET /mymayikt/user/_search
{
  "from": 0,
  "size": 2, 
  "query": {
   =="match"==:"car": "奥迪a61"
      }
  }
}

过滤器

GET /mymayikt/user/_search
{
	"query": {
		"bool": {
			"must": [{
				"match_all": {} #查询所有
			}],
			"filter": {
				"range": {
					"age": {
						"gt": 21, #age>21
						"lte": 51 #age<21
					}
				}

			}

		}

	},
	"from": 0,
	"size": 10,
	"_source": ["name", "age"]#显示的字段

}

四、SpringBoot整合ES

第一步:引入ES依赖
第二步:yml配置文件和linux中指定集群名称
第三步:UserEntity,ID要为String类型
第四步:UserDao继承接口
第五步:ESController

五、ES倒排索引原理

全文检索底层采用倒排
为什么倒排索引比数据库中的B+树要快?

五个文档,传统查询是一个一个查,倒排是使用关键词

六、ik分词器

中文的分词器,词库
http://192.168.212.181:9200/_analyze

{
  "analyzer": "ik_smart",
  "text": "奥迪"
}

手动添加热词
ik的config目录下指定自定义词库文件

会优先匹配最长的词
比如王者荣耀,分词也是王者荣耀,不会变成王者和荣耀

七、ES集群搭建

主从复制
转发

配置不同的节点id,
配置相同的集群名称node.name=node-1

SpringBoot与ES整合ES要做集群,不然会报错

八、传统日志收集

日志是存放在每台节点中的

九、ELK

Logstash:日志搬运工
1、先ES
2、LOG
3、k

每台节点都安装L,L将日志文件输出到ES中

ELK+Kafka

十、ES与MySQL实现数据同步

第一次发送sql请求的时候,修改时间参数为当前时间。
每隔一分钟判断update_time是否更新了,更新了就同步给ES

增量更新

Mysql主从复制判断数据是否更新?

L同步多张Mysql表到ES,写多个mysql.conf文件,一个文件同步一张表

一些不常改的,比如规格表,用缓存就好了,不用存到ES中

十一、

分布式基础设施和公共Common的区别

十二、

十三、

十四、

十五、

十六、

十七、

十八、

十九、

二十、

二十一、

二十二、

二十三、

二十四、

二十五、

二十六、

二十七、

二十八、

二十九、

三十、

发布了52 篇原创文章 · 获赞 2 · 访问量 1858

猜你喜欢

转载自blog.csdn.net/qq_42972645/article/details/104626770