搜索Sitecore 8和Solr中的可枚举范围

时间:2016-02-22 11:31:02

标签: c# linq solr sitecore

我需要在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 *])

这绝对不是我想要的

1 个答案:

答案 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如何处理此问题。