lucene new Filed()字段属性说明

本文详细介绍了Lucene中Field的配置选项,包括Index、Store、TermVector等属性的作用及使用场景,帮助理解如何针对不同需求合理配置Field。

1.如果要对某Field进行查找,那么一定要把Field.Index设置为ANALYZEDANALYZED_NO_NORMSANALYZED会对Field的内容进行分词;而NOT_ANALYZED不会,只有全词匹配,该Field才会被选中。 

2.如果Field.Store是No,那么就无法在搜索结果中从索引数据直接提取该域的值,取得值为NULL。 如果需要提取该字段的值,需设置为YES

补充: 

       Field.Store.YES:存储字段值(未分词前的字段值),可以取得该字段的存储的值
       Field.Store.NO:不存储,存储与索引没有关系,那么查询出来的结果会是NULL
       Field.Store.COMPRESS:压缩存储,用于长文本或二进制,但性能受损 

       Field.Index.ANALYZED:分词建索引 ,分词匹配
       Field.Index.ANALYZED_NO_NORMS:分词建索引,但是Field的值不像通常那样被保存,而是只取一个byte,这样节约存储空间 
       Field.Index.NOT_ANALYZED:不分词且索引 ,全字匹配
       Field.Index.NOT_ANALYZED_NO_NORMS:不分词建索引,Field的值去一个byte保存 

       TermVector    表示文档的条目(由一个Document和Field定位)和它们在当前文档中所出现的次数 
       Field.TermVector.YES:为每个文档(Document)存储该字段的TermVector 
       Field.TermVector.NO:不存储TermVector 存储空间占用最小,节省内存空间
       Field.TermVector.WITH_POSITIONS:存储位置 
       Field.TermVector.WITH_OFFSETS:存储偏移量 
       Field.TermVector.WITH_POSITIONS_OFFSETS:存储位置和偏移量
Lucene 提供了对二进制字段值的处理能力,允许用户将二进制数据(如字节数组)存储在索引中,并在检索时提取出来。在 Lucene 中,二进制字段值通常通过 `StoredField` 或 `BinaryDocValuesField` 来实现存储和检索。 ### 存储二进制字段值 要存储二进制数据,可以使用 `StoredField` 类,它支持存储任意类型的字段值,包括字符串、数字和二进制数据。对于二进制数据,通常使用字节数组 `byte[]` 作为输入。以下是一个示例代码: ```java import org.apache.lucene.document.Document; import org.apache.lucene.document.StoredField; // 创建文档 Document doc = new Document(); // 假设 binaryData 是一个 byte[] 类型的二进制数据 byte[] binaryData = "example binary data".getBytes(); // 示例数据 StoredField binaryField = new StoredField("binaryField", binaryData); doc.add(binaryField); ``` 通过这种方式添加的字段会在索引中存储完整的二进制数据,并可以在检索时恢复原始字节数组。 ### 检索二进制字段值 在检索阶段,可以通过 `Document` 对象获取存储的二进制字段值。以下是一个示例代码,展示如何从文档中提取二进制数据: ```java import org.apache.lucene.document.Document; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.Term; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.TermQuery; import org.apache.lucene.search.TopDocs; // 假设 searcher 是一个已经初始化的 IndexSearcher 实例 TermQuery query = new TermQuery(new Term("binaryField", "someSearchTerm")); // 示例查询 TopDocs topDocs = searcher.search(query, 1); // 获取匹配的文档 if (topDocs.totalHits.value > 0) { Document retrievedDoc = searcher.doc(topDocs.scoreDocs[0].doc); StoredField field = (StoredField) retrievedDoc.getField("binaryField"); byte[] retrievedData = field.binaryValue().bytes; // 获取二进制数据 // 处理 retrievedData } ``` ### 二进制字段的索引与存储 Lucene 中的二进制字段不会被分析(即不会进行分词处理),因此不能直接用于全文检索。如果需要对二进制字段进行检索,通常需要在索引阶段将其转换为可检索的文本格式(如 Base64 编码),或者通过自定义分析器来处理。[^2] ### 性能考虑 由于 `StoredField` 会将整个字段值存储在索引中,因此对于较大的二进制数据(如图片、文件等),可能会显著增加索引大小并影响性能。如果只需要存储标识符或较小的二进制数据(如哈希值),这种方式是合适的。对于较大的数据,建议将实际数据存储在外部系统(如数据库或文件系统),而仅在 Lucene 中存储引用信息。 ### 使用 `BinaryDocValuesField` 如果需要对二进制字段进行排序或聚合操作,可以使用 `BinaryDocValuesField`。它将二进制数据作为不可变的 DocValues 存储,适用于需要高效访问的场景。以下是使用 `BinaryDocValuesField` 的示例: ```java import org.apache.lucene.document.BinaryDocValuesField; import org.apache.lucene.util.BytesRef; // 创建文档 Document doc = new Document(); // 假设 binaryData 是一个 byte[] 类型的二进制数据 byte[] binaryData = "example binary data".getBytes(); // 示例数据 BinaryDocValuesField binaryDVField = new BinaryDocValuesField("binaryDVField", new BytesRef(binaryData)); doc.add(binaryDVField); ``` 检索时,可以通过 `BinaryDocValues` 来访问该字段的值: ```java import org.apache.lucene.index.LeafReaderContext; import org.apache.lucene.index.BinaryDocValues; LeafReaderContext context = ...; // 获取 LeafReaderContext BinaryDocValues binaryDV = context.reader().getBinaryDocValues("binaryDVField"); if (binaryDV != null) { BytesRef value = binaryDV.get(docID); // 获取指定文档的二进制值 // 处理 value.bytes } ``` ### 总结 Lucene 支持通过 `StoredField` 和 `BinaryDocValuesField` 存储和检索二进制字段值。`StoredField` 适用于通用的二进制数据存储,而 `BinaryDocValuesField` 更适合需要排序或聚合的场景。在处理较大二进制数据时,建议结合外部存储系统以优化性能。[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值