springboot脚手架Tboot开发搜索引擎(一)--创建索引并修改索引字段


请对我支持,我的淘宝

请打开淘宝搜索店铺: 遇见初秋 给你女朋友或者自己买个小首饰吧

1. 我们最终实现的效果

借鉴效果
在这里插入图片描述

这里我们要实现的效果是一个法律搜索引擎,因为法律搜索引擎都是比较专业的,要想找到想要的内容需要添加使用搜索条件,实现这样的一个搜索引擎对Elasticsearch的使用技术是一种挺大的考验的。

我们并不会完全的实现他们的效果,只是会参照这个效果写一个类似的搜索引擎,并将引擎代码封装成一套搜索模板。 开发者拿到代码之后是比较容易在这个基础上开发自己想要,我符合自己业务的搜索引擎。

我同时会把实现的效果全部讲解一下,我们的重点是学习Elasticsearch的使用。 等这个开发完成之后,我们就会开发爬虫系统,给我们搜索引擎提供一点数据。 在往下就是千人千面的推荐系统了。 希望我人坚持下来


2.技术先型

其实也没有什么好选的,Elasticsearch 作为搜索引擎库最为适合不过了,已经得到了业界的认可。
可以看看Elasticsearch的官网,版本迭代速度非常快,社区非常活跃。

而我们在java程序中如何使用Elasticseach呢?
我们目前在TBoot平台中使用的是 Jest,spring-data-elasticsearch,org.elasticsearch.client 这三种整合方式并存, 我们平台都进行了整合, 开发者习惯使用哪一种就可以使用哪一种。

这有点像Mysql,有几种操作mysql的客户端 ,比如 Mybatis 和Jpa,最后在数据库中运行的都是sql。 而我们在学习中也是会把重点放到sql上。 对应到Elasticsearch 就是学习他的查询Json的编写,映射的设计,性能的优化。


3.索引创建-首先把创建的索引先凑合用,聊一下索引的技巧,后马上就要更改他

3.1首先把创建的索引先凑合用

我们这里使用Postman来操作,因为postman可以保存我们创建的请求,并对请求进行分类。 还是很方便的。
在这里插入图片描述

这里创建一个put请求就可以了。 请求体就是下面的json。
put http://localhost:9200/article_v1

{
    "mappings":{
        "properties":{
            "title":{
                "type":"keyword",
                "fields":{
                    "titleFull":{
                        "type":"text"
                    }
                }
            },
            "publicationDate":{
                "type":"date",
                "format":"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
            },
            "effectLevel":{
                "type":"keyword",
            },
            "content":{
                "type":"text",
                "analyzer":"ik_max_word",
                "fields":{
                    "contentKeyword":{
                        "type":"keyword"
                    }
                }
            }
        }
    }
}

在发请一个请求给刚创建的索引设置别名, 这里设置别名的目的是为了我们后面修改索引。也推荐大家在实战中使用索引别名。
POST http://localhost:9200/_aliases

{
    "actions" : [
        { "add" : { "index" : "article_v1", "alias" : "article" } }
    ]
}

执行结束之后,我们就可以在elasticsearch-head中查看我们创建的索引了。
在这里插入图片描述

3.2 索引已经凑合创建了,我们来聊一下创建的是一个什么东西吧

Elasticsearch 的请求体是一个Json。 因此最外层是一个 {}.

在里面是一个mappings 用来表示我们要创建的是映射。 以后还会有还mappings同一级的key。比如settings,这里就先不展开,以后会用到的,我们到时候在聊。

properties 里面的内容就是代表的具体的索引字段了。

title publicationDate effectLevel content 这些都是我们自己根据具体的业务需求定义的,和mysql中对比就是表中的字段名。

而像 title 内部的 "type":"keyword" 这个就是索引字段的类型,就像是Mysql中表中字段的类型有varchar,txt,date 等类型。 在Elasticsearch 中也是一样的产量。

下图是在我官网中截取的, Elasticsearch的字段类似还是有很多的。
官网字段

那我们简单来说一下,我们用的字段类型

字段类型字段可以说是Elasticsearch最重要的字段了,他可以使用各种分词器对字段内容进行分词,并进行搜索。有些字段类型是不可以的。

