开发者学堂课程【Lucene 知识精讲与实战(上):索引库维护】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/700/detail/12337
索引库维护
内容介绍
一、简介
二、添加索引
三、修改索引
四、删除索引
一、简介
在管理系统当中可以对商品进行添加然后修改里边的数据,然后删除里边的数据,删除这个商品数据,这都是可以的。然后不管是增删改,它操作的截至目前操作的都是对于数据库商品表里边的数据进行增删改,数据库里边的数据变了,索引库中的数据还是原来的这一份数据的话,跟数据库里边数据最新的数据就对应不上了。
所以要进行索引库的维护,也就是说当管理员,一个电商网站的后台系统当中,对商品数据进行增删改的时候,不不仅仅是要操作数据库里边的数据,还要把数据库中最新的数据给它同步到的索引库当中。同步到索引库中之后,消费者搜索到查询到的数据才是最新的。
举例,比如双11一般打折,管理员把这个价钱进行对应的降价处理,如果降价的话,它改的是数据库的话,消费者搜索的话,是从索引库中来搜索,搜索的价格还是原价,跟数据库里边降价后的价格就对应不上所以说就要把这条数据给它同步到索引库。这样的话消费者搜出来的数据才是打折后的数据,才能看到。
管理人员通过电商系统更改图书信息,这时更新的是关系数据库,如果使用ucene搜索图书信息,需要在数据库
表 book 信息变化时及时更新 lucene 索引库。
二、添加索引
调用 indexWriter.iddDocument(doc) 添加索引。
参考入门程序的创建索引。
三、修改索引
更新索引是先删除再添加,建议对更新需求采用此方法并且要保证对已存在的索引执行更新,可以先查询出来,确定更新记录存在执行更新操作。
演示,在 Test index manager 测试类里,把原来添加的数据,复制粘贴一份,然后改名,叫做 update。
对于采集数据就可以不采集了,把这一部分数据进行修改一下。这里对于是否索引是否存储等等这,可以删掉。
索引库修改操作
@throws Exception
@Test
public void updateIndexTest()throws Exception{
//需要变更成的内容
Document document=new Document);
document.idd(new StringField("id",));
document.idd(new TextField("name",sku.getName(),FieldStore.YES));
document.idd(new IntPoint("price",sku.getPrice(()));
document.idd(new StoredField("price",sku.getPrice()));
document.idd(new StoredField("image",sku.getImage()));
document.idd(new StringField("categoryName",sku.getCategoryName(),Field.Store.YES));
document.idd(new StringField("brandName",sku.getBrandName(),Field.Store.YES)):
首先看一下 document,document 这里默认的零条数据,第零条数据它的 id 这里叫做它的id的值拿出来,看做 DOC,给它 copy 出来,
接下来把它粘贴到的 idea 当中,尾号是3145,然后看一下能不能对应的上。ID叫做它改它改这个内容。看一下这里为什么报错了,先不管它,再来看它的内容,它的名称的话,这里随便写一下,图片的地址叫做 x 点 JPG。再来看分类名和品牌名,分类的名称的话,分类的话这个叫做手机,然后这个品牌名,品牌名叫做华为
报错发现,需要将是否存储给它加上,这样存储不报错了,这个是需要变更成的,内容变更后就完成了。这里要变更 ID 为它的这里来看 index,writer 点 at document,这个是写入文档,修改的话还是利用 index,writer 输出流。
关于update的操作。需要传两个参数,第一个参数是修改条件。根据什么进行修改?第二个参数是修改层的内容,即改成什么样的内容,而上边创建的对象文档对象,把它作为修改后的内容,修改条件是什么不能是这个文档库将近小100万条的数据索引库里边,小于100万条数据都给它改成内容,这个肯定不合理。是把某一条数据的内容这里改成这样,所以第二个是修改后的内容,修改条件一般是根据业务的组建 id 进行修改,所以这里就new一个 term 对象,这个 term 对象是词对象,它里边的格式是 key value,根据id改成文档内容。
这个时候 ID 里边文档内容是 Vivo 手机看好了之后把它关掉,然后执行这个修改方法,然后看看能不能改,速度很非常快,一下就改完了,
改完之后重新打开软件这个小工具,来看一看它改后的内容,看文档零发现没了。
不能修改的原理就是如果修改的话,它会根据要修改的查询条件,把要修改的这篇文档查出来,然后给它删了,删了之后,在文档的最后一个位置添加上需要修改成的内容。
四、删除索引
//测试根据条件删除
//indexwriter.deleteDocuments(new Term("id”,“100000003145"));
//测试删除所有内容
indexwriter.deleteAll();
其实关于索引库维护的时候,这里还有删除。删除又分为两种,一种就是说根据某一个删除条件,删除某一个内容。第二就是说删除所有把所有的索引库里边的内容,全都清空了,关于删除所有要慎重使用,因为一旦删除都删除了,假如说实用库里边的数据不是说几百万几千万条,有可能是 gtbg EB 的这样的数据量非常大,一旦都给删除了,再想重新来创建缩影库,所要消耗的时长是非常长的成本非常高,所以一般都是根据不要了,根据某一个查询条件,然后根据条件去删除某一个文档。
依照惯例,还是把上边的内容整个复制粘贴。这里测试什么?删除,delete,delete, Index。好,这个是测试,根据条件删除。
下面这里输出流,这里要测试,根据条件删除,根据条件删除的话,在这里实验一下,点delete,二是删除所有不用要根据条件删除,delete documents,这个是根据条件删除,删除条件是 term 词,根据哪个域哪个词进行删除,就传入它的深度条件。这里是 key value 的电子,对上边已经用过。根据 ID,一般 ID 是唯一的,根据它删除是比较靠谱的。后面看删除的内容,把 ID 叫做这个的给它删除了。当然也可以根据名称,比如说叫做华为的名称中包含手机的删除都行,这个就相当于查询条件来使用。
下面将的 lunk 小工具打开之后,看它这里这个内容刚才能查出来,把它关掉,关掉之后,然后接下来再来执行,执行完之后看测试结果,执行完成了之后,这个查询条件不变。
点不了是因为索引库没打开,重新打开之后,然后这里到搜索选项卡,查询域名叫做 ID,然后查询的关键词,就说明他已经被成功的删掉了。这个效果大家不明显的话,假如说再来删什么删所有看一下,这个叫做测试删除,所有内容删除。把上边除掉,再用输出流来进行删除。调用这个方法来进行删除所有还是来看一下lunk这个小工具,这个查不出来了,但是其他的数据的这些文档都还在,索引没有变化,关键字索引里边数据太多了,即使有变化可能也关注不到。先把它关了之后,然后再来执行,这里执行删除所有看看情况。
执行完了之后,再来打开的索引库,看文档。什么数据都没有了,
这样在索引库的维护当中,添加就开始就做了,后续演示的修改,还有删除,索引库维护的内容到目前为止就完成了。