Elasticsearch搜索服务器

Elasticsearch

简介

Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

1>基于Apache Lucene 构建的开源搜索引擎
2>才有java编写的,提供简单易用的RESTFul API
3>轻松的横向拓展, 可以支持PB级的结构化或非结构化数据处理

在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene。

定位

实时的全文搜索引擎

近实时:数据更新有1秒的延时

在操作上狭义的上的理解:专注于搜索的非关系型数据库,类似于mongodb。

数据获取
  1. 爬虫获取数据

  2. 从关系型数据库同步数据

数据处理

存储:es是一种类似于非关系型数据库的方式存放数据,数据存储结构类似mongodb文档结构,但是比mongodb更为复杂

处理:涉及到数据分词,倒排等相关操作

数据检索

全文搜索

高亮搜索

条件搜索

使用场景

  1. 社会化搜索
  2. 实时搜索
  3. 移动搜索
  4. 个性化搜索
  5. 地理位置感知搜索
  6. 跨语言搜索
  7. 多媒体搜索
  8. 情境搜索

适用场景:

  1. 海量数据分析引擎
  2. 站内搜索引擎
  3. 数据仓库

安装

  1. Java编写的解压即用的软件,只需要有Java的运行环境即可,把压缩包解压后,进入到bin目录运行elasticsearch.bat

  2. 浏览器输入:http://localhost:9200,看到浏览器输出服务器的信息,表示安装成功,可以使用了

    9200:http

    9300:tcp

可视化环境

Elasticsearch默认的客户端工具是命令行形式的,操作起来不方便,也不直观看到数据的展示,所以我们需要去安装一个可视化插件,但是这些插件都是基于H5开发的,在谷歌的应用商店中找到elasticsearch-head插件,然后安装,使用该插件能比较直观的展示服务器中的数据

概念

索引(Index)

含有相同属性的文档集合

类型(Type)

索引可以定义一个或多个类型,文档必须属于一个类型

es6 之后要求一个索引只能包含一个类型

所以es6操作对对版本要求较高

映射

Mapping,就是对索引库中索引的字段名称及其数据类型进行定义,类似于mysql中的表结构信息。不过es的mapping比数据库灵活很多,它可以动态识别字段。一般不需要指定mapping都可以,因为es会自动根据数据格式识别它的类型,如果你需要对某些字段添加特殊属性(如:定义使用其它分词器、是否分词、是否存储等),就必须手动添加mapping。

需要注意的是映射是不可修改的,一旦确定就不允许改动,在使用自动识别功能时,会以第一个存入的文档为参考来建立映射,后面存入的文档也必须符合该映射才能存入

文档(Document)

文档可以被索引的基本单位, 一般是json格式,包含一些field

列(Field)

es的最小单位,相当于数据的某个列

类比

逻辑概念

近实时(NRT):数据更新有1秒的延时

节点(Node):单个的装有es服务并且提供故障专员的拓展服务器

集群(Cluster):一个集群就是由一个或多个node组织在一起,共同工作,共同分享整个数据,具有负载均衡功能的集群

物理概念

分片(Shards):每个索引都有多个分片,每个分片是一个Lucene索引

备份(Replicas):拷贝一份分片就是完成分片的备份

拓展词库

最简单的方式就是找到IK插件中的config/main.dic文件,往里面添加新的词汇,然后重启服务器即可

操作

索引操作

添加

语法:PUT /索引名
在没有特殊设置的情况下,默认有5个分片,1个备份,也可以通过请求参数的方式来指定
参数格式:

默认:PUT my_index

明确指定:

PUT my_index
{
  "settings": {
    "number_of_shards": 5, //设置5个片区
    "number_of_replicas": 1 //设置1个备份
  }
}

注意:
1:索引不能有大写字母
2:参数格式必须是标准的json格式

查看

看单个
GET /索引名

看所有
GET _cat/索引名

删除

语法:DELETE /索引名

