ElasticSearch学习记录
声明:本文仅供个人学习记录使用,部分内容来自网络。
一、概述
ElasticSearch,简称es,是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;其本身扩展性较好,可以扩展到上百台服务器,能够处理PB级别的数据,es也使用Java开发并使用Lucene作为其核心来实现所有的检索和搜索功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。
二、ES和solr的区别
ElasticSearch是一个实时分布式搜索和分析引擎,它主要用于全文搜索、结构化搜索、分析以及将这三者混合使用。
ElasticSearch使用Java开发并使用Lucene作为其核心来实现所有索引和搜索功能,但是但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。
Solr是Apache下的一个顶级开源项目,采用Java开发,是基于Lucene的全文搜索服务器。它提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展、并对索引、搜索性能进行了优化。
Solr索引的时间方法很简单,用POST方法向Solr服务器发送一个描述Filed及其内容的XML文档,Solr根据文档添加、删除、更新索引。
-
Lucene简介
Lucene是一个开放源代码全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的框架。在Java开发环境中,Lucene是一个乘数的免费开源工具,就其本身而言,Lucene是当前以及最近几年最受欢迎的免费Java信息检索程序库。
ElasticSearch 和Solr的区别
-
当单纯的对已有数据进行搜索时,Solr更快;而当实时建立索引时,Solr会发生io阻塞,查询性能较差,ElasticSearch具有较为明显的优势。
-
ES开箱即用,非常简单。
-
Solr使用Zookeeper进行分布式管理,而ES自身带有分布式协调管理功能。
-
Solr支持的格式更多,比如JSON、XML、CSV等,而ES仅支持JSON。
-
Solr查询快,但更新索引时慢(插入删除),适用于电商等查询多的应用;
而ES建立索引快(查询慢),但实时性查询快,用于新浪百度等实时搜索应用。
三、配置环境
-
es解压到自定义目录下,建议路径不要太深、不要包含空格或中文字符
-
ik分词器解压到es的plugins文件夹下,可以手动新建一个ik文件夹,将ik压缩包中的内容放到ik目录下即可,注意需要重启es。
-
head可视化管理工具解压到es目录下即可,和bin目录同级
-
kibana解压到和es同级目录即可,建议同时修改kibana的配置文件,在config下的kibana.yml中,末尾加上如下代码进行汉化
i18n.locale: "zh-CN"
3.启动
- es:双击bin目录下的elasticsearch.bat即可启动,浏览器访问http://localhost:9200访问集群
- ik:自动装载到es中
- head:到head目录下,在文件管理器的地址栏输入cmd+回车,即可自动打开此目录下的命令行界面,依次执行以下命令
//导入相关依赖
npm install
//下载完成后启动
npm run start
-
kibana:浏览器访问localhost:5601,选择开发工具(扳手图表),相关es代码就在这个界面完成,写完点击运行即可查看效果(注意:点击运行时需要光标处在代码位置)
测试ik分词
GET _analyze
{
"analyzer": "ik_max_word",
"text": "柳庭风静人眠昼,昼眠人静风庭柳"
}
4.解决跨域问题
在elasticsearch.yml文件末尾添加如下代码
http.core.enabled: true
http.core.allow-origin: "*"
四、ES核心概念
包括:集群、结点、索引、类型、文档、分片、映射
ES是面向文档的
| 关系型数据库 | ElasticSearch |
|---|---|
| 数据库(database) | 索引(index) |
| 表(table) | 类型(type) |
| 行(raw) | 文档(document) |
| 列(column) | 字段(field) |
-
关键——倒排索引
根据查询内容在文档中匹配程度的高低——权重,来返回相应的文档,而过滤掉所有无关的数据,从而提高查询效率。
补充:在ElasticSearch中,索引被分为多个分片,每份分片就是一个Lucene索引(其实就是倒排索引),从这里也能看出ES是对Lucene的封装和引用。
Rest风格
| 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/索引名称/类型名称/_search | 查询所有数据 |
五、ES基本操作
(一)索引基本操作
- 创建索引
//PUT /索引名/类型名/文档id
PUT /test/_doc/1
{
"name": "张三",
"age": 23
}
- 查询索引
//获取索引信息
GET test
//获取当前索引的其他信息
GET _cat/属性
- 修改索引中的文档
(1)PUT新内容覆盖(必须保证所有字段都要在PUT里,否则漏掉的字段变为null)
(2)POST
POST /test/_doc/1/_update
{
"doc": {
"name": "李四"
}
}
- 删除索引
DELET test
(二)文档基本操作
- 创建文档
- 查询文档
(1)简单的搜索
//指定id查询
GET test/_doc/1
//条件查询
GET test/_doc/_search?q=name:王五
(2)复杂的搜索(排序、分页、高亮、模糊查询、精准查询)
a.单一字段查询
//查询的结果均封装在hit中,包括,索引和文档的信息、结果总数、各个文档匹配度
GET test/_doc/_search
{
//查询所有名字中带有张三的文档
"query": {
"match": {
"name": "张三"
}
},
//sort——对年龄降序(desc)或升序(asc)排列
"sort": [
{
"age": {
"order": "desc"
}
}
],
//分页——from:从第几条数据开始;size——每页显示多少数据
"from": 0,
"size": 5,
//_source用来对结果进行过滤
"_source": ["name","age"]
}
b.多条件查询
//使用must或should
//must:等同于and must_not:不匹配该条件的
//should:等同于or
GET test/_doc/_search
{
"query": {
//返回boolean结果
"bool": {
"must": [
{
"match": {
"name": "张三"
}
},
{
"match": {
"age": 23
}
}
],
//gt:大于;get:大于等于;lt:小于;lte:小于等于
"filter": {
"range": {
"age": {
"gte": 20
"lt": 30
}
}
}
}
}
}
//使用match
GET test/_doc/_search
{
"query": {
"match": {
"name": "三 五"
}
}
}
c.精确查询
- term:直接查询,效率较高,不支持分词操作
- match: 通常用于带有分词操作,查询效率低于term
注意两个类型
- text:可以被分词器解析,term能够匹配到分词后的文档
- keyword:不可以被分词器解析,term只能查询完全匹配条件的文档,因为不能被分词
//term——通过倒排索引指定的词条进行精确查找(指的是对于分词后的结果文档进行匹配)
GET test/_doc/_search
{
"query": {
"term": {
"name": "张"
}
}
}
d.多个值匹配的精确查询
GET test/_doc/_search
{
"query": {
//返回boolean结果
"bool": {
"should": [
{
"term": {
"age": 23
}
},
{
"term": {
"age": 22
}
}
]
}
}
}
e.高亮查询
GET test/_doc/_search
{
"query": {
"match": {
"name": "张三"
}
},
//自定义高亮条条件及样式
"highlight": {
"pre_tags": "<p class='样式' style='color:red'>",
"post_tags": "</p>",
"fields": {
"name":{}
}
}
}
- 修改文档
//不建议使用PUT,推荐POST
POST test/_doc/1/_update
{
"doc": {
"name": "王五"
}
}
- 删除文档
DELETE test/_doc/1
本文介绍ElasticSearch的基础知识,包括其与Solr的区别、环境配置方法、核心概念以及基本操作等,适合初学者快速上手。
877

被折叠的 条评论
为什么被折叠?



