弹性搜索。 Net With Nest:弹性属性的术语过滤器

时间:2015-05-08 14:26:42

标签: filter nest elasticsearch

我正在尝试使用过滤器执行查询。我可以让它过滤一些属性,但不是我需要的属性。这是我的模特:

    public class IndexItem
    {
         public DateTime CreatedDate { get; set; }

         [ElasticProperty(Index = FieldIndexOption.Analyzed)]
         public String Name { get; set; }

         [ElasticProperty(Index = FieldIndexOption.NotAnalyzed)]
         public String Role { get; set; }

         public bool ExcludeFromSearch { get; set; }
    }

我开始的查询是:

var esQuery = Query<IndexItem>.QueryString(x => x.OnFields(f => f.Name).Query(String.Format("{0}*", query)).Boost(1.2));

如果我在CreatedDate或ExcludeFromSearch上过滤它会像我想的那样工作,但我不能让它适用于角色。

filter.Add(Filter<IndexItem>.Term(x => x.CreatedDate, searchDate)); // Works
filter.Add(Filter<IndexItem>.Term(x => x.Role, role)); // Never Returns a result

        var searchResults = client.Search<IndexItem>(s => s
                .Types(typeof(IndexItem))
                .From(start)
                .Size(count)
                .Query(esQuery)
                .Filter(x => x.And(filter.ToArray()))
         ); // Returns empty if I filter by Role, but works if i filter by CreatedDate

我能看到的唯一区别是Role有注释[ElasticProperty(Index = FieldIndexOption.NotAnalyzed)]。这是否允许不允许过滤?

以下是我在浏览器中输入的查询的示例输出:

{"took":47,"timed_out":false,"_shards":{"total":10,"successful":10,"failed":0},"hits":{"total":1,"max_score":5.9272537,"hits":[{"_index":"default-index","_type":"indexitem","_id":"3639","_score":5.9272537,"_source":{
  "properties": {
    "MainBody": "Test Role Search"
  },
  "id": "3639",
  "createdDate": "2015-05-08T14:34:33",
  "name": "Role Test",
  "url": "/my-role-test/",
  "role": "Admin",
  "excludeFromSearch": false
}}]}}

1 个答案:

答案 0 :(得分:1)

“角色”字段上的[ElasticProperty(Index = FieldIndexOption.NotAnalyzed)]属性定义了映射属性,表示此字段的内容在编制索引之前不会通过分析过程。有关映射的官方文档,请参阅here;有关分析过程的文档,请参阅here。相反,Name字段的内容将在被索引之前从分析过程中传递。

您正在使用的术语过滤器,过滤包含此术语所提供字段的文档,而不从分析过程中传递该术语(请参阅here)。

示例:如果您正在使用标准分析器并且想要使用Name =“Data”索引IndexItem,那么分析器会将“数据”转换为“数据”并插入此倒排索引中的术语。使用相同的分析器并希望索引具有Role =“Data”的IndexItem,然后“数据”术语将保存在反向索引中,因为角色字段的内容将从分析过程中排除。

因此,如果要创建术语过滤器以匹配“角色”字段上的先前文档,则要过滤的值为“数据”(与索引文档中的值完全相同)。如果要使术语过滤器与“名称”字段中的先前文档匹配,则要过滤的值为“data”。请记住,在索引和查询数据时使用相同的分析器是一种很好的做法。