ElasticSearch学习记录(ES安装配置及基本操作)

本文介绍ElasticSearch的基础知识,包括其与Solr的区别、环境配置方法、核心概念以及基本操作等,适合初学者快速上手。

ElasticSearch学习记录

声明:本文仅供个人学习记录使用,部分内容来自网络。

一、概述

​ ElasticSearch,简称es,是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;其本身扩展性较好,可以扩展到上百台服务器,能够处理PB级别的数据,es也使用Java开发并使用Lucene作为其核心来实现所有的检索和搜索功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。

二、ES和solr的区别

  • ES简介

​ ElasticSearch是一个实时分布式搜索和分析引擎,它主要用于全文搜索结构化搜索分析以及将这三者混合使用。

​ ElasticSearch使用Java开发并使用Lucene作为其核心来实现所有索引和搜索功能,但是但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。

  • Solr简介

​ Solr是Apache下的一个顶级开源项目,采用Java开发,是基于Lucene的全文搜索服务器。它提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展、并对索引、搜索性能进行了优化。

​ Solr索引的时间方法很简单,用POST方法向Solr服务器发送一个描述Filed及其内容的XML文档,Solr根据文档添加、删除、更新索引

  • Lucene简介

    Lucene是一个开放源代码全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的框架。在Java开发环境中,Lucene是一个乘数的免费开源工具,就其本身而言,Lucene是当前以及最近几年最受欢迎的免费Java信息检索程序库。

ElasticSearch 和Solr的区别

  1. 当单纯的对已有数据进行搜索时,Solr更快;而当实时建立索引时,Solr会发生io阻塞,查询性能较差,ElasticSearch具有较为明显的优势。

  2. ES开箱即用,非常简单。

  3. Solr使用Zookeeper进行分布式管理,而ES自身带有分布式协调管理功能。

  4. Solr支持的格式更多,比如JSON、XML、CSV等,而ES仅支持JSON。

  5. Solr查询快,但更新索引时慢(插入删除),适用于电商等查询多的应用;

    而ES建立索引快(查询慢),但实时性查询快,用于新浪百度等实时搜索应用。

三、配置环境

  1. 下载

    官网下载

    百度资源链接,提取码:52j7

    解压即可使用,建议使用7.x版本。

    注意jdk版本需要8以上,并具有基础web开发环境,包括node.js,python等。

  2. 安装

  • 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风格
methodurl地址说明
PUTlocalhost:9200/索引名称/类型名称/文档id创建文档(指定文档id)
POSTlocalhost:9200/索引名称/类型名称创建文档(随机id)
POSTlocalhost:9200/索引名称/类型名称/文档id/_update修改文档
DELETElocalhost:9200/索引名称/类型名称/文档id删除文档
GETlocalhost:9200/索引名称/类型名称/文档id通过id查询文档
POSTlocalhost:9200/索引名称/类型名称/_search查询所有数据

五、ES基本操作

(一)索引基本操作
  1. 创建索引
//PUT /索引名/类型名/文档id
PUT /test/_doc/1
{
	"name": "张三",
	"age": 23
}
  1. 查询索引
//获取索引信息
GET test
//获取当前索引的其他信息
GET _cat/属性
  1. 修改索引中的文档

(1)PUT新内容覆盖(必须保证所有字段都要在PUT里,否则漏掉的字段变为null)

(2)POST

POST /test/_doc/1/_update
{
	"doc": {
		"name": "李四"
	}
}
  1. 删除索引
DELET test
(二)文档基本操作
  1. 创建文档
  2. 查询文档

(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":{}
        }
    }
}
  1. 修改文档
//不建议使用PUT,推荐POST
POST test/_doc/1/_update
{
    "doc": {
        "name": "王五"
    }
}
  1. 删除文档
DELETE test/_doc/1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值