Lucene NumericRangeQuery和MemoryIndex

时间:2014-11-17 05:00:10

标签: java lucene

我是Lucene的新手,正在尝试一些微不足道的用例。我无法获得NumericRange依赖的单元测试,该测试断言成功的范围匹配通过。我做错了什么。

public class MemoryIndexTest {

private static final String DATE_FIELD = "date";
MemoryIndex index = new MemoryIndex();


@Before
public void init() {
    index.addField(DATE_FIELD, index.keywordTokenStream(Arrays.asList(20141116)));
}

@Test
public void testRange(){
    Query query = NumericRangeQuery.newIntRange(DATE_FIELD, 20141115, 20141118, true, true);
    assertTrue(index.search(query) > 0);

}

}

1 个答案:

答案 0 :(得分:0)

好的,我想出了这个。来自NumericRangeQuery

的文档
  

匹配指定范围内的数值的查询。要使用它,必须首先使用 IntField,FloatField,LongField或DoubleField(expert:NumericTokenStream)索引数值。如果您的术语是文本的,则应使用TermRangeQuery。 NumericRangeFilter是此查询的等效过滤器。

这里的关键是MemoryIndex必须使用NumericTokenStream。因此修改我的测试以将字段索引为

public class MemoryIndexTest {

    private static final String DATE_FIELD = "date";
    MemoryIndex index = new MemoryIndex();

    NumericTokenStream numericTokenStream = new NumericTokenStream();

    @Before
    public void init() {
        index.addField(DATE_FIELD, numericTokenStream.setIntValue(20141116));
    }

    @Test
    public void testRange() {
        Query query = NumericRangeQuery.newIntRange(DATE_FIELD, 20141115, 20141118, true, true);
        assertTrue(index.search(query) > 0);

    }
}

解决了这个问题。