我正在尝试使用过滤器执行查询。我可以让它过滤一些属性,但不是我需要的属性。这是我的模特:
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
}}]}}
答案 0 :(得分:1)
“角色”字段上的[ElasticProperty(Index = FieldIndexOption.NotAnalyzed)]
属性定义了映射属性,表示此字段的内容在编制索引之前不会通过分析过程。有关映射的官方文档,请参阅here;有关分析过程的文档,请参阅here。相反,Name字段的内容将在被索引之前从分析过程中传递。
您正在使用的术语过滤器,过滤包含此术语所提供字段的文档,而不从分析过程中传递该术语(请参阅here)。
示例:如果您正在使用标准分析器并且想要使用Name =“Data”索引IndexItem,那么分析器会将“数据”转换为“数据”并插入此倒排索引中的术语。使用相同的分析器并希望索引具有Role =“Data”的IndexItem,然后“数据”术语将保存在反向索引中,因为角色字段的内容将从分析过程中排除。
因此,如果要创建术语过滤器以匹配“角色”字段上的先前文档,则要过滤的值为“数据”(与索引文档中的值完全相同)。如果要使术语过滤器与“名称”字段中的先前文档匹配,则要过滤的值为“data”。请记住,在索引和查询数据时使用相同的分析器是一种很好的做法。