常见的 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/10/3 10:01:52