我现在在这个问题上花了几个小时,但到目前为止没有运气。所以请向社区寻求帮助。
我有一个名为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
答案 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; }
你应该能够过滤。