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。
通过将字段变成一个计算字段,我的搜索结果现在可以工作了(尽管值是作为一个完整的字符串存储的,而不是标记化的(,并且出现了词条计数。
如果将谓词简化为对其中一个标记的简单检查,会得到任何结果吗?
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; }
我认为这可以解决你的问题。