目录
Elasticsearch简介
ElasticSearch 是一个基于Luncene的搜索服务。它提供了一个分布式多用户能力的全文搜索引擎,基于RestFul web接口
Elasticsearch是java语言开发的满足Apache许可条件的开放源码,是一种流行的企业级搜索引擎。
ElasticSeach用于云计算中,能够达到实时搜索,文档可靠,快速,安装使用方便。
--------------以上简介来自百度
我理解的Elasticseach就是一个高拓展的分布式索引库,它可以近乎实时的检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。
Elasticseach客户端的安装就不讲了,自己找资源吧。Elasticsearch的官方地址:https://www.elastic.co/cn/downloads/past-releases
Elasticseach服务简介
启动Elasticsearch服务,在浏览器输入http://127.0.0.1:9200,就会看到elasticsearch的的几个简单介绍,有服务名,版本号,创建时间等信息。
(这里有两点需要注意:
1、9300是tcp通讯端口,集群间和TCP 客户端都执行该端口,9200是http协议的RESTful接口 。
2、Elasticsearch是使用java开发的,且本版本的es需要的jdk版本要是1.8及以上,所以安装Elasticsearch之前保证JDK1.8+安装完毕,并正确的配置好JDK环境变量,否则启动Elasticsearch失败 )
ElasticsearchGoogle插件
这个插件,对操作elasticsearch特别方便,下面是界面,blog是自己创建的
Elasticsearch核心概念
Elasticsearch是面向文档的,这就意味着它可以存储整个对象或者文档。然而它不仅仅是存储,还会索引(index)每个文档的内容(而非成行成列的数据 )使之可以被搜索。在Elasticsearch中,你可对文档进行索引、搜索、排序、过滤等操作。
Elasticsearch比较于传统关系型数据库如下:
MySQL(relational DB)-->DataBases(数据库)-->Tables(表)-->Rows(行) -->Columns(列)
Elasticseach -->Indexex(索引) -->Types(类型)-->Docun=ments(文档)-->Fields(字段)
索引
索引index,在Elasticseach中存储数据的行为就叫做索引,一个索引由一个名字来标识(必须全部是小写字母)。索引(index)这个词在Elasticseach中有着不同的含义,所有在这里做一个区分
索引(名词):如上文所述,一个索引(index)就像是传统关系数据中的数据库,它是相关文档存储的地方,、;
索引(动词):(索引一个文档)表示把一个文档存储到索引(名词)里,以便它可以被检索或者查询。这很像SQL中的Intert关键字。它与insert的差别是,如果文档已经存在,新的文档将覆盖就得文档。
类型
类型type,在一个索引中,可以定义一种或者多类型。相当于关系类型库中的表。一个类型是索引的一个逻辑上的分类或分区,其语义完全由你来定。通常,会为具有一组共同字段的文档定义一个类型。比如说,我们假设你运营一个博客平台并且将你所有的数据存储到一个索引中。在这个索引中,你可以为用户数据定义一个类型(用户表),为博客数据定义另一个类型(Article表),当然,也可以为评论数据定义另一个类型(评论表)。
字段
字段Field,相当于数据表的字段,对不同属性进行分类表示
映射
映射mapping是处理数据的方式和规则,是针对字段做的一些限制,字段的配置。比如:某个字段的数据类型、默认值、分词器、是否被索引等等,这些都是映射里面的设置。其他就是处理ES里面数据的一些属于规则设置也叫做映射,按着最优规则处理数据对性能提高很大,因此需要建立映射,并且需要思考如何建立映射才能对性能更好。
文档
文档 document一个文档是一个可被索引的基础信息单元。比如,你可以拥有某一个客户的文档,某一个产品的一个文档,当然,也可以拥有某个订单的一个文档。文档以JSON(Javascript Object Notation)格式来表示,而JSON是一个到处存在的互联网数据交互格式。
在一个index/type里面,你可以存储任意多的文档。注意:文档必须被赋予一个索引的type
使用postman进行简单的Elasticseach操作
创建索引并配置映射
请求方式:PUT
请求url:httphttp://localhost:9200/blog2
请求体
{
"mappings": {
"article": {
"properties": {
"id": {
"type": "long",
"store": true,
"index":"not_analyzed"
},
"title": {
"type": "text",
"store": true,
"index":"analyzed",
"analyzer":"standard"
},
"content": {
"type": "text",
"store": true,
"index":"analyzed",
"analyzer":"standard"
}
}
}
}
}
操作内容如下
单独设置映射
请求方式:POST
请求url:http://127.0.0.1:9200/blog2/hello/_mapping
请求体
{
"hello": {
"properties": {
"id":{
"type":"long",
"store":true
},
"title":{
"type":"text",
"store":true,
"index":true,
"analyzer":"standard"
},
"content":{
"type":"text",
"store":true,
"index":true,
"analyzer":"standard"
}
}
}
}
删除索引
请求方式:DELETE
请求url:http://localhost:9200/blog1
创建文档
地址最后的值为索引库中文档的ID,如果不传会随机生成一个。
请求方式:POST
请求url:http://localhost:9200/blog2/article/1
请求体:
{
"id":1,
"title":"Elasticsearch是一个基于Lucene的搜索服务器",
"content":"它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。"
}
在这里修改的方法和创建的方式一样,新的内容会覆盖之前的文档
删除只需要修改请求方式为delete即可
查询
根据ID查
请求方式:GET
请求url:http://localhost:9200/blog1/article/1
queryString查询
query_string是带分词器的查询 分词器在下面介绍。
请求方式:POST
请求url:http://localhost:9200/blog1/article/_search
请求体
{
"query": {
"query_string": {
"default_field": "title",
"query": "搜索服务器"
}
}
}
term查询
term查询,关键词匹配 term不支持全文搜索
请求方式:POST
请求url:http://localhost:9200/blog1/article/_search
请求体
{
"query": {
"term": {
"title": "搜"
}
}
}
分词器简介
在上面使用term搜索的时候,如果搜索的title是搜索,则什么也搜不到,原因就是,我们创建索引库的时候配置的分词器是ElasticSearch默认的分词器。磨人的分词器,分不出搜索这样的关键字。标准分词器分的词其实是一个一个的字
这点可以通过在浏览器输入http://127.0.0.1:9200/_analyze?analyzer=standard&pretty=true&text=Elasticsearch是一个基于Lucene的搜索服务器 来验证。
_analyze:说明这里是使用分词器
analyzer=standard:这里说的是使用标准分词器
pretty=true :这里是说数据格式化显示
text=Elasticsearch是一个基于Lucene的搜索服务器 是说的分词的内容
这里面英文单词没有被分开。因为
英文本身是以单词为单位, 单词与单词之间,句子之间通常是空格、逗号、句号分隔. 因而对于英文,可以简单的以空格来判断某个字符串是否是一个词,比如: I love itheima,love和itheima很容易被程序处理。
但是中文是以字为单位的,字与字再组成词,词再组成句子。中文:我是程序员, 程序不会思考不知道“程序”是一个词,还是“程序员”是一个词?所以我们需要一定的规则来告诉电脑应该怎么切分, 这就是中文分词器所要解决的问题。
我们在这里讲一下IK分词器
IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始,IKAnalyzer已经推出 了3个大版本。最初,它是以开源项目Lucene为应用主体的,结合词典分词和文法分析算法的中文分词组件。新版本的IKAnalyzer3.0则发展为 面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现。
IK分词器3.0的特性如下:
-
采用了特有的“正向迭代最细粒度切分算法“,具有60万字/秒的高速处理能力。
-
采用了多子处理器分析模式,支持:英文字母(IP地址、Email、URL)、数字(日期,常用中文数量词,罗马数字,科学计数法),中文词汇(姓名、地名处理)等分词处理。
-
对中英联合支持不是很好,在这方面的处理比较麻烦.需再做一次查询,同时是支持个人词条的优化的词典存储,更小的内存占用。
-
支持用户词典扩展定义。
-
针对Lucene全文检索优化的查询分析器IKQueryParser;采用歧义分析算法优化查询关键字的搜索排列组合,能极大的提高Lucene检索的命中率。
使用IK分词器,需要在Elasticseach中导入插件,
插件地址:https://github.com/medcl/Elasticsearch-analysis-ik/releases
将下载后的IK分词器解压到Elasticsearch-5.6.8\plugins下,并重命名文件夹为analysis-ik(为了便于区分)
IK分词器提供了两种分词算法ik_smart 和 ik_max_word ,其中 ==ik_smart 为最少切分==,==ik_max_word为最细粒度划分==
下面以“我是开心的程序员”为例一一实验分词算法
1)最小切分ik_smart :在浏览器地址栏输入地址
2)最细切分ik_max_word:在浏览器地址栏输入地址
从结果中很容易看到连个分词算法的不同
在创建索引时设置分词器
创建blog3索引,此时分词器使用ik_max_word
请求方式:PUT
请求地址:http://localhost:9200/blog3
请求体
{
"mappings": {
"article": {
"properties": {
"id": {
"type": "long",
"store": true,
"index":"not_analyzed"
},
"title": {
"type": "text",
"store": true,
"index":"analyzed",
"analyzer":"ik_max_word"
},
"content": {
"type": "text",
"store": true,
"index":"analyzed",
"analyzer":"ik_max_word"
}
}
}
}
}
总结:
写这些东西就是为了理解Elasticseach,方便后面学spring-data-es的时候脑子更清晰
能力尚浅,有待进步,如有不足,不吝赐教!