Sitecore 7 Linq Taxonomy风格查询

本文关键字:风格 查询 Taxonomy Linq Sitecore | 更新日期: 2023-09-27 18:09:12

更新

事实证明,我的配置不起作用,我恢复使用sitecore的contentsearch定义中的defaultindexconfiguration。

一旦我做到了,一切都神奇地发挥了作用。我只是在查询中添加了模板条件,一切都很好。


两天来我一直在想这个问题,但我哪儿也找不到。

场景:

我有一些文章用树/多重列表中的项目进行了标记。

我定义了一个索引,用于在整个网站上查找特定的模板类型,然后存储一些值(名称、描述、路径、标记(。此索引使用小型indexConfiguration。我避免使用默认的索引配置,因为这会使我的索引膨胀太多,我只需要一组薄薄的结果。

<myConfiguration type="Sitecore.ContentSearch.LuceneProvider.LuceneSearchConfiguration, Sitecore.ContentSearch.LuceneProvider">
    <defaultIndexConfiguration type="Sitecore.ContentSearch.LuceneProvider.LuceneIndexConfiguration, Sitecore.ContentSearch.LuceneProvider">
        <indexAllFields>true</indexAllFields>
        <Analyzer ref="contentSearch/configuration/defaultIndexConfiguration/analyzer" />
        <fieldMap type="Sitecore.ContentSearch.FieldMap, Sitecore.ContentSearch">
            <fieldNames hint="raw:AddFieldByFieldName">
                <field fieldName="Article Tags" storageType="yes" indexType="tokenized" vectorType="no" boost="1f" type="System.String" settingType="Sitecore.ContentSearch.LuceneProvider.LuceneSearchFieldConfiguration, Sitecore.ContentSearch.LuceneProvider" />
                <field fieldName="Teaser Title" storageType="yes" indexType="tokenized" vectorType="no" boost="1f" type="System.String" settingType="Sitecore.ContentSearch.LuceneProvider.LuceneSearchFieldConfiguration, Sitecore.ContentSearch.LuceneProvider" />
                <field fieldName="Teaser Description" storageType="yes" indexType="tokenized" vectorType="no" boost="1f" type="System.String" settingType="Sitecore.ContentSearch.LuceneProvider.LuceneSearchFieldConfiguration, Sitecore.ContentSearch.LuceneProvider" />
                <field fieldName="Article Date" storageType="yes" indexType="tokenized" vectorType="no" boost="1f" type="System.DateTime" settingType="Sitecore.ContentSearch.LuceneProvider.LuceneSearchFieldConfiguration, Sitecore.ContentSearch.LuceneProvider" />
                <field fieldName="Views" storageType="yes" indexType="tokenized" vectorType="no" boost="1f" type="System.Int32" settingType="Sitecore.ContentSearch.LuceneProvider.LuceneSearchFieldConfiguration, Sitecore.ContentSearch.LuceneProvider" />
                <field fieldName="__Workflow state" storageType="yes" indexType="untokenized" vectorType="no" boost="1f" type="System.String" settingType="Sitecore.ContentSearch.LuceneProvider.LuceneSearchFieldConfiguration, Sitecore.ContentSearch.LuceneProvider" />
            </fieldNames>
        </fieldMap>
        <fields hint="raw:AddComputedIndexField">
            <field fieldName="isfinal" storageType="yes" indexType="tokenized">Core.Search.ComputedWorkflowState, Core</field>
            <field fieldName="Teaser Image" storageType="yes" indexType="tokenized">Core.Search.ComputedTeaserImage, Core</field>
            <field fieldName="Article Url" storageType="yes" indexType="tokenized">Core.Search.ComputeUrl, Core</field>
        </fields>
        <include hint="list:IncludeTemplate">
            <articlePage>{28432890-0F71-4E2F-8577-7848F90FCBCC}</articlePage>
        </include>
    </defaultIndexConfiguration>
</myConfiguration>

通过使用Luke查看索引,我可以看到标签的索引是正确的。每个标记在文档中都有自己的行。

我创建了一个扩展SearchResultItem的类(ArticleItem(,然后用装饰实现了适当的属性。

[IndexField("article_tags")]
public List<ID> tags{get;set;}

现在,我尝试使用sitecore linq和谓词生成器进行查询。

using (var context = ContentSearchManager.GetIndex(indexName).CreateSearchContext())
{
    IQueryable<ArticleItem> query = context.GetQueryable<ArticleItem>();
    var predicate = PredicateBuilder.True<ArticleItem>();
    foreach (var id in tags)
    {
        var tempTerm = id;
        predicate = predicate.Or(p => p.Tags.Contains(id));
    }
    var results = context.GetQueryable<ArticleItem>().Where(predicate).GetResults();
    if (results != null)
    {
        if (results.Hits.Any())
        {
            return results.Hits.Select(x => x.Document);
        }
    }
}

当我调用上下文时。GetQueryable((本身,然后迭代结果,标记都存在,并且肯定有匹配项。

我有什么想错了吗?

*附加信息

使用附加查询测试搜索:p.Tags.Contains("3"(不会返回任何结果(肯定有一个guid包含char3的项。

当通过luke查找时,我对文章标签的术语计数是0。

通过将字段变成一个计算字段,我的搜索结果现在可以工作了(尽管值是作为一个完整的字符串存储的,而不是标记化的(,并且出现了词条计数。

Sitecore 7 Linq Taxonomy风格查询

如果将谓词简化为对其中一个标记的简单检查,会得到任何结果吗?

var results = context.GetQueryable<ArticleItem>().Where(p=>p.Tags.Contains(tags[0])).GetResults();

这将帮助您确定谓词构建是否存在问题。

如果这也不起作用,您是否已检查以确保传入的"tags"集合中的值与存储在对象上的值有效等效?可能是"Contains"检查失败,因为集合中的值与加载到对象上的值不匹配。

另一种调试方法是从可查询对象中删除"Where"子句,并获取整个集合的结果。一旦您选择了所有文档并获得了所有项目的完整列表,您是否可以使用标记集合构建一个Where子句来筛选项目列表?

如果这也不起作用,这可能是在确认"标记"的输入列表或Where子句本身有问题。

我认为有几件事需要检查。你提到你的标签字段正在搜索索引中填充,所以我们知道这不是索引/爬网问题。

首先查看Sitecore搜索日志,以便确定搜索查询的格式。您将搜索字段定义为:

<field fieldName="Article Tags" storageType="yes" indexType="tokenized" vectorType="no" boost="1f" type="System.String" settingType="Sitecore.ContentSearch.LuceneProvider.LuceneSearchFieldConfiguration, Sitecore.ContentSearch.LuceneProvider" />

但是你在你的模型中定义你的领域为:

[IndexField("article_tags")]

这可能只是域名不匹配,因为sitecore正在"articles_taqs"上搜索,但索引将其存储为"文章标签"。当我模拟这一点时,Sitecore正在发送下划线。

另一件需要检查的事情是GUID的格式。正在使用.Contains(ID(搜索不带短划线或大括号的小写GUID。使用LUKE查看事物是如何存储在索引中的,然后将其与Sitecore在Sitecore搜索日志中搜索它的方式进行比较。

将"tags"属性更改为:

[IndexField("article_tags"), TypeConverter(typeof(IndexFieldEnumerableConverter))]
public virtual System.Collections.Generic.IEnumerable<ID> tags{ get; set; }

我认为这可以解决你的问题。