一、基础概念
数据的分类:
1、结构化数据:指具有固定格式或有限⻓度的数据,如数据库,元数据等。 对于结构化数据,我们⼀般都是可以通过关系型数据库(mysql,oracle等)的 table 的⽅ 式存储和搜索,也可以建⽴索引。通过b-tree等数据结构快速搜索数据。
2、⾮结构化数据:全⽂数据,指不定⻓或⽆固定格式的数据,如邮件,word⽂档等。 对于⾮结构化数据,也即对全⽂数据的搜索主要有两种⽅法:顺序扫描法,全⽂搜索法。
全⽂搜索
对⾮结构化数据进行信息提取出来,重新组织,使其变得有⼀定结构,然后对这些有⼀定结构的数据进⾏搜索,从⽽达到搜索相对较快的⽬的。这种⽅式就构成了全⽂搜索的基本思路。这部分从⾮结构化数据中提取出的然后重新组织的信 息,我们称之索引。
什么是全文搜索引擎?
原理:是计算机索 引程序通过扫描⽂章中的每⼀个词,对每⼀个词建⽴⼀个索引,指明该词在⽂章中出现的次数和位 置,当⽤户查询时,检索程序就根据事先建⽴的索引进⾏查找,并将查找的结果反馈给⽤户的。
常见搜索引擎主要有 :Lucene 、Solr 、Elastic search
适合的场景:
- 搜索的数据对象是⼤量的⾮结构化的⽂本数据。
- ⽂本数据量达到数⼗万或数百万级别,甚⾄更多。
- ⽀持⼤量基于交互式⽂本的查询。 需求⾮常灵活的全⽂搜索查询。
- 对安全事务,⾮⽂本数据操作的需求相对较少的情况。
Elasticsearch Elasticsearch是⼀个开源,是⼀个基于Apache Lucene库构建的Restful搜索引擎。
能够实现在海量数据中快速检索到满足条件的数据,同时还可以实现分页、高亮显示等功能。除此之外,还可以用于日志统计、分析、系统监控等
一般使用es会结合Kibana,它提供了数据可视化,提供了图形化界面,可以操作ES
查询数据的两种索引类型:
正向索引:是先通过文件名找到具体的文件,再获取文件中的内容过程
倒排索引:从文件的内容查找,得到包含这些内容的文件列表,再得到文件对应的信息,如文件名、作者、文件大小、创建时间等。
过程:把文档内容进行分词,得到一个词条表【词条:文档ID列表】,给词条创建索引。把要搜索的内容进行分词,根据分词后的结果去词条表中根据词条进行匹配,得到文档ID列表,再通过文档ID返回具体的文档信息
二、Elasticsearch基本结构
索引(index):⼀个索引可以理解成⼀个关系型数据库。
类型(type): ⼀种type就像⼀类表,⽐如user表,order表。 注意: ES 5.x中⼀个index可以有多种type。 ES 6.x中⼀个index只能有⼀种type。 ES 7.x以后已经移除type这个概念。
映射(mapping) :mapping定义了每个字段的类型等信息。相当于关系型数据库中的表结构。 ⽂档(document) ⼀个document相当于关系型数据库中的⼀⾏记录。
字段(field) :相当于关系型数据库表的字段 集群(cluster) 集群由⼀个或多个节点组成,⼀个集群有⼀个默认名称"elasticsearch"。
节点(node) :集群的节点,⼀台机器或者⼀个进程。
分⽚和副本(shard) :副本是分⽚的副本。分⽚有主分⽚(primary Shard)和副本分⽚(replica Shard)之分。 ⼀个Index数据在物理上被分布在多个主分⽚中,每个主分⽚只存放部分数据。 每个主分⽚可以有多个副本,叫副本分⽚,是主分⽚的复制。
三、ES基本使用
1、索引的介绍和使⽤
新增索引:PUT "localhost:9200/nba"
获取索引:GET "localhost:9200/nba"
删除索引:DELETE "localhost:9200/nba"
批量获取索引:GET "localhost:9200/nba,cba"
获取所有索引:GET "localhost:9200/_all" GET "localhost:9200/_cat/indices?v"
2、映射的介绍和使⽤
新增映射 PUT "localhost:9200/nba/_mapping"
获取映射 GET "localhost:9200/xdclass/_mapping"
批量获取:GET "localhost:9200/nba,cba/mapping"
获取所有:1.X GET "localhost:9200/_mapping";2.GET "localhost:9200/_all/_mapping"
修改映射:PUT "localhost:9200/nba/_mapping"
{
"properties":{
"id":{
"type":"integer"
}
}
}
3、⽂档的增删改查
新增⽂档:1.PUT localhost:9200/nba/_doc/1 (指定id) 注:指定需要用PUT
2.POST localhost:9200/nba/_doc (不指定id) 不需要指定
{ "name":"库⾥", "team_name":"勇⼠", "position":"组织后卫", "play_year":"10","jerse_no":"30"}
查看⽂档:GET localhost:9200/nba/_doc/1
查看多个⽂档:1.POST localhost:9200/_mget
{"docs" : [ { "_index" : "nba", "_type" : "_doc", "_id" : "1" }, { "_index" : "nba", "_type" : "_doc", "_id" : "2" } ] }
POST localhost:9200/nba/doc/mget
{ "docs" : [ { "_id" : "1" }, { "_id" : "2" } ] }
GET localhost:9200/nba/doc/mget
{ "ids" : ["1", "2"] }
修改⽂档: POST localhost:9200/nba/_update/1
{ "doc": { "name": "哈登", "team_name": "⽕箭", "position": "双能卫", "play_year": "10", "jerse_no": "13" } }
删除⽂档:DELETE localhost:9200/nba/_doc/1