2014-11-17 2 views
0

Я новичок в Lucene и экспериментирую с некоторыми тривиальными прецедентами. Я не могу получить независимый от NumerRange Unit тест, который подтверждает успешное совпадение диапазона. Что я делаю не так.Lucene NumericRangeQuery и MemoryIndex

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); 

} 

} 

ответ

0

Хорошо, я понял это. По документации NumericRangeQuery

Запрос, который соответствует числовым значениям в пределах указанного диапазона. Чтобы использовать это, вы должны сначала проиндексировать числовые значения, используя IntField, FloatField, LongField или DoubleField (эксперт: 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); 

    } 
} 

исправлено решение проблемы.

Смежные вопросы