Sitecore搜索中的Dropink和TreeList值 [英] droplink and treelist values in sitecore search

查看:25
本文介绍了Sitecore搜索中的Dropink和TreeList值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何在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的计算字段
完成此操作后,您应该会发现索引将包含与您的ID字段相关联的文本。因此,您应该能够将其与基于文本的查询相匹配。

--编辑后添加--

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

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