1、我们都知道Elasticsearch是一个实时分布式搜索和分析引擎,是面向文档类型的。 首先我们先看一下关系型数据库和Elasticsearch的关系对比图 此时的可以认为的关系是关系型数据库的数据库(database)名相当于Elasticsearch的索引(indices),数据库表(table)相当于Elasticsearch的的type,以此类推。(暂时这样可以理解方便)。 在关系型数据库中我们找数据库都是“找到数据库名->找到表名->找到所需要的行->找到列->最后找到字段的信息”。所以我们可以理解Elasticsearch的逻辑设计同样也是“找到索引indices->找到types->找到documents->找到field”,由此得到的逻辑结构是“索引-》类型-》文档ID-》文件体”。 前面所说的Elasticsearch是面向文档的,那么就意味着索引和搜索的数据的最小单位是文档,所以要理解文档的几个重要的属性: (1)自我包含,即一篇文档同时包含字段和对应的值,也就是同时包含 key:value。就是key:value中又包含key:value。类似于(如下图) JSON的格式 (2)可以是层次型的,一个文档中包含自文档,复杂的逻辑实体就是这么来的 (3)灵活的结构,文档不依赖预先定义的模式,我们知道关系型数据库中,要提前定义字段才能使用,在elasticsearch中,对于字段是非常灵活的,有时候,我们可以忽略该字段,或者动态的添加一个 新的字段。 2、关于Elasticsearch的类型 类型是文档的逻辑容器,就像关系型数据库一样,表格是行的容器。 类型中对于字段的定义称为映射,比如 name 映 射为字符串类型。 我们说文档是无模式的,它们不需要拥有映射中所定义的所有字段, 比如新增一个字段,那么elasticsearch是怎么做的呢?elasticsearch会自动的将新字段加入映射,但是这个字段的不确定它是什么类型,elasticsearch就开始猜,如果这个值是18,那么elasticsearch会认为它 是整形。 但是elasticsearch也可能猜不对, 所以最安全的方式就是提前定义好所需要的映射,这点跟关系型数据库殊途同归了,先定义好字段,然后再使用。 简单地说就是elasticsearch可以是自己猜你所增加的字段的类型,当可能又猜不准,但MySql不会猜你的字段类型,直接报错,一次为了避免一些愚蠢的错误,我们设计是都合理地加上类型。 3、elasticsearch的索引 索引是映射类型的容器,elasticsearch中的索引是一个非常大的文档集合。索引存储了映射类型的字段和其他设置 4、先看一个表 如果要搜索含有 python 标签的文章,那相对于查找所有原始数据而言,查找倒排索引后的数据将会快的多。只需要查看标签这一栏,然后获取相关的文章ID即可。 传统的我们的检索是通过文章,逐个遍历找到对应关键词的位置。 而倒排索引,是通过分词策略,形成了词和文章的映射关系表,这种词典+映射表即为倒排索引。 5、ik分词器。其实就是将获得的一段文字划分为一个个关键字,我们在搜索时候会把自己的信息进行分词,会把数据库中或者索引库中的数据进行分词,然后进行一个匹配操作,默认的中文分词是将每个字看成一个词。 如果熟悉Python的词云那一部分知识的对于ik分词器就明白是什么意思。 IK提供了两个分词算法:ik_smart,ik_max_word。 ik_smart:粗粒度分词,优先匹配最长的词,一般只有一个词 ik_max_word:细粒度分词,会尽穷一个语句中所有分词的可能 6、增删改查命令
(1)增加数据
PUT /lamguage/php/1
{
“ID”:”php语言”,
“name”:”php语言”,
“desc”:”世界上最好的语言”
}
/lamguage/php/1的格式就是前面说的:索引-》类型-》文档ID 注意:put也有修改的功能(post也可以修改):当执行 命令时,如果数据不存在,则新增该条数据,如果数据存在则修改该条数据。 (2)更新(修改)数据 我们使用 POST 命令,在 id 后面跟 _update(这个是修改功能固定的,不是自定义的),要修改的内容放到 doc 文档(属性)中即可。
POST /lamguage/php/1/_update
{
“doc”:{
“ID”:“1”
“name”:”php语言No1”,
“desc”:”世界上最好的语言”
}
}
(3)查询(无条件查询和有条件查询) 无条件查询:GET lamguage/php/_search 有条件查询:GET lamguage/php/_search?q=name: php语言No1 当然,也可以构建查询语句:格式 例子1:
GET lamguage/php/_search
{
“query”:{#查询关键词
“match”:{#查询条件
“name”:” php语言No1”
}
}
}
例子2:
GET lamguage/php/_search
{
“query”:{#查询关键词
“match_all”:{}
}
}
“match_all”:{}空值时表示没有查询条件,全部查找 例子3:
GET lamguage/php/_search
{
“query”:{#查询关键词
“match_all”:{}
},
“_source”:[“name”,”desc”]#通过_source来返回的属性name和desc
}
(4)排序查询,关键词:sort 注意:在排序的过程中,只能使用可排序的属性(数字、日期、ID)进行排序。其它的都不可用。
GET lamguage/php/_search
{
“query”:{#查询关键词
“match_all”:{}
},
“sort”:[
{
“ID”{
“order”:”desc”#desc降序,asc就是升序了
}
}
]
}
(5)分页查询:关键词:form和size
GET lamguage/php/_search
{
“query”:{#查询关键词
“match_all”:{}
},
“sort”:[
{
“ID”{
“order”:”desc”#desc降序,asc就是升序了
}
}
],
“from”:0, #从第n条开始
“size”:1 #返回n条数据
}
(6)布尔查询 1、关键词must(类似MySql语句的and)
GET person/user/_search
{
“query”:{
“bool”:{
“must”:[
{
“match”:{
“name”:”法外狂徒”
}
},
{
“match”:{
“age”:27
}
}
]
}
}
}
2、关键词should(类似MySql语句的or)
GET person/user/_search
{
“query”:{ #查询
“bool”:{ #返回Boolean值
“should”:[ # should (类似MySql语句的or)
{
“match”:{ #条件1 match{条件内容}
“name”:”法外狂徒”
}
},
{
“match”:{ #条件2 match{条件内容}
“age”:27
}
}
]
}
}
}
3、关键词must_not(类似MySql语句的not)
GET person/user/_search
{
"query": {
"bool": {
"must_not": [ # must_not(类似MySql语句的not)
{ "match": {
"age": 18
}
}
]
}
}
}
4、Filter:过滤(比如数据库语句:大于多少,少于多少,在什么区间) 关键词:gt表示大于 gte表示大于等于 lt表示小于 lte表示小于等于
GET user/student/_search
{
“query”:{ #查找条件
“bool”:{ #判断返回结果
“must”[ #关系
{
“match”:{ #条件必须是类似where后面的条件
“name”:”张三狂徒”
}
}
],
“filter”:{ #过滤条件
“range”:{ #范围
“age”:{
“gte”:25, #大于等于
“lte”:30 #小于等于
}
}
}
}
}
}
5、短语检索(Mysql的模糊查询)
GET student/user/_search
{
"query":{
"match": {
"tags": "狂徒" #有狂徒的标签
}
}
}
6、精确查询(term查询) term查询是直接通过倒拍索引指定的词条,也就是精确查找。 term和match的区别: ·match是经过分析(analyer)的,也就是说,文档是先被分析器处理了,根据不同的分析器,分析出的结果也会不同,在会根据分词 结果进行匹配。 ·term是不经过分词的,直接去倒排索引查找精确的值。 (1)创建数据
PUT /testdb
{
“mappings”:{
“properties”:{
“name”:{
“type”:”text”
},
“desc”:{
“type”:”keyword”
}
}
}
}
有没有发现,这次添加的数据与其它有所不同,主要的就是用mappings properties去给多个字段(field)指定类型的时候,不能给我们的索引(/testdb)制定类型 (2)插入数据 插入第一条数据
PUT /testdb/_doc/1
{
“name”:” 张三狂徒”,
“desc”:”永远在刑法的路上”
}
插入第二条数据
PUT /testdb/_doc/1
{
“name”:” 张三狂徒”,
“desc”:”终于服刑了”
}
此时我们用分析器来对比keyword类型和standard类型 ·keyword类型:不会被分析器处理 ·standard类型:会被分析器处理,分成一个个 _analyze是Elasticsearch一个非常有用的API,它可以帮助你分析每一个field或者某个analyzer/tokenizer是如何分析和索引一段文字。 如1:
GET _analyze
{
“analyzer”:”keyword”,
“text”:” 永远在刑法的路上”
}
如2:
GET _analyze
{
“analyze”:”standard”,
“text”:” 永远在刑法的路上”
}
7、查找多个精确值,关键词terms 例如:
GET testdb/_serch
{
“query”:{
“bool”:{
“should”:[
{
“term”:{
“t1”:”查找的数据”
}
},
{
“term”:{
“t1”:” 查找的数据”
}
}
]
}
}
}
8、高亮显示:类似当你在百度输入一个词语是,查到的网页中显示的你输入的词语用不同的颜色表示 关键词:highlight 例1:默认显示高亮样式
GET student/user/_search
{
“query”:{
“match”:{
“name”:”张三”
}
},
“highlight”:{
“fileds”:{
“name”:{}
}
}
}
例1:自定义显示高亮样式
GET student/user/_search
{
“query”:{
“match”:{
“name”:”张三”
}
}
“hightlight”:{
“pre_tags”:”<b class =’key’ style=’color:red’>”,
“post_tags”:”</b>”,
“fields”:{
“name”:{}
}
}
}
|