sitecore搜索中的droplink和treelist值

时间:2014-06-18 13:25:34

标签: sitecore

如何在sitecore搜索中获取droplink和treelist值。 下面是我的代码和配置文件。但是当我根据droplink和treelist值进行搜索时,它不会出现在搜索结果中。

var fquery = new FullTextQuery(search);               SearchHits searchHits = sc.Search(fquery,int.MaxValue);               return searchHits.FetchResults(0,int.MaxValue).Select(r => r.GetObject())。ToList();

配置文件条目。

我不确定我是否必须解析它们或其他东西。期待着寻求帮助。

1 个答案:

答案 0 :(得分:4)

你没有说你正在使用哪个版本的Sitecore,而是说作为使用v6.6的人:

基于ID的字段,如TreeList存储Sitecore数据库中的GUID。在索引时,Sitecore将这些解析为ShortID格式并强制它为小写。因此,Lucene索引条目实际上包含一个没有花括号或连字符的小写GUID。

有可能,您的基于文本的查询不会包含与此匹配的文本。

我倾向于使用基于Term的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
  • 中的计算字段中

完成后,您应该会发现您的索引将包含与您的ID字段关联的文本。因此,您应该能够将其与基于文本的查询进行匹配。

- 已编辑添加 -

有关创建计算索引项的更多详细信息:

Sitecore 6.6不直接支持Lucene索引中的计算字段。要获得它们,您可以使用高级数据库爬虫 - 这是GitHub上可用的Sitecore SearchContrib项目的一部分:https://github.com/sitecorian/SitecoreSearchContrib 有关此代码入门的各种博客文章。

[注意:在Sitecore 7.x中,我相信这种行为已经迁移到Sitecore的核心。但是我觉得他们改变了东西的名字。有关详细信息,请访问谷歌 - 例如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”的元数据项的行:

What I see in Index Viewer