类型-映射

创建

类型跟映射一起创建

语法:

PUT /索引名
{
  "mappings": {
    类型名: {
      "properties": {
        字段名: {
          "type": 字段类型, 
          "analyzer": 分词器类型, 
          "search_analyzer": 分词器类型,
          ...
        },
        ...
      }
    }
  }
}

字段类型就是:数据类型
配置:analyzer search_analyzer 前提是 type:text类型

查看

语法:GET /索引名/_mapping

数据类型

数值 类型

byte
short
integer
doule
float
date
boolean
binary
array
object
ip

核心类型

text 类型:当一个字段是要被全文搜索的,比如Email内容、产品描述,应该使用text类型。设置text类型以后,字段内容会被分析,在生成倒排索引以前,字符串会被分析器分成一个一个词项。text类型的字段不用于排序,很少用于聚合。

keyword类型:适用于索引结构化的字段,比如email地址、主机名、状态码和标签。如果字段需要进行过滤(比如查找已发布博客中status属性为published的文章)、排序、聚合。keyword类型的字段只能通过精确值搜索到。

文档基本操作

文档添加

语法:

POST /索引名/类型名/文档ID
{
  field1: value1,
  field2: value2,
  ...
}

注意:
1:当索引/类型/映射不存在时,会使用默认设置自动添加
2:ES中的数据一般是从别的数据库导入的,所以文档的ID会沿用原数据库中的ID
3:操作时,如果指定文档id, 并且索引库中已经存在, 则执行更新操作, 否则执行添加
4:不指定id的添加, es会指定添加一个字符串类型id

文档更新

语法:

PUT /索引名/类型名/文档ID
{
  field1: value1,
  field2: value2,
  ...
}

注意:
1:操作跟POST的指定id更新操作一样
2:如果不指定id, 操作失败

文档查看

语法:
根据ID查询 -> GET /索引名/类型名/文档ID
查询所有(基本查询语句) -> GET /索引名/类型名/_search

结果字段解释:

took:耗时
_shards.total:分片总数
hits.total:查询到的数量
hits.max_score:最大匹配度
hits.hits:查询到的结果
hits.hits._score:匹配度

文档删除

语法:DELETE /索引名/类型名/文档ID
注意:这里的删除并且不是真正意义上的删除,仅仅是清空文档内容而已,并且标记该文档的状态为删除

高级查询

Elasticsearch基于JSON提供完整的查询DSL(Domain Specific Language:领域特定语言)来定义查询。

基本语法:
GET /索引名/类型名/_search

一般都是需要配合查询参数来使用的,配合不同的参数有不同的查询效果

结果集排序

参数格式:

{
  "sort": [
    {field: 排序规则},
    ...
  ]
}

排序规则:

asc表示升序

desc:表示降序

没有配置排序的情况下,默认按照评分降序排列

分组查询

参数格式:

{
  "from": start,
  "size": pageSize
}

注意: es查询时,默认显示前10条

检索查询

参数格式:

{
  "query": {
    检索方式: {field: value}
  }
}

检索方式

term表示精确匹配,value值不会被分词器拆分,按照倒排索引匹配

match表示全文检索,value值会被分词器拆分,然后去倒排索引中匹配

range表示范围检索,其value值是一个对象,如{ “range”: {field: {比较规则: value, …}} },比较规则有gt / gte / lt / lte 等

注意:term和match都能用在数值和字符上,range用在数值上

关键字查询

参数格式:

{
  "query": {
    "multi_match": {
      "query": value,
      "fields": [field1, field2, ...]
    }
  }
}

multi_match:表示在多个字段间做检索,只要其中一个字段满足条件就能查询出来,多用在字段上

逻辑查询

参数格式:

{
  "query": {
    "bool": {
      逻辑规则: [
        {检索方式: {field: value}}, 
        ...
      ],
      ...
    }
  }
}

逻辑规则:must / should / must_not,相当于and / or / not

