我目前在让Lucene返回由Sitecore中的父节点过滤的结果时遇到一些麻烦。我正在开发一些自定义组件,根据指定的节点作为要搜索的“根”节点,在上下文中显示Lucene文档。
我试图解决的两种方法如下:
LocationIDs
对象的Param
属性,如此网址所示:http://firebreaksice.com/sitecore-search-by-site-with-the-advanced-database-crawler/ 不幸的是,它没有按照它对我声称的那样做。它似乎完全忽略了属性,只返回没有父项过滤器的结果。
使用WildcardQuery
:
queries.Add(new WildcardQuery(new Term("_sitecorefullpath", ContentFullPathRoot + "*")));
要完成我已完成的工作,请将每个Sitecore项目的完整内容路径(例如/sitecore/content/Sites/Kauffman_org/Home/test/Events
)存储到其相应的Lucene文档中。
我所拥有的(显然是错误的)假设是这一行,它将生成一个带有该路径的查询+末尾的asterick通配符,以便匹配任何子节点,实际上会执行通配符查询并获得我想要的结果。
我在Luke中测试了一个通配符查询,它按预期工作。此网址显示我正在谈论的内容:http://i.imgur.com/XVBfIGY.jpg
是什么给出的?我无法弄清楚为什么我的WildcardQuery无法工作......或者为什么LocationID不起作用。我需要其中任何一个来完成我想要完成的任务。任何帮助将不胜感激。
答案 0 :(得分:2)
检查外壳。根据您将查询“关闭”到Lucene的方式,您可能会遇到以您可能不期望的方式重写查询的问题。有关示例,请参阅TermQuery not returning on a known search term, but WildcardQuery does
在Lucene的术语中,你真正想做的可能是PrefixQuery,而不是WildcardQuery - 性能差异只会很小,但我希望。
除此之外;这里有一些可能出错的想法:
1)你的Luke截图显示;您正在使用“KeywordAnalyzer”进行查询。虽然我不记得所有的分析仪;很可能这个会在每个'/'字符上将您的查询分解为标记。这可能会产生意想不到的结果。
2)确保您的路径存储为NOT_ANALYZED / UN_TOKENIZED - 或者Lucene会将您的路径分解为段;再次分裂'/'。
我相信2)可能会发生在你身上。 Lucene已经对您的索引字段值进行了标记,并且Luke能够对此索引执行搜索 - 但仅使用KeywordAnalyzer(反过来也会对您的查询进行标记)。
总之;如果你可以的话;将路径存储在索引中的小写的非标记化/未分析字段中;并使用本机Lucene PrefixQuery对其进行查询;或者是WildcardQuery。
希望这有帮助。
答案 1 :(得分:0)
如果您正在使用sitecore 6.6并使用高级数据库抓取工具,请使用以下函数根据位置ID获取skinnyitem结果列表:
public static List<SkinnyItem> GetSkinnyItemsByLocationID(string indexName, string locationID, string templateID) {
List<SkinnyItem> results = new List<SkinnyItem>();
string language = Sitecore.Context.Language.Name;
var searchParam = new SearchParam {
Language = language,
LocationIds = locationID,
TemplateIds = templateID
};
using (var runner = new QueryRunner(indexName)) {
return runner.GetItems(searchParam);
}
}