在 lucene 中为布尔值编制索引的最佳选择是什么?

2022-09-02 22:11:08

在lucene(不需要存储)中索引布尔值(真/假)我想获得更多的磁盘空间使用率和更高的搜索性能

doc.add(new Field("boolean","true",Field.Store.NO,Field.Index.NOT_ANALYZED_NO_NORMS));
//or
doc.add(new Field("boolean","1",Field.Store.NO,Field.Index.NOT_ANALYZED_NO_NORMS));
//or
doc.add(new NumericField("boolean",Integer.MAX_VALUE,Field.Store.NO,true).setIntValue(1));

我应该选择哪一个?还是其他更好的方法?

多谢


答案 1

一个有趣的问题!

  • 我不认为第三个选项(NumericField)是布尔字段的好选择。我想不出任何用例。
  • Lucene 搜索索引(将存储的数据保留在一侧,您无论如何都不会使用这些数据)存储为倒排索引
  • 保持第一个和第二个选项(理论上)相同

如果我面对这个问题,我想我会选择选项一(“真”和“假”术语),如果它影响了最终决定。

你的选择看起来不错,我想。NOT_ANALYZED_NO_NORMS


答案 2

Lucene 跳过了一组精心设计的箍,使 NumericField 可通过 NumericRangeQuery 进行搜索,因此,一定要避免在所有值不表示数量的情况下进行搜索。例如,即使您为整数编制索引,但仅将其作为唯一 ID,您仍然需要使用纯字符串字段。使用“true”/“false”是索引布尔值的最自然方法,而使用“1”/“0”通过避免大小写不匹配或拼写错误的可能性,只能带来轻微的优势。我会说这个优势不值多少钱,去真/假。


推荐