实例

需求:查询商品标题中符合"i7"的字样并且价格大于7000的商品
GET /es_shop/shop_product/_search
{
  "query": {
    "bool": {
      "must": [
        {"range": {"price": {"gte": 7000}}},
        {"match": {"title": "i7"}}
      ]
    }
  }
}
过滤查询

参数格式:

{
  "query": {
    "bool": {
      "filter": [
        { 检索方式: { field: value } },            	
        ...
      ]
    }             
  }
}

从效果上讲过滤查询和检索查询能做一样的效果,区别在于过滤查询不评分,结果能缓存,检索查询要评分,结果不缓存,一般是不会直接使用过滤查询,都是在检索了一定数据的基础上再使用

全文搜索

全文搜索

把文本内容按照标准进行切分,默认的是standard,该分词器按照单词切分,内容转变为小写,去掉标点,遇到每个中文字符都当成1个单词处理

默认分词器:
GET /es_shop/_analyze
{
  "text":"I am Groot"
}

GET /es_shop/_analyze
{
  "text":"英特尔酷睿i7处理器"
}
结论:默认的分词器只能对英文正常分词,不能对中文正常分词
安装词库

最简单的方式就是找到IK插件中的config/main.dic文件,往里面添加新的词汇,然后重启服务器即可

IK分词器
1、ik_max_word 【细力度分词】
会将文本做最细粒度的拆分,比如会将“中华人民共和国人民大会堂”拆分为“中华人民共和国、中华人民、中华、华人、人民共和国、人民、共和国、大会堂、大会、会堂等词语。

2、ik_smart 【粗力度分词】
会做最粗粒度的拆分,比如会将“中华人民共和国人民大会堂”拆分为中华人民共和国、人民大会堂。

倒排索引

倒排索引源于实际应用中需要根据属性的值来查找记录。这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址。由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排索引(inverted index)。带有倒排索引的文件我们称为倒排索引文件,简称倒排文件(inverted file)

match
表示全文检索,也可也做精确查询,value值会被分词器拆分,然后去倒排索引中匹配
参数格式:
{
  "query": {
    "match": {field: value}
  }
}

需求:查询商品标题中符合"游戏 手机"的字样的商品 【可以理解为数据库的模糊查询】

GET /es_shop/shop_product/_search
{
  "query": {
    "match":{
      "title": "游戏 手机"
    }
  }
}
multi_match
参数格式:
{
  "query": {
    "multi_match": {
      "query": value,
      "fields": [field1, field2, ...]
    }
  }
}

multi_match:表示在多个字段间做检索,只要其中一个字段满足条件就能查询出来,多用在字段上
//有点类似   select * from product where 列1  like "%keyword%" or 列2  like "%keyword%"

需求:查询商品标题或简介中符合"蓝牙 指纹 双卡"的字样的商品

GET /es_shop/shop_product/_search
{
  "query": {
    "multi_match":{
      "query":"蓝牙 指纹 双卡",
      "fields": ["title", "intro"]
    }
  }
}

高亮显示

highlight:表示高亮显示,需要在fields中配置哪些字段中检索到该内容需要高亮显示 必须配合检索(term / match)一起使用

参数格式:
{
  "query": { ... },
  "highlight": {
    "fields": {
      field1: {},
      field2: {},
      ...
    },
    "pre_tags": 开始标签,
    "post_tags" 结束标签
  }
}

需求:查询商品标题或简介中符合"蓝牙 指纹 双卡"的字样的商品,并且高亮显示

GET /es_shop/shop_product/_search
{
  "query": {
    "multi_match":{
      "query":"蓝牙 指纹 双卡",
      "fields": ["title", "intro"]
    }
  },
  "highlight": {
    "fields": {
      "title": {},
      "intro": {}
    },
    "pre_tags": "<span style='color:red;'>",
    "post_tags": "</span>"
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小云很优秀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值