当前位置: 首页 > news >正文

ElasticSearch搜索

ES搜索

elastic search

一套搜索引擎技术,主要技术栈包括

  • Elasticsearch:用于数据存储、计算和搜索

  • Kibana:用于数据可视化

在数据库模糊查询中,因为不走索引,所以效率很低,而在搜索引擎中,不仅效率高,而且即使出现个别错字,或者用拼音搜索,甚至用同义词搜索都能正确匹配数据

ES的docker安装(默认端口9200)

docker run -d \--name es \-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \-e "discovery.type=single-node" \-v es-data:/usr/share/elasticsearch/data \-v es-plugins:/usr/share/elasticsearch/plugins \--privileged \--network hm-net \-p 9200:9200 \-p 9300:9300 \elasticsearch:7.12.1

Kibana的docker安装(默认端口5601)

es的可视化控制台

docker run -d \
--name kibana \
-e ELASTICSEARCH_HOSTS=http://es:9200 \
--network=hm-net \
-p 5601:5601  \
kibana:7.12.1

倒排索引

先了解两个概念

文档(document):即数据库中的行,每个文档代表一条数据
词条(term):对数据分词得到的词就是词条
创建倒排索引:

将每一个文档的数据利用分词算法做拆分,得到多个词条

创建表,表中每行数据包含词条,词条所在的文档id,位置等信息

因为词条是唯一的,所以词条可以作为数据库的索引

请添加图片描述

根据倒排索引做查询:

先对搜索条件进行分词得到词条

根据词条进行查询,得到文档id

最终结果集就是这些文档id对应的文档

词条和文档id都是对应表中的索引,查询效率很高

ES概念

文档:ES所面向存储的数据,会被序列化为json数据在es中存储
{"id": 1,"title": "小米手机","price": 3499
}
{"id": 2,"title": "华为手机","price": 4999
}
{"id": 3,"title": "华为小米充电器","price": 49
}
{"id": 4,"title": "小米手环","price": 299
}
索引:将类型相同的文档集中在一起管理,称为索引(index),类似数据库中的表
映射:类似数据库中表的字段约束,用以定义表的结构和字段的名称和类型等信息
字段:即每个索引中的文档的字段(属性),和数据库中的字段(列)一致

MySQL和ES

一般在安全性要求较高的操作中使用mysql实现

在查询性能要求较高的搜索中,使用ES实现

再通过例如canal+mq的方式实现数据同步,保证一致性

IK分词器

一个高效,精准的中文分词算法分词器

docker安装
docker exec -it es ./bin/elasticsearch-plugin  install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.1/elasticsearch-analysis-ik-7.12.1.zip

分词模式

包含两种模式

ik_smart:智能语义切分(粗粒度)
ik_max_word:最细粒度切分(细粒度)
可以通过在配置文件IkAnalyzer.cfg.xml中添加扩展词典实现自定义分词

ES索引库操作

Mapping映射属性

Mapping是对索引库中文档的约束,常见的Mapping属性包括:

  • type:字段数据类型,常见的简单类型有:
    • 字符串:text(可分词的文本)、keyword(精确值,例如:品牌、国家、ip地址)
    • 数值:longintegershortbytedoublefloat
    • 布尔:boolean
    • 日期:date
    • 对象:object
  • index:是否创建索引,默认为true
  • analyzer:使用哪种分词器
  • properties:该字段的子字段

索引库的操作

采用Restful风格的API,请求参数采用json风格

创建索引库和映射
  • 请求方式:PUT
  • 请求路径:/索引库名,可以自定义
  • 请求参数:mapping映射
