Lucene不会使用LocationID或WildcardQuery返回Sitecore结果

时间:2014-01-07 16:24:53

标签: .net lucene sitecore

我目前在让Lucene返回由Sitecore中的父节点过滤的结果时遇到一些麻烦。我正在开发一些自定义组件,根据指定的节点作为要搜索的“根”节点,在上下文中显示Lucene文档。

我试图解决的两种方法如下:

不幸的是,它没有按照它对我声称的那样做。它似乎完全忽略了属性,只返回没有父项过滤器的结果。

  • 使用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不起作用。我需要其中任何一个来完成我想要完成的任务。任何帮助将不胜感激。

2 个答案:

答案 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);
            }
        }