常见的Field
# 35.常见的Field
除了TextField,还有不少其他Field对象,本文就来介绍下它们
# 前言
首先,不是所有内容都适合用TextField
(其本质是String)保存:
- 例如文档大小是数字类型,如果要做数值范围搜索的话(例如找大于多少kb的原始文档),用文本类型存储就不合适
- 还有Path路径,只是存储,如果也分词的话,没必要,而
TextField
默认是分词的
# Field域的属性
此时我们就得谈谈Field域的属性:
- 是否分析:是否对域的内容进行分词处理。前提是我们要对域的内容进行查询。
- 是否索引:将 Field 分析后的词,或整个 Field 值进行索引,只有索引 才可被搜索到。比如:商品名称、商品简介分析后进行索引,订单号、身份证号不用分析但也要索引,这些将来都要作为查询条件。
- 是否存储:将Field值存储在文档中,存储在文档中的Field才可以从Document中获取,比如商品名称、订单号,凡是将来要从Document中获取的Field都要存储。
注意存储不存储,是不影响查询的,我们查询的是索引,而不是内容。但如果要在查询后展示内容,就必须存储
# 常见的Field的子类
StringField(FieldName, FieldValue, Store.YES)
,字符串类型,这个Field用来构建一个字符串Field,但是不会进行分析(分词),会将整个串存储在索引中,比如(订单号,身份证号等)。是否存储在文档中用Store.YES或Store.NO决定LongPoint(String name, long... point)
,Lone类型,还有IntPoint等类型存储数值类型的数据,让数值类型可以进行索引。但是不能存储数据,如果想存储数据还需要使StoredField。StoredField(FieldName, FieldValue)
,重载方法,支持多种数据类型,这个Field用来构建不同类型Field不分析,不索引,但要Field存储在文档中TextField(FieldName, FieldValue, Store.NO)
或TextField(FieldName, reader)
,如果是一个Reader, lucene猜测内容比较多,会采用Unstored的策略
关于这几个Filed类型的属性,这里列一个表格:
Field类 | 数据类型 | Analyzed是否分析 | Indexed是否索引 | Stored是否存储 |
---|---|---|---|---|
StringField | 字符串 | N | Y | Y或N |
LongPoint | Long型 | Y | Y | N |
StoredField | 支持多种数据类型 | N | N | Y |
TextField | 字符串或流 | Y | Y | Y或N |
比如订单号,身份证号等类型,可以用StringField存储,因为分词了没啥用;但是我们需要索引,将来可以用整个订单后或者身份证号来搜索。至于是否存储则按需使用。
比如文件路径可以用StoredField来存储,因为我们不需要分析和索引,只需存储就行。
而最后的TextField是用的比较多的,一般内容都是用这个。
# 重新创建索引库
我们重新创建一个类LuceneSecond.java,并创建方法createIndex,其代码和之前的代码几乎一样,除了以下几点:
使用StoredField存储fieldPath,并创建fieldSize
和fieldSizeStore
的Field对象
// 4. 创建Field
// 参数1:域的名称, 参数2:域的内容, 参数3:是否存储
Field fieldName = new TextField("name", fileName, Field.Store.YES);
Field fieldPath = new StoredField("path", filePath);
Field fieldContent = new TextField("content", fileContent, Field.Store.YES);
// Field fieldSize = new TextField("size", String.valueOf(fileSize), Field.Store.YES);
Field fieldSize = new LongPoint("size", fileSize);
Field fieldSizeStore = new StoredField("size", fileSize);
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
添加Field的时候,也加上新创建的2个Field对象:
// 4. 将field添加到document对象中。
Document document = new Document();
document.add(fieldName);
document.add(fieldPath);
document.add(fieldContent);
document.add(fieldSize);
document.add(fieldSizeStore);
1
2
3
4
5
6
7
2
3
4
5
6
7
然后我们删除之前的索引库,并重新创建。此时用luke查看,就会发现path和size是没有分词(Term的)
但是path和size是存储了的,我们可以看documents选项卡:
# 源码
已将源码上传到Gitee (opens new window)或GitHub (opens new window)上。并且创建了分支demo3,读者可以通过切换分支来查看本文的示例代码
上次更新: 2024/1/23 16:20:41