有条件地包括/排除被搜索的字段

时间:2017-01-25 15:31:29

标签: azure-search

我们有一个非常广泛的索引,我们用于网站范围内的多个内容搜索。我想添加一个只有管理员可以搜索的新字段 - 普通用户不应该搜索它。

目前看来,将搜索字段列入黑名单的唯一方法是使用SearchParamaters.SearchFields,但这需要列出每个其他字段,这是不理想的,因为我们的索引偶尔会增长,并且需要记住添加到此列表。

或者,我们可以使用反射来构建此列表,如果这是我们唯一的选择,我们可以选择这条路线。只是希望我有另一种选择。

2 个答案:

答案 0 :(得分:1)

虽然这不是理想的,但我最终创建了[Searchable][AdminSearchable]属性,并在搜索文档类的所有属性上进行了修饰:

[Searchable]
public string UserName { get; set; }

[Searchable]
public string UserDisplay { get; set; }

[AdminSearchable]
public string UserEmail { get; set; }

然后使用这些static字段构建可搜索字段列表,具体取决于当前用户是否为管理员:

private static readonly string[] _PublicSearchFeilds = 
    typeof(SearchDocument).GetProperties()
    .Where(p => System.Attribute.IsDefined(p, typeof(SearchableAttribute)))
    .Select(p => p.Name.ToLowerCamelCase()).ToArray();

private static readonly string[] _AdminSearchFeilds = 
    typeof(SearchDocument).GetProperties()
    .Where(p => 
        System.Attribute.IsDefined(p, typeof(SearchableAttribute)) ||
        System.Attribute.IsDefined(p, typeof(AdminSearchableAttribute)))
    .Select(p => p.Name.ToLowerCamelCase()).ToArray();

并将其传递给SearchParameters.SearchFields

答案 1 :(得分:0)

目前无法指定要从搜索中排除的字段列表。您可以在User Voice上添加此功能作为功能请求,以帮助我们确定优先顺序。