Sitecore搜索中的Dropink和TreeList值 [英] droplink and treelist values in sitecore search
问题描述
如何在Sitecore搜索中获取Dropink和TreeList值。 下面是我的代码和配置文件。但是当我基于Dropink和TreeList值进行搜索时,它不会出现在搜索结果中。
var fquery=new FullTextQuery(搜索); SearchHits searchHits=sc.Search(fquery,int.MaxValue); return searchHits.FetchResults(0,int.MaxValue).Select(r=>r.GetObject()).ToList();配置文件条目。
我不确定是否必须解析它们或其他什么。期待帮助。
推荐答案
您没有说您使用的是哪个版本的Sitecore,而是以使用v6.6的人的身份发言:
基于ID的字段(如TreeList)将GUID存储在Sitecore数据库中。在索引时,Sitecore会将这些数据解析为ShortID格式,并强制其小写。因此,Lucene索引项实际上包含一个没有大括号或连字符的小写GUID。很可能您的基于文本的查询不会包含与此匹配的文本。
我倾向于使用基于术语的BooleanQuery对象来匹配基于ID的字段。类似于:
BooleanQuery query = new BooleanQuery();
query.Add(new TermQuery(new Term("myfieldname", ShortID.Encode(myGuidToMatch).ToLowerInvariant())), BooleanClause.Occur.MUST);
请注意,您要查询的字段名称应为小写,因为Sitecore/Lucene通常使用小写。
您可能会发现本文中的代码和UI示例对查看针对基于ID的字段构建查询的示例很有帮助: http://jermdavis.wordpress.com/2014/06/09/faceted-search-in-sitecore-6-6/如果您希望能够从自由文本类型的搜索框匹配这些字段中包含的值,则必须在索引这些基于ID的字段的值之前对其进行预处理。
Sitecore和Lucene允许在索引中使用"计算字段"的概念-基本上,您可以将索引过程配置为运行您自己的代码位,以便在索引时处理数据,并根据代码结果创建新的Lucene索引字段。
我的这篇博客文章给出了一个计算字段的示例: http://jermdavis.wordpress.com/2014/05/05/using-dms-profile-cards-as-search-metadata/ 该示例不是在做您想要做的事情,但是它确实谈到了您可以如何配置这些自定义字段中的一个。
您可能希望您的自定义字段代码:
- 获取基于ID字段的原始值
- 加载此ID指向的项目
- 处理该项目以将其转换为要编制索引的文本模式
- 返回此文本,保存到Lucene的计算字段
--编辑后添加--
有关创建计算索引项的更多详细信息:
Sitecore 6.6不直接支持Lucene索引中的计算字段。要获取它们,您可以使用高级数据库爬行器-它是GitHub:https://github.com/sitecorian/SitecoreSearchContrib上提供的Sitecore SearchContrib项目的一部分 有关于此代码入门的各种博客文章。 [注意:在Sitecore 7.x中,我相信这种行为已经迁移到Sitecore的核心。不过,我想他们把东西的名字都改了。这方面的详细信息可以通过Google获得-例如Upgrading sitecore 6.6 index configuration to sitecore 7 (using ComputedFields)]动态字段将基于ID的内容转换为文本的代码可能如下所示:
public class IndexIDField : BaseDynamicField
{
public override string ResolveValue(Sitecore.Data.Items.Item item)
{
Field fld = item.Fields["FieldYouAreInterestedIn"];
if (fld != null && !string.IsNullOrWhiteSpace(fld.Value))
{
string[] ids = fld.Value.Split('|');
StringBuilder text = new StringBuilder();
foreach (string id in ids)
{
Item relatedItem = item.Database.GetItem(id);
if (relatedItem != null)
{
text.Append(relatedItem.DisplayName);
text.Append(" ");
}
}
return text.ToString();
}
return null;
}
}
这是从传入的上下文项中提取适当的字段。如果它存在并且不为空,则用"|"将其拆分,以获得此字段中存储的所有ID的列表。然后,对于每一个,它都会尝试加载它。注使用由输入项指定的适当数据库-Sitecore.Context.Database此时将指向Core,您将在那里找不到您的项。最后,如果从ID中检索到有效项,则将其显示名称附加到要索引的文本。您可以使用显示名称以外的其他字段-具体取决于解决方案中的意义。
将该代码添加到解决方案后,您需要确保在索引构建时调用该代码。高级数据库爬网程序的默认配置包括动态字段的配置元素。(同样,SC7.x也会有类似的东西,但我不知道头顶上的名字)您需要将您的类型添加到动态字段的配置中。从default config中剪除所有无关位:
<configuration xmlns:x="http://www.sitecore.net/xmlconfig/">
<sitecore>
<!-- snip -->
<search>
<!-- snip -->
<crawlers>
<demo type="scSearchContrib.Crawler.Crawlers.AdvancedDatabaseCrawler,scSearchContrib.Crawler">
<!-- snip -->
<dynamicFields hint="raw:AddDynamicFields">
<!-- snip -->
<dynamicField type="YourNamespace.IndexIDField,YourDLL" name="_myfieldname" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
</dynamicFields>
<!-- snip -->
</demo>
</crawlers>
</search>
</sitecore>
</configuration>
这将设置一个名为"_myfieldname"的新字段,其中包含用于索引文本的合理选项。
重新构建搜索索引,您应该会发现自由文本查询将与适当的项目匹配。在SC6.6的一个实例上测试这个基本设置,我碰巧有一些随处可见的测试数据,我得到了一些命中结果。如果我在计算列中搜索"Blue",则只得到名称中带有"Blue"的元数据项标记的行:这篇关于Sitecore搜索中的Dropink和TreeList值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!