有一个经常用的小技巧,因为txt不能使用聚合索引,可以将一个字段设置成两个类型。 这里其实是将一个字段的内容以两种或多种格式来存储
我们的content就是这种格式。

"content":{
      "type":"text",
        "analyzer":"ik_max_word",
        "fields":{
            "contentKeyword":{
                "type":"keyword"
            }
        }
    }

具体的索引字段类型,等有时间在一个一个试。 今天就先这样,主要是创建好了索引之后还要修改索引。

4.索引创建之后,需求变了,我们来修改一下索引。

4.1前提需要有一个别名

使用索引重建并且不停机,需要有个前提,那就是你在使用索引时,都是使用索引别名而不是使用真正的索引名
,如果这点在你的程序上还没有做的话,那么请为其建立别名,好处很多,一旦当前索引出现了什么问题 不能及时恢复,你可以紧急切换到备用索引上而无需再重启服务、方便索引重建等等。

4.2 使用别名+reindex和修改索引字段的思路

说下我们索引重建的思路,假设我们现有索引名为:a_v1,代表索引a的第一个版本,其别名为索引:a,重建步骤如下:
第一步:创建索引a_v2(该索引的mapping需要与a_v1基本保持一致,除了你要修改的字段mapping)
第二步:把a_v1的数据导入a_v2索引中(ES中有现成的语句支持)
第三步:把a_v1别名删除并且同时为a_v2添加别名a(此时线上程序已经切换到a_v2数据源上了)
第四步:再次执行第二步骤,目的是增量同步a_v1中修改但没有同步到a_v2中的数据(因为你在做第二、三步的时候很可能线上的a_v1索引数据发生修改了)

4.3 创建一个新的索引

PUT http://localhost:9200/article_v2

{
    "mappings":{
        "properties":{
            "title":{
                "type":"keyword",
                "fields":{
                    "titleFull":{
                        "type":"text"
                    }
                }
            },
            "publicationDate":{
                "type":"date",
                "format":"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
            },
            "effectLevel":{
                "type":"keyword"
            },
            "tags":{
                "type":"text",
                "analyzer":"whitespace"
            
            },
            "content":{
                "type":"text",
                "analyzer":"ik_max_word",
                "fields":{
                    "contentKeyword":{
                        "type":"keyword"
                    }
                }
            }
        }
    }
}
4.4 现有索引数据导入目标索引

POST http://localhost:9200/_reindex

{
   "conflicts": "proceed",
  "source": {
    "index": "article_v1"
  },
  "dest": {
    "index": "article_v2",
    "op_type": "index",
    "version_type": "external"
  }
}

reindex会将一个索引的数据复制到另一个已存在的索引,但是并不会复制原索引的mapping(映射)、shard(分片)、replicas(副本)等配置信息,所以这也是为什么我们在第一步中创建了和源索引结构基本相同的目标索引的原因。
设置conflicts为proceed代表当复制数据时发生版本冲突时继续执行(默认设置在版本冲突时会中止了reindex进程)。
设置op_type为操作文档具体方式op_type操作类型
设置version_type为external就是指数据从源索引拷贝到目标索引的时候会同时拷贝上版本号字段,并更新目标索引中比源索引中更旧版本的文档。

ReIndex官方文档

4.5 设置索引的别名

POST http://localhost:9200/_aliases

{
    "actions": [
        {"remove": {"index": "article_v1", "alias": "article"}},
        { "add": {"index": "article_v2",  "alias": "article"}}
    ]
}
4.6 查看效果

可以看到索引从article_v1成功转移到了article_v2上了 。
在这里插入图片描述

猿来衣舍

这是博主开的淘宝小店,主要经营舒适保暖的服饰,有袜子、主题卫衣、保暖衣。欢迎大家选购。

TEngine java开发脚手架

测试账号 test 123456

我这个脚手架目前是做为店铺福利送给顾客的,联系客户获取

猿来衣舍
猿来衣舍
猿来衣舍
猿来衣舍

打开淘宝搜索 “猿来衣舍”这四个字就可以搜到小店,希望大家多多支持。

一个人能够走多远,关键在于与谁同行,我用跨越山海的一路相伴,希望得到您用金钱的称赞。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值