2015-08-19 4 views
1

Я пытаюсь написать запрос lucene для фильтрации некоторых данных в RavenDB. Некоторым из документов в этой конкретной коллекции присваивается порядковый номер, а допустимые диапазоны не являются непрерывными (например, один диапазон может быть от 100-200, а другой от 1000 до 1400). Я хочу запросить RavenDB, используя Raven Studio (v2.5, клиент Silverlight) для извлечения всех документов, имеющих значения за пределами указанных пользователем диапазонов.Подзапрос диапазона Lucene.Net не возвращает ожидаемые результаты (связанный с RavenDB)

Это чрезмерно упрощена структура документа:

{ 
    ExternalId: something/1, 
    SequentialNumber: 12345 
} 

Чтобы проверить, я добавил 3500 документов, все из которых имеют SequentialNumber, который находится внутри одной из двух следующих диапазонов: 123-312 и 9000-18000, за исключением одного, что имеет 100000123. Поле ExternalId является ссылкой на родительский документ, и для этого теста все документы имеют поле something/1. Это запрос Lucene я придумал:

ExternalId: something/1 AND NOT 
(SequentialNumber: [123 TO 321] OR SequentialNumber: [9000 TO 18000]) 

Выполнение запроса в студии RavenDB возвращает все документы, где SequentialNumber находится не в 123-321 диапазоне. Я ожидаю, что он вернет документ, который имеет 100000123 как SequentialNumber. Я пытался помочь Google, но до сих пор я не нашел ничего, чтобы направить меня в правильном направлении.

Что я делаю неправильно?

ответ

1

RavenDB индексирует числа двумя способами: один раз в виде строк (это то, что вы видите здесь) и один раз в числовой форме. Для запросов по диапазону применения:

SequentialNumber_Range: [Ix123 TO Ix321] OR SequentialNumber_Range: [Ix9000 TO Ix18000]) 

Приставка Ix означает, что вы используете int32

+0

Спасибо! Это решило одну проблему. Поскольку поле отмечено в индексе как Long ('Sort (x => x.SequentialNumber, SortOptions.Long)'), мне пришлось изменить Ix на Lx. Теперь, если я запускаю запрос без 'NOT' (' ExternalId: something/1 AND (SequentialNumber_Range: [Lx123 TO Lx321] ИЛИ SequentialNumber_Range: [LX9000 TO LX18000])), я получаю ожидаемые результаты: каждый документ, кроме одного который находится за пределами диапазонов. То, что я, похоже, не могу сделать, - это заставить Lucene выполнять «НЕ», чтобы он возвращал документы за пределы диапазона. Является ли это ограничением Lucene вне сферы действия RavenDb? – enriquein

+0

Nevermind, после нескольких минут возиться в Raven Studio, он, наконец, вернул ожидаемый результат. Не уверен, что там произошло, это, должно быть, был пользовательский интерфейс. Большое спасибо за помощь! – enriquein