东哥语录:能动手就别抄抄
Field类 数据类型 Analyzed 是否分词 Indexed 是否索引 Stored 是否存储 说明 这个Field用来构建一个字符串Field,但是不会进行分词,会将StringField(FieldName, FieldValue,Store.YES)) 字符串 N Y Y或N 整个串存储在索引中,比如(订单号,身份证号等) 是否存储在文档中用Store.YES或Store.NO决定 这个Field用来构建一个Long数LongField(FieldName, FieldValue,Store.YES) 字型Field,进行分词和索引,比Long型 Y Y Y或N 如(价格) 是否存储在文档中用Store.YES或Store.NO决定 重载方法,支持多种类型 中 这个Field用来构建不同类型N N Y Field 不分析,不索引,但要Field存储在文档StoredField(FieldName, FieldValue) TextField(FieldName, FieldValue, Store.NO) 或 TextField(FieldName, reader) 字符串 或 流 如果是一个Reader, lucene猜测Y Y Y或N 内容比较多,会采用Unstored的策略.
4.3 Field代码修改如下
图书id:
是否分词:不用分词,因为不会根据商品id来搜索商品 是否索引:不索引,因为不需要根据图书ID进行搜索
是否存储:要存储,因为查询结果页面需要使用id这个值。
图书名称:
是否分词:要分词,因为要将图书的名称内容分词索引,根据关键搜索图书名称抽取的词。 是否索引:要索引。 是否存储:要存储。
图书价格:
是否分词:要分词,lucene对数字型的值只要有搜索需求的都要分词和索引,因为lucene对数字型的内容要特殊分词处理,本例子可能要根据价格范围搜索,需要分词和索引。
东哥语录:能动手就别抄抄
是否索引:要索引
是否存储:要存储
图书图片地址: 是否分词:不分词 是否索引:不索引 是否存储:要存储
图书描述:
是否分词:要分词 是否索引:要索引
是否存储:因为图书描述内容量大,不在查询结果页面直接显示,不存储。
不存储是来不在lucene的索引文件中记录,节省lucene的索引文件空间,如果要在详情页面显示描述,思路:
从lucene中取出图书的id,根据图书的id查询关系数据库中book表得到描述信息。 // 图书ID // 参数:域名、域中存储的内容、是否存储 // 不分词、索引、要存储 // Field id = new TextField(\ // Store.YES); Field id = newStoredField(\, book.getId().toString(), Store.YES); // 图书名称 // 分词、索引、存储 Field bookname = new TextField(\, book.getName(), Store.YES); // 图书价格 // 分词、索引、存储 Field price = new FloatField(\, book.getPrice(), Store.YES); // 图书图片 // 不分词、不索引、要存储 Field pic = new StoredField(\, book.getPic()); // 图书描述 // 分词、索引、不存储 Field description = new TextField(\, book.getDescription(), Store.NO);
东哥语录:能动手就别抄抄
5 索引维护
5.1 需求
管理人员通过电商系统更改图书信息,这时更新的是数据库,如果使用lucene搜索图书信息需要在数据库表book信息变化时及时更新lucene索引库。
5.2 添加索引
调用indexWriter.addDocument(doc)添加索引。 参考入门程序的创建索引。
5.3 删除索引 5.3.1 删除指定索引
根据Term项删除索引,满足条件的将全部删除。
// 删除索引 @Test publicvoid deleteIndex() throws Exception { } // 1、指定索引库目录 Directory directory = FSDirectory.open(new File(\)); // 2、创建IndexWriterConfig IndexWriterConfig cfg = new IndexWriterConfig(Version.LATEST, new StandardAnalyzer()); // 3、创建IndexWriter IndexWriter writer = new IndexWriter(directory, cfg); // 4、通过IndexWriter来删除索引 // b)、删除指定索引 writer.deleteDocuments(new Term(\, \)); // 5、关闭IndexWriter writer.close();
5.3.2 删除全部索引(慎用)
将索引目录的索引信息全部删除,直接彻底删除,无法恢复。慎用!!!
东哥语录:能动手就别抄抄
// 删除索引 @Test publicvoid deleteIndex() throws Exception { } // 1、指定索引库目录 Directory directory = FSDirectory.open(new File(\)); // 2、创建IndexWriterConfig IndexWriterConfig cfg = new IndexWriterConfig(Version.LATEST, new StandardAnalyzer()); // 3、创建IndexWriter IndexWriter writer = new IndexWriter(directory, cfg); // 4、通过IndexWriter来删除索引 // a)、删除全部索引 writer.deleteAll(); // 5、关闭IndexWriter writer.close(); 建议参照关系数据库基于主键删除方式,所以在创建索引时需要创建一个主键Field,删除时根据此主键Field删除。
索引删除后将放在Lucene的回收站中,Lucene3.X版本可以恢复删除的文档,3.X之后无法恢复。
5.4 修改索引
更新索引是先删除再添加,建议对更新需求采用此方法并且要保证对已存在的索引执行更新,可以先查询出来,确定更新记录存在执行更新操作。
// 修改索引 // 文件名称 Field filenameField = newStringField(\, \, Store.YES); document.add(filenameField); @Test publicvoid updateIndex() throws Exception { // 1、指定索引库目录 Directory directory = FSDirectory.open(new File(\)); // 2、创建IndexWriterConfig IndexWriterConfig cfg = new IndexWriterConfig(Version.LATEST, new StandardAnalyzer()); // 3、创建IndexWriter IndexWriter writer = new IndexWriter(directory, cfg); // 4、通过IndexWriter来修改索引 // a)、创建修改后的文档对象 Document document = new Document();

