在 Sitecore 8 和 Solr 中对枚举对象进行范围搜索

本文关键字:对象 范围 搜索 枚举 Sitecore Solr | 更新日期: 2023-09-27 18:35:49

我需要在 Sitecore 8 中的个人资料卡上进行复杂的范围搜索。到目前为止,我取得了什么成就:

所有配置文件卡在 Solr 中都作为字符串列表进行索引,其中列表中的字符串是平面路径,如下所示

"个人资料卡名称/个人资料名称/值"

这是我想到的最佳选择。当然,我想将值存储为整数,但不知道如何使用像配置文件卡这样的结构来做到这一点。

因此,我可以在 Solr 中进行直接查询,返回我期望的内容,例如

q=profilecard_sm:["Card1/Influence/2" TO "Card1/Influence/5"]&rows=10

但我不确定如何通过 Sitecore 中的 LINQ 执行此操作。

更新:

尝试了以下代码:

                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 *])

这绝对不是我要找的

在 Sitecore 8 和 Solr 中对枚举对象进行范围搜索

但它正在被序列化为

(profilecard_sm:[* TO "Card1/Influence/5"] AND profilecard_sm:["Card1/Influence/1" TO *])

我遇到了同样的问题(尽管与 Lucene 和 int 字段),您可以在此处阅读。

我认为您只需要使用Sitecore.ContentSearch.Linq.dll Sitecore.ContentSearch.Linq.MethodExtensions.Between<T>(this T value, T from, T to, Inclusion inclusion)的扩展方法。

像这样:

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 如何处理这个问题。