我有一个非常奇怪的问题,我无法理解。也许有人可以指出我做错了什么。
基本上,我只是想使用 Linq to Sitecore 搜索项目。
所以,我的课看起来像(我也在用玻璃)
[SitecoreType(TemplateId = "{TEMPLATE_GIUD}")]
public class MyMappedClass : SharedFieldClass
{
[SitecoreField(FieldName = "mylist")]
public virtual IEnumerable<SharedFieldClass> MyMultilistField { get; set; }
[SitecoreField(FieldName = "field1")]
[IndexField("field1")]
public virtual MyKeyValue field1 { get; set; }
}
[SitecoreType]
public class MyKeyValue
{
public virtual Sitecore.Data.ID Id {get;set;}
public virtual string MyValue{get;set;}
}
因此,当我执行以下查询时,它会按预期工作。
var results = context.GetQueryable<SearchResultItem>()
.Where(c => ((string)c["field1"]) == "{GUID}").GetResults();
但是,当我执行以下操作时,它返回 0 结果。
List<MyMappedClass> results = context.GetQueryable<MyMappedClass>()
.Where(c => c.field1.MyValue == "{GUID}").ToList();
我已阅读此链接。我已经按照此处描述的第二个流程让 Glass 与 Sitecore7 Search 一起工作(“SharedFieldClass”包含所有基本索引字段)。
这是一个非常明显的场景,我敢肯定很多人已经这样做了,我在这里做了一些愚蠢的事情。
提前致谢。
/## 编辑 ##/
好的,所以我对此做了更多的挖掘。不确定这是否是 ContentSearch/Luncene.NET API 中的错误,或者我遗漏了一些东西,但似乎这里发布的内容可能不是 TRUE,如果您有一个复杂的字段类型(您会这样做),您无法使用映射类进行查询反对 Lucene。(不确定 Solr 是否也是这种情况)。如果您正在搜索字符串和 int 等简单类型,那么它就像一个魅力。
所以这是我的发现:
- 在为 contentsearch 启用 DEBUG 和 LOG 后,我发现如果我像这样查询
context.GetQueryable<MyMappedClass>().Where(c => c.field1.MyValue == "{GUID}")
它会被翻译成什么,DEBUG Executing lucene query: field1.value:7e9ed2ae07194d83872f9836715eca8e
并且在名为“field1.value”的索引中没有这样的东西,查询不会返回任何内容。索引的名称实际上只是“field1”。这是一个错误吗? - 但是,这样的查询
context.GetQueryable<SearchResultItem>() .Where(c => ((string)c["field1"]) == "{GUID}").GetResults();
有效,因为它被翻译成"DEBUG Executing lucene query: +field1:7e9ed2ae07194d83872f9836715eca8e"
. 我也确实在我的映射类中编写了一个方法,如下所示:
public string this[string key] { get { return key.ToLowerInvariant(); } set { } }
这使我可以使用 MyMappedClass 编写以下查询。
results2 = context.GetQueryable<MyMappedClass>().Where(c => c["filed1"]== "{GUID}").ToList();
这返回了预期的结果。但是未填充 MyMappedClass 中字段的值(实际上它们都是空的,除了填充文档中填充的核心/共享值,如 templateid、url 等)。所以结果列表几乎没有用。我可以对所有这些进行循环并手动获取填充的值,因为我有 itemid。但是想象一下大型结果集的成本。
最后我这样做了:
<fieldType fieldTypeName="droplink" storageType="YES" indexType="TOKENIZED" vectorType="NO" boost="1f" type="System.String" settingType="Sitecore.ContentSearch.LuceneProvider.LuceneSearchFieldConfiguration, Sitecore.ContentSearch.LuceneProvider" />
因此,在使用“IndexViewer2.0”的 lucene 查询中返回了填充的“field1”和 itemid。但是这对于 MyMappedClass 也失败了,因为文档中“field1”的值是 System.string .. 但它在MyMappedClass中被映射为“MyKeyValue”所以它抛出以下异常
Exception: System.InvalidCastException
Message: Invalid cast from 'System.String' to 'MyLib.MyKeyValue'.
所以,最大的问题是: 如何使用酷炫的 ContentSearch API 使用他/她的映射类进行查询?