ElasticSearch入门知识扫盲
ElasticSearch 入门介绍
tags: 第三方 lucene
1. what Elastic Search(ES)是什么
全文检索和lucene
全文检索
优点:高效,准确,分词
全文检索允许用户输入一些关键字,从数据层中查找到所需要的信息
- 全文检索和数据库"LIKE"语句相比,远比数据库的开销小,因为检索过程全部从通过检索文件完成,因此效率非常高。
- 在全文检索领域,用户输入的搜索信息叫做关键字,而全文检索系统把海量信息按照这些关 键字进行结构化处理,把文章打散成段落、文字,最后,按关键字对文章的数据进行分类。这个处理后的数据文本叫做检索文件,检索文件往往比实际数据小得多,但它的数据所包含的信息量损失却非常小。当用户输入一个关键字时,全文检索引擎可以很快地定位到相关文本。
lucene
lucene是一个是一个开源的全文检索引擎库,Apache基金会赞助项目.无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库(《Elastic Search 权威指南》)。lucene有很多优点,包括:它的文本分析器可以定制,检索文件存储方式可以定制,查询引擎也有不同的可选方案.此外,它提供一套非常强大的API接口,使客户用起来很方便.
Elastic Search
lucene是一个非常强大的全文检索引擎库,但是遗憾的是,它是一个库,想要使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中,更糟糕的是,Lucene非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的。
Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。
2. why 为什么选择ES,ES有什么优点
- ES以Lucene为核心实现了索引和搜索功能,它拥有着全文搜索的优点,准确高效的查询和分词处理数据源。
- ES封装了Lucene,对用户隐藏了Lucene的复杂知识,用户只需要了解ES提供的RESTful API就可以使用全文检索而不需要去了解Lucene的众多基本知识
- ES是一个单独的程序,通过http请求就可以操作,两个不同的项目可以同时使用访问ES
- ES支持分布式,可以扩展到上百台服务器,处理PD级结构化或者非结构话数据。
3. when or where什么地方使用elastic
- 字段文本量较大会比较大,用数据库的like效率会明显感觉出来
- 模糊查询时候需要对关键词进行分词而不是只是简单的匹配
4. how 如何使用ES
1.ES的安装
ES的安装很简单,即装即用.去官网下载ES[下载地址][1],在任何配置了java运行环境的电脑上后将压缩文件解压缩即可.
解压后进入解压下的bin文件夹,启动elasticserach.bat(windows系统),如下:
![启动目录][2]
启动后进入cmd窗口,如下图所示即成功启动:
![此处输入图片的描述][3]
然后我们打开浏览器访问以下ES,输入http:localhost:9200,如下即为成功运行:
![此处输入图片的描述][4]
2. ES数据存储的介绍
ES是数据存储是面向文档的,数据的存储形式是以对象的形式(JSON)来存储的,而不是像关系型数据库一样把数据抽象一行行记录去适应数据库.同时在存储的时候,ES还会索引每条数据内容使得每条内容可以被搜索.
ES存储的相关概念与传统关系型数据库的对比:
其中的fields(字段)就相当于关系型数据库的列;多个字段组成一个Document(文档)相当于关系型数据库的行(一条数据);相同类型的Documents组成一个type(类型),相当于关系型数据库的一张数据表;而多个types就会组成一个index(索引),相当于关系型数据的数据库.关系对应如下:
Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices -> Types -> Documents -> Fields
1. index
index的两个概念介绍:
- 索引(名词) 如上文所述,一个索引(index)就像是传统关系数据库中的数据库,它是相关文档存储的地方,index的复数是indices 或indexes。
- 索引(动词) 「索引一个文档」表示把一个文档存储到索引(名词)里,以便它可以被检索或者查询。这很像SQL中的INSERT关键字,差别是,如果文档已经存在,新的文档将覆盖旧的文档。
2.index,type的建立
ES对提供的REST ful接口,任何对数据的操作和查询都可以通过想ES发送HTTP请求来完成.关于RESTful协议的相关知识可以参照一下[RESTful API 设计指南][5],了解一下RESTful协议能共更容易理解ES提供的接口.
现在我们要建立一个所以,按照ES提供的RESTful接口,我们应该对ES发一个PUT请求,如下:
需要注意的是index名字里的字母都必须是小写.
如果成功,我们会获取如下的返回结果:
json
{
"acknowledged": true
}
然后我们再向ES发送GET请求,来获取我们刚刚创建的testindex的属性:
> GET http://localhost:9200/testindex
结果如下:
```json```
{
"testindex": {
"aliases": {},
"mappings": {},
"settings": {
"index": {
"creation_date": "1465748163064",
"uuid": "uYyeZC_bQ1Olwe8lDrqXaw",
"number_of_replicas": "1",
"number_of_shards": "5",
"version": {
"created": "2030399"
}
}
},
"warmers": {}
}
}
相关的tpye,document最简单的增删查改也都可以通过PUT GET POST DELET 几个常用的请求来完成,这里就不做详细的介绍了,详细的可以查看[ElasticSearch权威指南中文版][6]了解一下.
3.mapping
mapping可以理解为描述index/type以及field的元数据,通过mapping我们可以来设置index/type/field.
单独的生成或者更新type的mappiing
URL: PUT http://localhost:9200/wisdomhr/_mapping/basejob/
json
{
"properties": {
"activateTiem": {
"type": "date",
"format": "yyyy-MM-dd"
},
"title": {
"type": "string",
"boost": 10,
"store": true,
"analyzer": "ik"
}
}
}
参考文档:[更新mapping][7]
通常我们需要在构建mapping的时候来设置一些常用的属性,主要是包括字段的类型,是否被分词,分词使用的分词器,分词时候自己所占的比重等,如下:
> - type:类型,包括date,string,boolean,integer等,跟常用的类型跟java很相似,同时也有array类型可以直接存储数组.
- analyzer: 分词器,这个属性会决定你在索引和查找阶段所使用的分词器;如果没有特别指出,analyzer定义的分词器可以用在索引和查找阶段.也可以单独通过search_analyzer来指定作为查找时的分词器.
- boost:这个属性会决定你在分词的时候该字段的权重,在搜索的时候,默认会按照每条数据的评分来进行排序,而这个权重就会用基础得分*权重来决定最后的得分.
- format:当数据类型是date的时候,通过format来设置时间的格式
其余的更多的类型可以参考官方文档[mapping][8]
### 3 ES的索引过程
ES为了能够更好的进行查询,在保存数据之前,都会对数据进行索引(动词),那么在这个所以过程里面,ES都做了什么?
####a. 文档分析(analysis)
ES会对文档进行一系列的操作和处理,是他们能够更容易被搜索.它包括如下的几个过程:
##### 字符过滤器(character filter)处理
字符过滤器的主要工作室对原始数据的特殊字符进行过滤和处理,比如去除掉文档中的html标签,把&变成单词"and"等等
##### 分词器(tokenizer)处理
所谓的分词器就是指某种算法,这个算法会按照自己的对文档(经过字符过滤器处理过的文档)进行处理,提取若干的单词,这些被提取出来的单词就成为词元(**Token**),顾名思义,这些词元已经是最小的不能分割了.
##### 标记过滤(token filters)处理
标记过滤(**token filters**)会对词元(**Token**)进行进一步的处理,处理细节包括一些将单词的大写变成小写、去除英语中的连词或者介词(to,for,of等)、去除汉语中的语气词等、进一步保证最后剩下的单词都是有明确的自然语义的词,这些剩下的单词就被称作词(**term**)
到此整个文档分析阶段就结束了
#### b.倒排索引
Elasticsearch使用一种叫做倒排索引(inverted index)的结构来做快速的全文搜索。倒排索引由在文档中出现的唯一的单词列表,以及对于每个单词在文档中的位置组成。
分词结束后,es会根据分词的结果词(**term**)构建出一个倒序索引用于快速查询.
#### c.相关度评分
在索引阶段es做的另一件事就是计算不同词(**term**)在不同文档中的相关度评分,这个评分会用在之后查询时候的查询结果的排序上,默认的会将相关度较高的文档排在最前面
### 4查询的简单介绍
#### a.URL控制的简单查询(通过GET请求中的URL参数控制)
##### 1.空查询
当我们需要查询的时候,最简单的,我们可以向ES发送一个get请求,构造一个查询的url,如下
> GET http://localhost:9200/my_index/_search
默认的,会ES会发挥my_index下的所有数据,如果数据过多ES会自动进行分页处理显示一部分数据(默认是10个).会返回如下形式的结果:
```json```
{
"took": 62,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 1,
"hits": [
{
"_index": "my_index",
"_type": "my_type",
"_id": "1",
"_score": 1,
"_source": {
"title": "Some short title",
"date": "2015-01-01",
"content": "A very long content field..."
}
}
]
}
}
2.分页查询
如果我们需要分页功能,就需要在get请求的url中加入size和from俩个参数,size表示分页大小,from表示开始位置,如下:
3.模糊查询
如果需要模糊查询,可以在URL参数中附加一个q(query的意思)参数,如下:
GET http://localhost:9200/my_index/_search?q=title:Some
意思是查询my_index下title中包含"Some"的数据.
b.结构体查询(构造json格式的body进行查询)
通过URL参数控制,我们只能进行一下简单的查询,但是在实际过程中,我们通产的查询条件都要更加复杂,这时候我们就需要使用另一种适用于复杂查询的方式--结构体查询.
按照rest ful协议,我们也是应该想ES发送GET请求来获取ES中的数据,但是在日常开发中,很多地方都不允许在GET请求上附加body数据,因此ES中我们也可以通过POST来获取ES中的数据.发送POST请求的时候,除了请求方式之外,URL和数据体body都跟GET的完全相同(以下都以POST请求为例)
1.body常用属性
- query
query部分是查询的核心部分,提供了包括模糊查询,精确过滤,多查询条件联合的复杂查询模式.例如:
json
{
"query": {
"bool": {
"must": [
{ "match": { "title": "Search" }},
{ "match": { "content": "Elasticsearch" }}
],
"filter": [
{ "term": { "status": "published" }}
]
}
}
}
上面的body的大意是要搜索title中即包含"search"并且content中包含"elasticsearch",同时status为"published"数据.关于query有专门的queryDSL来规定query的形式,在后面文档中会介绍.
- from/size 分页
from/size与url中相同,同样是用来进行分页的参数,如下:
```json```
{
"from" : 0, "size" : 10,
"query" : {
"term" : { "user" : "kimchy" }
}
}
- sort 排序
sort部分会按照给定的规则对搜索结果进行排序,如
json
{
"sort" : [
{ "post_date" : {"order" : "asc"}},
{ "price" : {"order" : "asc"}}
],
"query" : {
"term" : { "user" : "kimchy" }
}
}
如上,sort会优先按照post_date进行正序排序,当post_date相同的时候在按照price进行正序排序.特别的在日常的查询中,查询结果通常都会有相关的_scroe评分,默认的,ES会按照_score对搜索结果进行性倒叙排序,是的相关度最高的文档在最前方显示.
- fields
fields字段会对文档进行过滤,是查询结果只返回指定的字段,例如:
当不是用fields字段的时候,body如下:
```json```
{
"query":{
"match":{"title":"some"}
}
}
查询的返回结果默认的会包含所有保存的字段:
json
{
"_index": "my_index",
"_type": "my_type",
"_id": "1",
"_score": 0.15342641,
"_source": {
"title": "Some short title",
"date": "2015-01-01",
"content": "A very long content field..."
}
}
当我们使用fields的时候,body如下:
```json```
{
"fields":["title"],
"query":{
"match":{"title":"some"}
}
}
返回结果的数据部分指挥显示title字段:
json
{
"_index": "my_index",
"_type": "my_type",
"_id": "1",
"_score": 0.15342641,
"fields": {
"title": [
"Some short title"
]
}
}
- highlight
highlight部分用来控制搜索结果的高亮显示.很多时候,当我们进行全文检索的时候都会对搜索结果中的搜索关键字进行高亮以突出显示,这时候就需要用到highlight,如发送如下body的请求:
```json```
{
"query":{
"match":{"title":"some"}
},
"highlight" : {
"pre_tags" : ["<b>"], //设置高亮的前 后html标签
"post_tags" : ["</b>"],
"fields" : {
"title" : {}
}
}
}
在返回的数据部分,我们会得到高亮的字段,如下
json
{
"_index": "my_index",
"_type": "my_type",
"_id": "1",
"_score": 0.15342641,
"_source": {
"title": "Some short title",
"date": "2015-01-01",
"content": "A very long content field..."
},
"highlight": {
"title": [
"Some short title" //这里是高亮显示的关键字
]
}
}
##### 2. query
ES的主要任务是通过全文搜索引擎进行全文搜索,在ES提供的接口中,这部分任务主要由请求体中的query部门来完成的.而query DSL就是来解释query的用法.
[1]: https://www.elastic.co/downloads/elasticsearch
[2]: http://7xsvhr.com1.z0.glb.clouddn.com/ES/document/bin.jpg
[3]: http://7xsvhr.com1.z0.glb.clouddn.com/ES/document/console.jpg
[4]: http://7xsvhr.com1.z0.glb.clouddn.com/page.jpg
[5]: http://www.ruanyifeng.com/blog/2014/05/restful_api.html
[6]: http://es.xiaoleilu.com/010_Intro/25_Tutorial_Indexing.html
[7]: https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-put-mapping.html#merging-conflicts
[8]: https://www.elastic.co/guide/en/elasticsearch/reference/current/analyzer.html
ElasticSearch入门知识扫盲的更多相关文章
- jQuery学习笔记 - 基础知识扫盲入门篇
jQuery学习笔记 - 基础知识扫盲入门篇 2013-06-16 18:42 by 全新时代, 11 阅读, 0 评论, 收藏, 编辑 1.为什么要使用jQuery? 提供了强大的功能函数解决浏览器 ...
- Httpd服务入门知识-http协议版本,工作机制及http服务器应用扫盲篇
Httpd服务入门知识-http协议版本,工作机制及http服务器应用扫盲篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Internet与中国 Internet最早来源于美 ...
- Python基础入门知识
本节内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc是个什么鬼? 数据类型初识 数据运算 表达式if ...else语 ...
- ElasticSearch入门-搜索如此简单
搜索引擎我也不是很熟悉,但是数据库还是比较了解.可以把搜索理解为数据库的like功能的替代品.因为like有以下几点不足: 第一.like的效率不行,在使用like时,一般都用不到索引,除非使用前缀匹 ...
- [置顶] Mysql存储过程入门知识
Mysql存储过程入门知识 #1,查看数据库所有的存储过程名 #--这个语句被用来移除一个存储程序.不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程 #SELECT NAME FROM ...
- 移动H5开发入门知识,CSS的单位汇总与用法
说到css的单位,大家应该首先想到的是px,也就是像素,我们在网页布局中一般都是用px,但是近年来自适应网页布局越来越多,em和百分比也经常用到了.然后随着手机的流行,web app和hybrid a ...
- H5移动端开发入门知识以及CSS的单位汇总与用法
说到css的单位,大家应该首先想到的是px,也就是像素,我们在网页布局中一般都是用px,但是近年来自适应网页布局越来越多,em和百分比也经常用到了.然后随着手机的流行,web app和hybrid a ...
- Java web 入门知识 及HTTP协议详解
Java web 入门知识 及HTTP协议详解 WEB入门 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资 ...
- Java基础入门知识
Java编程入门知识 知识概要: (1)Java入门基本常识 (2)Java的特性跨平台性 (3)Java的编程环境的搭建 (4)Java的运行机制 (5)第一个Java小程序入门 (1)Java ...
随机推荐
- js中return;、return true、return false;区别
一.返回控制与函数结果, 语法为:return 表达式; 语句结束函数执行,返回调用函数,而且把表达式的值作为函数的结果 二.返回控制, 无函数结果,语法为:return; 在大多数情况下,为事件 ...
- 一个超级简单php的留言板
第一步:配置好测试环境:(详细略了) 第二部:新建一个数据库,命名为guestbook(名字可以随便改),可以直接在phpmyadmin里面操作,在数据库里面新建一张表‘content’,表里面有4个 ...
- phpwind 去除init.phpwind.net统计功能
修改的文件如下:global.phplib/staticpage.class.phprequire/template.phpsimple/index.php
- Python学习笔记九-文件读写
1,读取文件: f=open('目录','读写模式',encoding='gbk,error='egiong') 后三项可以不写但是默认是' r'读模式:open函数打开的文件对象会自动加上read( ...
- Nutshell.ThreadWorkerPool .Net线程池设计
功能描述: 支持创建多个线程池,并统一管理 支持不同线程池的容量控制,以及最少活动线程的设置 支持不同线程池中活动线程的闲时设置,即线程空闲时间到期后即自动被回收 结构设计: ThreadWorker ...
- Java抽象类深入理解-----模板方法设计模式(Templete Method)
模板方法设计模式(Templete Method) 定义一个操作中的算法骨架,而将一些可变部分的实现延迟到子类中. 模板方法设计模式使得子类可以不改变一个算法的结构即可重新定义该算法某些特定的步骤. ...
- 一个很好的幻灯片效果的jquery插件--kinMaxShow
在做一些网站时,或多或少的要给网站做幻灯片效果,以前每次做这个效果,都是现成带网上找,找到的很多很杂,而且用完后就不会再理会更加不会去总结代码. 无意中找到了kinMaxShow这个插件,机会满足了我 ...
- Linux下SVN(Subversion)自动启动脚本
在Red Hat Linux中自动运行程序 1.开机启动时自动运行程序 Linux加载后, 它将初始化硬件和设备驱动,然后运行第一个进程init.init根据配置文件继续引导过程,启动其 ...
- 《Programming WPF》翻译 第7章 4.转换
原文:<Programming WPF>翻译 第7章 4.转换 支持高分辨率显示是WPF中的重要样式.这是被部分地支持--强调了可伸缩的向量图,而不是图像.但是,正如使用GDI+和GDI3 ...
- Android高德地图自定义Markers的例子
下文为各位重点介绍关于Android高德地图自定义Markers的例子,希望这篇文章能够让各位理解到Android高德地图自定义Markers的方法. 之前的博客里说了地图的嵌入和定位,今天就说说在地 ...