我需要在Sitecore 8中对配置文件卡进行复杂范围搜索。 到目前为止我取得的成就:
所有个人资料卡都在Solr中作为字符串列表编制索引,其中列表中的字符串是平坦路径,如
"个人资料卡名称/个人资料名称/值"
这是我脑海中最好的选择。当然,我想将值存储为整数,但不知道如何使用像profile卡这样的结构来实现它。
所以,我可以在Solr中进行直接查询,返回我期望的内容,例如
q=profilecard_sm:["Card1/Influence/2" TO "Card1/Influence/5"]&rows=10
但我不确定如何通过Sitecore中的LINQ来做到这一点。
UPD:
试过这段代码:
var results = context.GetQueryable<SearchResultItemWithProfileCard>()
.Where(i => i["profilecard_sm"].CompareTo("Card1/Influence/5") <= 0)
&& i["profilecard_sm"].CompareTo("Card1/Influence/1") >= 0))
;
但它被序列化为
(profilecard_sm:[* TO "Card1/Influence/5"] AND profilecard_sm:["Card1/Influence/1" TO *])
这绝对不是我想要的
答案 0 :(得分:2)
但它被序列化为
(profilecard_sm:[* TO "Card1/Influence/5"] AND profilecard_sm:["Card1/Influence/1" TO *])
我有同样的问题(尽管使用Lucene和int
字段),您可以阅读here。
我认为您只需要使用Sitecore.ContentSearch.Linq.MethodExtensions.Between<T>(this T value, T from, T to, Inclusion inclusion)
中的扩展方法Sitecore.ContentSearch.Linq.dll
。
这样的事情:
using Sitecore.ContentSearch.Linq;
var results = context.GetQueryable<SearchResultItem>()
.Where(i => i["profilecard_sm"].Between("Card1/Influence/1", "Card1/Influence/5", Inclusion.Both));
字符串比较可能很棘手。请考虑以下排序:
Card1/Influence/1
Card1/Influence/10
Card1/Influence/11
Card1/Influence/2
Card1/Influence/3
您的搜索结果可能会像上面那样排序,但我并非100%确定Solr如何处理此问题。