Sitecore 7 ContentSearch API с числовыми свойствами POCO в фильтре/где условие не работает

Сейчас я трачу несколько часов на эту проблему, но пока не повезло. Так что обращайтесь за помощью к сообществу.

У меня есть шаблон данных под названием Product с полем под названием ProPrice, и некоторый контент, основанный на этом шаблоне, я включил индексацию всех полей, используя конфигурацию <indexAllFields>true</indexAllFields>. Когда я перестраиваю индекс, я вижу поле индекса (proprice) вместе с терминами, правильно сохраненными в Lucene (проверено с помощью Luke).

Теперь я использую Sitecore 7 ContentSearch API для извлечения контента из индекса Lucene. И для этого я создал объект POCO с именем Product, который наследуется от SearchResultItem, а также добавил свойство для цены, как показано ниже:

[IndexField("proprice")]
public double Price { get; set; }

Однако следующий запрос LINQ не возвращает никаких данных:

var products = context.GetQueryable<Product>().Where(p => p.Price == 4.0).ToList();

Когда я смотрю журнал поиска Sitecore, запрос Lucene, на который это переведено, был - proprice:[4 TO 4]. И если я выполню этот запрос непосредственно по индексу в Люке, он вернет данные. Я пробовал это с другими условиями, такими как p.Price >= 1.0, но ничего не сработало. Что интересно, когда я удаляю условие и получаю все записи, свойство Price в сущности Product заполняется правильным двойным значением (4.0).

Но если я немного изменю запрос следующим образом, он вернет правильные данные:

var products = context.GetQueryable<Product>().Where(p => p["proprice"] == "4").ToList();

Таким образом, похоже, что когда условие против числовых значений, оно не работает. И, к сожалению, мне нужно фильтровать на основе числового диапазона, и, следовательно, описанный выше подход мне не подойдет. Я могу отказаться от ContentSearch API и напрямую выполнить запрос Lucene с помощью провайдера Lucene, но в будущем я не смогу переключиться на другой провайдер поиска, например Solr. Или, альтернативно, я могу получить все данные, а затем отфильтровать свой код - хотя я бы этого не предпочел.

Я был бы признателен за любую помощь в решении этого. PS: Еще несколько моментов: 1) Я попробовал тип поля «ProPrice» в шаблоне данных как однострочный текст, целое, двойное — ничего не сработало 2) Я использую анализатор Lucene по умолчанию — Lucene.Net.Analysis.Standard.StandardAnalyzer


person Jinto    schedule 13.01.2014    source источник


Ответы (2)


Я думаю, вам нужно добавить атрибут преобразователя типа в поле. Я сделал это в своих проектах, и фильтрация по числам работала нормально:

Поэтому измените свойство на:

[IndexField("proprice")]
[TypeConverter(typeof(IndexFieldNumberValueConverter))]
public double Price { get; set; }

И надо уметь фильтровать.

person Richard Seal    schedule 13.01.2014
comment
Спасибо Ричард!! Это сработало вместе с предложением Ахмеда выше. - person Jinto; 14.01.2014
comment
Добавить Sitecore.ContentSearch.LuceneProvider.dll - person Dan; 19.05.2015

Вам необходимо сопоставить тип поля индекса с system.double следующим образом (уведомление type="System.Double"):

<field fieldName="proprice"       storageType="YES" indexType="TOKENIZED"    vectorType="NO" boost="1f" type="System.Double" settingType="Sitecore.ContentSearch.LuceneProvider.LuceneSearchFieldConfiguration, Sitecore.ContentSearch.LuceneProvider">
                <analyzer type="[YOUR ANALYZER]" />
</field>
person Ahmed Okour    schedule 13.01.2014
comment
Спасибо Ахмед!! Это сработало вместе с предложением Ричарда ниже. Я не пробовал оба варианта вместе и, следовательно, не работал. - person Jinto; 14.01.2014
comment
Это сработало для меня без добавления атрибута [TypeConverter], так как sitecore поддерживает целые, строковые, двойные и т. д. типы из коробки. - person Ahmed Okour; 15.01.2014
comment
Я также смог заставить это работать (в моем случае я использовал System.Int32) без необходимости использования TypeConverter. Я также перестроил свой индекс, но не знаю, было ли это необходимо. - person Dan Sinclair; 23.03.2014