ElasticSearch全文搜索引擎

ElasticSearch是一个基于Lucene的分布式全文搜索引擎,提供简单RESTfulAPI以简化操作。文章介绍了为何使用ElasticSearch而非直接使用Lucene,以及ElasticSearch的特性,如分布式存储和实时性。内容涵盖ElasticSearch与Lucene的区别、下载安装过程、Kibana的配置以及基本的索引库和文档的CRUD操作。
摘要由CSDN通过智能技术生成

ElasticSearch相关概念

  1.ElasticSearch介绍

        1.1为什么要使用ElasticSearch

Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。但是,Lucene只是一个库。想要使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中,更糟糕的是,Lucene的配置及使用非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的。

        1.2什么是ElasticSearch

ES是一个分布式的全文搜索引擎,为了解决原生Lucene使用的不足,优化Lucene的调用方式,并实现了高可用的分布式集群的搜索方案,ES的索引库管理支持依然是基于Apache Lucene(TM)的开源搜索引擎。

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

#添加
PUT /pethome/pet/1
{
    "id":1,
    "name":"土狗"
}

#获取
GET /pethome/pet/1
        1.3ES的特点
  • 分布式的实时文件存储

  • 分布式全文搜索引擎,每个字段都被索引并可被搜索

  • 能在分布式项目/集群中使用

  • 本身支持集群扩展,可以扩展到上百台服务器

  • 处理PB级结构化或非结构化数据

  • 简单的 RESTful API通信方式

  • 支持各种语言的客户端

  • 基于Lucene封装,使操作简单

        1.4ES的lucene的区别
  • Lucene只支持Java,ES支持多种语言

  • Lucene非分布式,ES支持分布式

  • Lucene非分布式的,索引目录只能在项目本地 , ES的索引库可以跨多个服务分片存储

  • Lucene使用非常复杂 , ES屏蔽了Lucene的使用细节,操作更方便

  • 单体/小项目使用Lucene ,大项目,分布式项目使用ES

2.ES下载和安装

        2.1下载ElasticSearch

下载地址:Download Elasticsearch | Elastic

        2.2安装与启动

解压即可,双击安装目录 bin/elasticsearch.bat即可启动


         2.3ES内存配置

如果ES启动占用的内存比较大可以通过修改 jvm.options 文件来修改内存

 -Xms1g  ---->-Xms512m

-Xms1g  -----> -Xms512m

3.Kibana5安装

        3.1下载Kibana5

下载地址:Download Kibana Free | Get Started Now | Elastic

        3.2安装与启动

解压即可安装 , 执行bin\kibana.bat 即可启动Kibana

        3.3Kinbana连接ES配置

解压并编辑config/kibana.yml,设置elasticsearch.url的值为已启动的ES

默认情况下,Kibana会链接本地的默认ES http://localhost:9200 ,如果需要修改链接的ES服务器,通过修改安装目录下 config/kibana.yml,将配置项 #elasticsearch.url: "http://localhost:9200" 取消注释即可修改连接的ES服务器地址。

4.ElasticSearch基础

        1.几个基本概念

        1.1.Near Realtime(NRT)

近实时,两个意思,从写入数据到数据可以被搜索到有一个小延迟(大概1秒);基于es执行搜索和分析可以达到秒级

        1.2.Index:索引库

包含一堆有相似结构的文档数据,比如可以有一个客户索引,商品分类索引,订单索引,索引有一个名称。一个index包含很多document,一个index就代表了一类类似的或者相同的document。比如说建立一个product index,商品索引,里面可能就存放了所有的商品数据,所有的商品document。

        1.3.Type:类型

