在Lucene 6中, LongField 和 IntField 已重命名为 LegacyLongField 和 LegacyIntField ,不推荐使用JavaDoc建议使用 LongPoint 和 IntPoint 类。
但是,似乎无法构建这些XPoint字段的术语词汇表(=枚举所有不同的值)。 Lucene mailing list entry确认了
PointFields与传统的倒置字段不同,因此它们也不会出现在字段()中。你不能从他们那里得到一个术语词典。
作为第三种选择,可以添加一个类 NumericDocValuesField 的字段,据我所知,它也没有提供构建术语词汇表的方法。
考虑到构建术语词汇表的要求,Lucene 6中是否有一种不推荐的索引数字字段的方法?
答案 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会很好...