2014-01-07 27 views
1

我目前在使Lucene返回由Sitecore中的父節點過濾的結果時遇到了一些麻煩。我正在開發一些自定義組件,它們根據指定哪個節點作爲要搜索的「根」節點來上下文顯示Lucene文檔。Lucene不會使用LocationIDs或WildcardQuery返回Sitecore結果

2種方式,我試圖解決這個如下:

不幸的是,它沒有不要做它爲我所聲稱的。它似乎完全忽略該屬性,只是返回沒有父項過濾器的結果。

  • 使用WildcardQuery

    queries.Add(new WildcardQuery(new Term("_sitecorefullpath", ContentFullPathRoot + "*")));

爲了實現myI've所做的是每個Sitecore的項目的全部內容路徑(如/sitecore/content/Sites/Kauffman_org/Home/test/Events)存儲到其相應的Lucene的文檔。 我認爲(顯然不正確)是這條線,它將生成一個查詢與該路徑+末尾星號通配符,因此它會匹配任何子節點,實際上將執行通配符查詢,並讓我得到我想要的結果。

我已經在Luke中測試了一個通配符查詢並且它按預期工作。這個URL顯示我在說什麼:http://i.imgur.com/XVBfIGY.jpg

什麼給了?我無法弄清楚爲什麼我的WildcardQuery不起作用......或者爲什麼LocationIDs不起作用。我需要他們中的任何一個來完成我試圖完成的任務。任何幫助將非常感激。

回答

2

檢查你的套管。根據你如何將你的查詢「解僱」到Lucene,你可能會遇到你的查詢正在以你可能不期望的方式被重寫。例如,請參見TermQuery not returning on a known search term, but WildcardQuery does

在Lucene術語中,您真正想要做的可能是PrefixQuery,而不是WildcardQuery - 儘管如此,性能差異只會很小。

除此之外;這裏有一些想法可能會出錯:

1)你的盧克截圖顯示;您正在使用「KeywordAnalyzer」進行查詢。雖然我忘記了所有的分析儀,很可能這個人會把你的查詢分解成每個'/'字符的標記。這可能會產生意外的結果。

2)確保您的路徑存儲爲NOT_ANALYZED/UN_TOKENIZED - 否則Lucene會將您的路徑分解爲多個段;再次分裂'/'。

我確實相信2)可能會發生在你身上。 Lucene已經標記了你的索引字段值,而Luke能夠對這個索引執行搜索 - 但只能使用KeywordAnalyzer(反過來,它也可以標記你的查詢)。

總之;如果你可以的話;將路徑存儲在索引中的小寫非標記化/未分析字段中;並使用本機Lucene PrefixQuery進行查詢;或者一個WildcardQuery。

希望這會有所幫助。

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); 
      } 
     } 
相關問題