每个索引里都可以有一个或多个type,type是index中的一个逻辑数据分类,·`一个type下的document,都有相同的field,比如博客系统,有一个索引,可以定义用户数据type,博客数据type,评论数据type。

        1.4.Document&field

文档,es中的最小数据单元,一个document可以是一条客户数据,一条商品分类数据,一条订单数据,通常用JSON数据结构表示,每个index下的type中,都可以去存储多个document。一个document里面有多个field,每个field就是一个数据字段。

 2.索引库CRUD

#增加索引库
#创建一个名字为 shopping的索引库,5个Master Shard分片,每个Master Shard分片有1个Replica Shard从分片

PUT shopping
{
    "settings":{
        "number_of_shards":5,
        "number_of_replicas":1
    }
}
#查询索引库

##查询所有索引库
GET _cat/indices?v

#查看指定索引库
GET _cat/indices/aigou

#删除索引库
DELETE 名字

#修改索引库
删除再添加

3.文档的CRUD

MySql 与 ES对比,ES集群可以包含多个索引(indices)(数据库),每一个索引库中可以包含多个类型(types)(表),每一个类型包含多个文档(documents)(行),然后每个文档包含多个字段(Fields)(列)。

       3.1获取文档
  • 基本语法

#指定ID创建索引文档
PUT index/type/id
{
    JSON,文档内容
}
--解释---------------------------------------
​
PUT 索引库/文档类型/文档id
{
    JSON格式,文档原始数据
}
使用内置ID创建索引文档

 
POST index/type/
{
    JSON,文档内容
}
--解释---------------------------------------
PUT 索引库/文档类型/
{
    JSON格式,文档原始数据
}
没有指定文档ID,ES会自动生成ID
案例


PUT crm/user/11 
{
    "id":11,
    "username":"zs",
    "age":18,
    "name":"zs",
    "sex":1,
    "join_date": 1584092062348
}
        3.2获取文档
#获取指定文档
GET 索引库/类型/文档ID 

#指定返回的列
GET /crm/user/123?_source=fullName,email

#只要内容不要元数据
GET /crm/user/123/_source
        3.3修改文档
#整体修改
PUT {index}/{type}/{id}
{
    "id":11,
    "username":"zs"
}
#上面的修改会把ES中的数据全部覆盖,即age字段会消失。

#局部修改
POST /crm/user/123/_update
{
    "doc":{
        "id" : 11, 
        "username": "xx"
    }
}
#上面修改只会修改id,和username字段,age字段不会作任何改变。
        3.4删除文档
DELETE {index}/{type}/{id}

4.文档简单查询

        4.1基本查询
#查询所有
GET _search

#查询指定索引库
GET crm/_search

#查询指定类型
GET crm/user/_search

#查询指定文档
GET crm/user/11
        4.2分页查询
&size=2&from=2
size: 每页条数
form:从多少条数据开始查
        4.3字符串查询
GET crm/user/_search?q=age:17&size=2&from=2&sort=id:desc&_source=id,username
        4.4批量查询
#不同索引库查询
GET _mget
{
    "docs" : [
        {
            "_index" : "itsource",
            "_type" : "blog",
            "_id" : 2
        },
        {
            "_index" : "itsource",
            "_type" : "employee",
            "_id" : 1,
            "_source": "email,age"
        }
    ]
}
#同索引库同类型 - 推荐
GET itsource/blog/_mget
{
    "ids" : [ "2", "1" ]
}

5.DSL查询与DSL过滤

        5.1DSL查询

 

match如同:where username = hello or username = java (match要分词)

term如同:where username = "Hello Java" (term不分词)

         5.2DSL过滤

DSL过滤和DSL查询在性能上的区别:

  • 过滤结果可以缓存并应用到后续请求。:

    where intro like "%zs%" and id = 1

    where id = 1 and intro like "%zs%"

  • 查询语句同时匹配文档,计算相关性,所以更耗时,且不缓存。

  • 过滤语句可有效地配合查询语句完成文档过滤。

总结:需要模糊查询的使用DSL查询 ,需要精确查询的使用DSL过滤,在开发中组合使用(组合查询) ,关键字查询使用DSL查询,其他的都是用DSL过滤。

GET /crm/user/_search
{
    "query": { 
        "bool": {       //booleanQuery 组合
            "must": [{  //与(must) 或(should) 非(must not) 
                "match": { //match : 匹配,吧查询的内容分词后去查询
                    "username": "zs"
                },
            }],
            "filter": {
                "term": {
                    "name": "zs ls"
                }
            }
        }
    },
    "from": 20,
    "size": 10,
    "_source": ["name", "age", "username"],
    "sort": [{
        "join_date": "desc"
    }, {
        "age": "asc"
    }]
}
  • 全匹配(match_all)
  • 标准查询(match和multi_match): match一般只用于全文字段的匹配与查询,一般不用于过滤。multi_match 查询允许你做 match查询的基础上同时搜索多个字段
  • 单词搜索与过滤(Term和Terms):单词/词元查询 , 可以理解为等值查询,字符串,数字等都可以使用它,把查询的内容看成一个整体去检索ES库,Terms支持多个字段查询,where tags in (jvm , hadoop , lucene)
  • 组合条件搜索与过滤(Bool):组合搜索bool可以组合多个查询条件为一个查询对象,查询条件包括must、should和must_not。
  • 范围查询与过滤(range):gt:> gte:>= lt:< lte:<=
  • 存在和缺失过滤器(exists和missing):exists和missing只能用于过滤结果
  • 前匹配搜索与过滤(prefix):和term查询相似,前匹配搜索不是精确匹配,而是类似于SQL中的like ‘key%’
  • 通配符搜索(wildcard):使用*代表0~N个,使用?代表1个。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值