Field属性(域)

1. Field属性

Field是文档中的域,包括Field名和Field值两部分,一个文档可以包括多个Field,Document只是Field的一个承载体,Field值即为要索引的内容,也是要搜索的内容。

  • 是否分词(tokenized)

是:作分词处理,即将Field值进行分词,分词的目的是为了索引。

比如:商品名称、商品描述等,这些内容用户要输入关键字搜索,由于搜索的内容格式大、内容多需要分词后将语汇单元建立索引

否:不作分词处理

比如:商品id、订单号、身份证号等 

  • 是否索引(indexed)

是:进行索引。将Field分词后的词或整个Field值进行索引,存储到索引域,索引的目的是为了搜索。

比如:商品名称、商品描述分析后进行索引,订单号、身份证号不用分词但也要索引,这些将来都要作为查询条件。

否:不索引。
比如:图片路径、文件路径等,不用作为查询条件的不用索引。

  • 是否存储(stored)

是:将Field值存储在文档域中,存储在文档域中的Field才可以从Document中获取。

比如:商品名称、订单号,凡是将来要从Document中获取的Field都要存储。

否:不存储Field值
比如:商品描述,内容较大不用存储。如果要向用户展示商品描述可以从系统的关系数据库中获取。

4.2 Field常用类型

下边列出了开发中常用 的Filed类型,注意Field的属性,根据需求选择:

Field类  数据类型  Analyzed是否分词  Indexed是否索引  Stored是否存储  说明 
StringField(FieldName, FieldValue,Store.YES))  字符串  Y或N  这个Field用来构建一个字符串Field,但是不会进行分词,会将整个串存储在索引中,比如(订单号,身份证号等)是否存储在文档中用Store.YES或Store.NO决定 
LongField(FieldName, FieldValue,Store.YES)  Long型  Y或N  这个Field用来构建一个Long数字型Field,进行分词和索引,比如(价格)是否存储在文档中用Store.YES或Store.NO决定 
StoredField(FieldName, FieldValue)  重载方法,支持多种类型  这个Field用来构建不同类型Field不分析,不索引,但要Field存储在文档中 
TextField(FieldName, FieldValue, Store.NO)或TextField(FieldName, reader)  字符串或流  Y或N  如果是一个Reader, lucene猜测内容比较多,会采用Unstored的策略. 

4.3 Field修改

4.3.1 修改分析

图书id:

是否分词:不用分词,因为不会根据商品id来搜索商品 

是否索引:不索引,因为不需要根据图书ID进行搜索

是否存储:要存储,因为查询结果页面需要使用id这个值。

图书名称:

是否分词:要分词,因为要根据图书名称的关键词搜索。

是否索引:要索引。

是否存储:要存储。

图书价格:

是否分词:要分词,lucene对数字型的值只要有搜索需求的都要分词和索引,因为lucene对数字型的内容要特殊分词处理,需要分词和索引。

是否索引:要索引

是否存储:要存储

图书图片地址:

是否分词:不分词

是否索引:不索引

是否存储:要存储

图书描述:

是否分词:要分词

是否索引:要索引

是否存储:因为图书描述内容量大,不在查询结果页面直接显示,不存储。

不存储是不在lucene的索引域中记录,节省lucene的索引文件空间。

如果要在详情页面显示描述,解决方案:

从lucene中取出图书的id,根据图书的id查询关系数据库(MySQL)中book表得到描述信息。

4.3.2 代码修改


//创建文档对象
Document doc = new Document();
//不分词,不索引,储存
//doc.add(new TextField("id",book.getId()+"", Field.Store.YES));
doc.add(new StoredField("id",book.getId()+""));

// 图书名称
// 分词,索引,储存
//doc.add(new TextField("name",book.getName(), Field.Store.YES));
doc.add(new TextField("name", book.getName().toString(), Field.Store.YES));

// 图书价格
// 分词,索引,储存
//doc.add(new TextField("price",book.getPic()+"", Field.Store.YES));
doc.add(new FloatField("price", book.getPrice(), Field.Store.YES));

// 图书图片地址
// 不分词,不索引,储存
//doc.add(new TextField("pic",book.getPic(), Field.Store.YES));
doc.add(new StoredField("pic", book.getPic().toString()));

// 图书描述
// 分词,索引,不储存
//doc.add(new TextField("desc",book.getDesc(), Field.Store.YES));
doc.add(new TextField("desc", book.getDesc().toString(), Field.Store.NO));
docs.add(doc);

你可能感兴趣的:(lucene)