2016-08-13 66 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字段。