Sitecore 7 ContentSearch API在过滤器中具有数字POCO属性/其中条件不起作用

时间:2014-01-13 05:13:07

标签: sitecore lucene.net sitecore7

我现在在这个问题上花了几个小时,但到目前为止没有运气。所以请向社区寻求帮助。

我有一个名为Product的数据模板,其中包含一个名为ProPrice的字段,基于此模板的一些内容我已使用配置<indexAllFields>true</indexAllFields>启用了所有字段的索引。当我重建索引时,我会看到索引字段(proprice)以及正确存储在Lucene中的术语(使用Luke验证)。

现在我使用Sitecore 7 ContentSearch API从Lucene索引中获取内容。为此,我创建了一个名为Product的POCO实体,该实体继承自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]。如果我直接对Luke中的索引执行此查询,它将返回数据。我尝试使用其他条件,例如p.Price >= 1.0,但都没有效果。有趣的是 - 当我删除条件并获取所有记录时,Product实体中的Price属性将填充正确的double值(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

2 个答案:

答案 0 :(得分:3)

您需要将索引字段类型映射到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>

答案 1 :(得分:2)

我认为你需要在字段中添加类型转换器属性。我在我的项目中完成了这项工作,对数字的过滤工作正常:

所以将属性更改为:

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

你应该能够过滤。