前言
什么是搜索引擎
- 搜索引擎是指根据一定的策略、运用特定的计算机程序从互联网上采集信息,在对信息进行组织和处理后,为用户提供检索服务,将检索的相关信息展示给用户的系统。
- 分类:
- 全文索引搜索引擎
- 采集ip段内的网页数据,扫描网页内容的每一个词,对其创建索引,指明词频、位置,存入数据库,当用户以关键词查找信息时,搜索引擎会在数据库中,根据关键词的匹配程度、出现的位置、频次等算法,匹配结果一般按照关联度降序返回
- 比如百度、必应、谷歌、搜狗等
- 目录索引搜索引擎
- 对网站进行人工分类,所以目录索引也被称为分类检索;
- 在爬取数据时,将网页根据一定的目录进行分门别类,类似图书馆一样分为:汽车、机械、植物、历史等
- 用户检索时,可以先依据分类缩小检索范围,比如你在新浪网首页,选择了房产->二手房
- 垂直搜索
- 垂直搜索引擎适用于有明确搜索意图情况下进行检索。
- 也可以理解为单个(少量)行业专用搜索
- 例如各大电商(商品)、携程(机票、车票、住宿)等
- 全文索引搜索引擎
什么是Elasticsearch
Elasticsearch is a distributed search and analytics engine, scalable data store, and vector database built on Apache Lucene. It’s optimized for speed and relevance on production-scale workloads. Use Elasticsearch to search, index, store, and analyze data of all shapes and sizes in near real time.
Elasticsearch 是一个基于 Apache Lucene 构建的分布式搜索和分析引擎、可扩展的数据存储和矢量数据库。 它针对生产规模工作负载的速度和相关性进行了优化。 使用 Elasticsearch 近乎实时地搜索、索引、存储和分析各种形状和大小的数据。
- 应用场景
- 海量数据搜索场景。
- 日志处理和分析,例如:通过ELK搭建日志处理和分析方案。
- 地理空间数据搜索,例如:查询5km以内店铺、统计一个月内某个用户去过哪些地方(点)。
什么是Lucene
- Lucene是一个开放源代码的全文检索引擎工具包
- 它提供了一个简单但强大的应用编程接口(API),通过API可以对各种信息资源(如:文本文件、电子邮件、数据库等)实现快速的全文检索功能。
- Lucene由JAVA语言开发,索引可以很容易地,嵌入到使用Java开发的应用程序中。
- 但是为什么不直接使用Lucene进行开发呢,因为整个体系太难了😄,ES相当于对Lucene进行了封装及扩展。
Elasticsearch 存储结构
基本概念介绍过程中,会用到 [索引]这个词,有两种语境:
- 名词,比如创建索引,意思是创建类似于关系型数据库中的一张表
- 动词,比如索引文档,在官方描述中,跟创建、删除一样是写操作,同更新语义
-
Document:文档
- Elasticsearch是面向文档的数据库,文档是最基本的存储单元,也是可以被索引的最小单位,文档类似mysql表中的一行数据。
- 简单的说在ES中,文档指的就是一条JSON数据。
- Elasticsearch中文档使用json格式存储,因此存储上比Mysql要灵活的多,Elasticsearch支持任意格式(java中的单层对象、嵌套对象)的json数据。
-
Index:索引
- 在Elasticsearch中,索引(Index)即是文档(Document)的容器/集合
- 在7.0以前,同一个索引可以存储不同的数据类型(Type),这时索引理解时,可以参考为mysql中的数据库;
- 但是生产环境中,一个索引建议只存储一种数据结构,所以索引也可以被理解为mysql中的库表。
-
Type:文档类型
- 在版本7.0+的Elasticsearch中,已经不使用文档类型了(默认统一使用_doc),在版本7.0-,代表一类文档的集合。
-
Field:文档字段
ES字段类型 | |
---|---|
字符串 | text、keyword |
数值 | long, integer, short, byte, double, float |
布尔值 | boolean |
时间 | date |
地理/几何 geo | shape、point、linestring、polygon、multipoint |
- mapping :映射
- Elasticsearch的mapping (映射),与mysql中的表结构相同的点是,都定义了数据机构/组成、字段类型等,不同的是,mapping 还定义了字段使用的分词器、是否评分、是否创建索引等属性。
Elasticsearch基础 CRUD 操作
以下操作都是基于kibana,安装参考上一篇
- 插入文档
- 语法:PUT /{index}/{type}/{id}
- index:索引名
- type:文档类型,版本7.0+默认_doc
- id:可指定,不指定时自动生成
PUT /dingsu/_doc/1
{
"name":"丁宿001",
"sex": 1
}
- 查询文档
- 语法: GET /{index}/{type}/{id}
- 查询所有及该Index详细属性,可以使用API:_search
GET dingsu/_doc/1
GET dingsu/_search
- 更新文档
- 如果是全量覆盖,可以使用PUT,也可以使用POST
- POST需要指明哪个类型,因为7.0-版本以前,可以定义多个Type
- 单个Field使用POST进行更新
- 语法: POST /{index}/_update/{id}
# 覆盖
PUT /dingsu/_doc/1
{
"name":"丁宿002",
"sex": 1
}
# 局部更新
POST /dingsu/_update/1
{
"doc": {
"name":"丁宿003"
}
}
- 删除文档:
- 语法:DELETE /{index}/{type}/{id}
DELETE dingsu/_doc/1