2016-08-13 67 views
2

我想優化通過Sitecore ContentSearch API完成的一些Lucene/Solr查詢。具體來說,當涉及到搜索MultiListField時。優化Sitecore Lucene/Solr查詢

環境: Sitecore的8.1u2,Solr的

我有以下方法查詢multilistfield值:

public static Expression<Func<SearchResultItem, bool>> MultiFieldContainsExpression(IEnumerable<string> fieldNames, IEnumerable<string> ids) 
{ 
    //fieldNames = ["field_A", "field_X"] 
    //ids = [GUID_A, GUID_X] 

    Expression<Func<SearchResultItem, bool>> expression = PredicateBuilder.True<SearchResultItem>(); 
    foreach (string fieldname in fieldNames) 
    { 
     ids.ForEach(id => 
     { 
     expression = expression.Or(i => i[fieldName].Contains(IdHealper.NormalizeGuid(id, true))); 
     }); 
    } 

    return expression; 
} 

產生的Lucene的查詢看起來是這樣的:

((field_A:(*GUID_A*) OR field_A:(*GUID_X*) OR field:_X:(*GUID_A*) OR field_X:(*GUID_X*))) 

我希望查詢更像這樣(如果可能,甚至更好):

((field_A:(*GUID_A* OR *GUID_X*) OR (field_X:(*GUID_A* OR *GUID_X*))) 

基本上,檢查字段中的值數組是否包含來自另一個數組的任何值。非常感謝你提前。

回答

0

Sitecore默認將多列表字段索引爲小寫Guid(Guid.ToString(「N」))的空格分隔列表。通過使用計算字段來非規範化關係並將項目名稱或內容存儲在項目文檔中可能會很有用。計算字段可以遍歷引用的項目,並將它們轉換爲包含其名稱的單個字段。如果您想將結果限制爲某個特定引用項目,並且您知道確切的Guid,那麼您仍然希望保留Guid字段。