一、概况
1.0 Field域
Field是文档中的域,包括Field名和Field值两部分,一个文档可以包括多个Field,Document只是Field的一个承载体,Field值即为要索引的内容,也是要搜索的内容。
- 是否分词(tokenized)
是:作分词处理,即将Field值进行分词,分词的目的是为了索引。
比如:商品名称、商品简介等,这些内容用户要输入关键字搜索,由于搜索的内容格式大、内容多需要分词后将语汇单元索引。
否:不作分词处理
比如:商品id、订单号、身份证号等
- 是否索引(indexed)
是:进行索引。将Field分词后的词或整个Field值进行索引,索引的目的是为了搜索。
比如:商品名称、商品简介分析后进行索引,订单号、身份证号不用分析但也要索引,这些将来都要作为查询条件。
否:不索引。该域的内容无法搜索到
比如:商品id、文件路径、图片路径等,不用作为查询条件的不用索引。
- 是否存储(stored)
是:将Field值存储在文档中,存储在文档中的Field才可以从Document中获取。
比如:商品名称、订单号,凡是将来要从Document中获取的Field都要存储。
否:不存储Field值,不存储的Field无法通过Document获取
比如:商品简介,内容较大不用存储。如果要向用户展示商品简介可以从系统的关系数据库中获取商品简介。
1.1 Field常用类型
开发中常用 的Filed类型,注意Field的属性,根据需求选择:
Field类 | Type | tokenized | indexed | Stored | 说明 |
---|---|---|---|---|---|
StringField(String name, String value, Store stored) | String | N | Y | N或Y | 这个Field用来构建一个字符串Field,但不会分词,会将整个串存储在索引中,比如(订单号、省份证等)是否存储在文档中用 Store.YES或Store.NO来决定 |
TextField(String name, String value, Store store) | String或流 | Y | Y | Y或N | 如果是一个Reader,lucene查询内容比较多,会采用Unstored的策略 |
LongField(String name, long value, Store stored) | Long | Y | Y | Y或N | 这个Field是用来构建一个Long数字型Field,进行分词和索引,比如价格、库存是否存储在文档中用 Store.YES或Store.NO来决定 |
StoredField(String name, BytesRef bytes, FieldType type) | 重载支持多种类型 | N | N | Y | 这个Field是用来构建不同类型Field不分析,不索引,但存储在文档中 |
1.2 案例分析
- 手机id:
是否分词:不用分词,因为不会根据商品id来搜索商品
是否索引:不索引,因为不需要根据手机ID进行搜索
是否存储:要存储,因为查询结果页面需要使用id这个值。
- 手机名称:
是否分词:要分词,因为要将手机的名称内容分词索引,根据关键搜索手机名称抽取的词。
是否索引:要索引。
是否存储:要存储。
- 手机价格:
是否分词:要分词,lucene对数字型的值只要有搜索需求的都要分词和索
引,因为lucene对数字型的内容要特殊分词处理,本例子可能要根据价格范
围搜索,需要分词和索引。
是否索引:要索引
是否存储:要存储
- 手机图片地址:
是否分词:不分词
是否索引:不索引
是否存储:要存储
- 图片描述
是否分词:要分词
是否索引:要索引
是否存储:因为图书描述内容量大,不在查询结果页面直接显示,不存储。
不存储是来不在lucene的索引文件中记录,节省lucene的索引文件空间,
如果要在详情页面显示描述,思路:
从lucene中取出图书的id,根据图书的id查询关系数据库中book表
得到描述信息。