Lucene 6 - 推荐使用术语词汇表存储数字字段的方法

时间:2017-02-27 09:48:20

标签: java solr lucene

在Lucene 6中, LongField IntField 已重命名为 LegacyLongField LegacyIntField ,不推荐使用JavaDoc建议使用 LongPoint IntPoint 类。

但是,似乎无法构建这些XPoint字段的术语词汇表(=枚举所有不同的值)。 Lucene mailing list entry确认了

  

PointFields与传统的倒置字段不同,因此它们也不会出现在字段()中。你不能从他们那里得到一个术语词典。

作为第三种选择,可以添加一个类 NumericDocValuesField 的字段,据我所知,它也没有提供构建术语词汇表的方法。

考虑到构建术语词汇表的要求,Lucene 6中是否有一种不推荐的索引数字字段的方法?

2 个答案:

答案 0 :(得分:2)

在我的情况下,我只是将字段重复一次作为LongPoint,一次作为存储的非索引字段重复两个具有相同名称的字段。

在我的情况下,它大致是

doc.add(new NumericDocValuesField("ts", timestamp.toEpochMilli()));
doc.add(new LongPoint("ts", timestamp.toEpochMilli()));
doc.add(new StoredField("ts", timestamp.toEpochMilli()));

这有点难看,但想到它是为存储字段添加索引。 这些字段类型可以使用相同的名称而不会产生干扰。

基于文档年龄的评分的DocValues和范围查询的LongPoint。

答案 1 :(得分:0)

我遇到了同样的问题,最终找到了我的用例的解决方案-我正在索引而不是存储LongPoint:

doc.add(new LongPoint("time",timeMsec));

我的第一个想法是创建这样的查询:

Query query = parser.parse("time:[10003 TO 10003]");
System.err.println( "Searching for: " + query + " (" + query.getClass() + ")" );

但这不会返回任何文档,至少不会返回StandardAnalyzer和默认的QueryParser:-(

打印输出为:“搜索时间:[10003至10003](类org.apache.lucene.search.TermRangeQuery)”

有效的方法是使用LoingPoint.newRangeQuery()创建查询:

Query query = LongPoint.newRangeQuery("time", 10003, 10003);
System.err.println( "Searching for: " + query + " (" + query.getClass() + ")" );

打印:“搜索:时间:[10003 TO 10003](类org.apache.lucene.document.LongPoint $ 1)”。因此,标准QueryParser将创建TermRangeQuery而不是LoingPoint范围查询。我是Lucene的新手,所以这里不了解详细信息,但是QuerParser无缝支持LongPoint会很好...