PUT /索引库名称
{"mappings": {"properties": {"字段名":{"type": "text","analyzer": "ik_smart"},"字段名2":{"type": "keyword","index": "false"},"字段名3":{"properties": {"子字段": {"type": "keyword"}}},// ...略}}
}
查询索引库
  • 请求方式:GET
  • 请求路径:/索引库名
  • 请求参数:无
GET /索引库名
修改索引库

索引库不能修改映射,因为一旦修改映射就会影响倒排索引

但是可以添加新字段到索引库中

PUT /索引库名/_mapping
{"properties": {"新字段名":{"type": "integer"}}
}
删除索引库
  • 请求方式:DELETE
  • 请求路径:/索引库名
  • 请求参数:无
DELETE /索引库名

文档操作

新增文档

post /索引库名/_doc/文档id

POST /索引库名/_doc/文档id
{"字段1": "值1","字段2": "值2","字段3": {"子属性1": "值3","子属性2": "值4"},
}
查询文档

get /索引库名称/_doc/条件

GET /{索引库名称}/_doc/{id}
删除文档

delete /索引库名/_doc/文档id

DELETE /{索引库名}/_doc/id值
修改文档

分为全量修改和局部修改

全量修改:覆盖原来的文档(删除原来的文档)

局部修改:修改文档中的部分字段

全量修改

put /索引库名/_doc/文档id

PUT /{索引库名}/_doc/文档id
{"字段1": "值1","字段2": "值2",// ... 略
}
局部修改

post /索引库名/_update/文档id

POST /{索引库名}/_update/文档id
{"doc": {"字段名": "新的值",}
}

批处理

POST _bulk
{ "index" : { "_index" : "test", "_id" : "1" } }//新增文档
{ "field1" : "value1" }//新增文档内容
{ "delete" : { "_index" : "test", "_id" : "2" } }//删除文档
{ "create" : { "_index" : "test", "_id" : "3" } }//创建文档
{ "field1" : "value3" }
{ "update" : {"_id" : "1", "_index" : "test"} }//更新文档
{ "doc" : {"field2" : "value2"} }

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【实践出真知】使用Docusaurus将md文档组织起来就是一个网站(写API文档,写教程、写日记、写博客的有福了)
  • python使用selenium切换到了iframe
  • 理解 HTTP 请求中 Query 和 Body 的异同
  • Android经典面试题之Kotlin中 if 和 let的区别
  • C语言100基础拔高题(3)
  • 计算机系统操作系统简介
  • mac电脑安装 docker镜像 btpanel/baota
  • 企业安全生产管理是否将成为新的朝阳产业?
  • 科目一考试题库(超全)!7分钟一把过科目一(总结经验)
  • 智能座舱背后主流车机平台(SA8155/SA8295)的高通Hexagon DSP是什么?
  • ubuntu apt 命令报错 Key is stored in legacy trusted.gpg keyring
  • 面向对象编程:一切皆对象
  • nohup将代码放到后端运行查看nohup命令
  • “循环购:消费即赚的创新模式“
  • VMware安装Win10系统(保姆级教程)
  • C++类的相互关联
  • cookie和session
  • docker容器内的网络抓包
  • HTTP中的ETag在移动客户端的应用
  • nodejs调试方法
  • SpiderData 2019年2月16日 DApp数据排行榜
  • TypeScript迭代器
  • Vue实战(四)登录/注册页的实现
  • Web设计流程优化:网页效果图设计新思路
  • 安卓应用性能调试和优化经验分享
  • 给初学者:JavaScript 中数组操作注意点
  • 构建二叉树进行数值数组的去重及优化
  • 记录一下第一次使用npm
  • 经典排序算法及其 Java 实现
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 写给高年级小学生看的《Bash 指南》
  •  一套莫尔斯电报听写、翻译系统
  • postgresql行列转换函数
  • ​io --- 处理流的核心工具​
  • ​虚拟化系列介绍(十)
  • $ git push -u origin master 推送到远程库出错
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (2)从源码角度聊聊Jetpack Navigator的工作流程
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (办公)springboot配置aop处理请求.
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (汇总)os模块以及shutil模块对文件的操作
  • (算法)Travel Information Center
  • (一) storm的集群安装与配置
  • (一)Neo4j下载安装以及初次使用
  • (一)基于IDEA的JAVA基础1
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转)h264中avc和flv数据的解析
  • (转)重识new
  • .net 无限分类