Elasticsearch 通配符搜索
Elastic search wild card search
我已经使用字符串数组来索引字段,如下所示:
public class MetaData
{
public string[] time { get; set; }
public string name { get; set; }
}
client.CreateIndex(casedirectory_metadata, c => c
AddMapping<object>(m => m
.Properties(props => props
.String(ps => ps.Name("time").IndexAnalyzer("keyword"))
.String(ps => ps.Name("name").IndexAnalyzer("keyword"))
)));
MetaData objmetadata = new MetaData();
objmetadata.time = new string[] { "morning" };
objmetadata.name = "jhon";
client.Index<object>((object)objmetadata);
MetaData objmetadata = new MetaData();
objmetadata.time = new string[] {"this morning", "9.30 am", "evening" };
objmetadata.name = "jhon rapher";
client.Index<object>((object)objmetadata);
在上面的代码中有两个索引时间和名称的字段。
时间字段为字符串数组类型,名称字段为简单字符串类型
在下面的代码中,通配符搜索是在时间字段
上使用聚合执行的
var qryRes1 = client.Search<object>(x => x
.Aggregations(ag => ag
.Filter("filter", (flt => flt
.Filter(f =>
{
FilterContainer filter = null;
filter &= f.Query(qr => qr.Wildcard(wl => wl.OnField("time").Value("morning")));
return filter;
})
.Aggregations(agr => agr
.Terms("time", tr =>
{
TermsAggregationDescriptor<object> trmAggDescriptor = new TermsAggregationDescriptor<object>();
trmAggDescriptor.Field("time");
trmAggDescriptor.Size(0);
return trmAggDescriptor;
}))))
));
上面的查询应该 return 只聚合计数为 1 的 "morning" 因为首先 "morning" 使用通配符过滤掉然后应用聚合但是它聚合并且 return s 所有值在时间 filed.If 相同的查询应用于字段名称 ="john" 它是 returning 正确的结果 1 记录。
我是否需要执行任何其他操作才能在数组类型字段上进行通配符搜索?
我解决了 myself.I 必须在聚合中使用 include 和 exclude 才能使过滤器工作并删除通配符类型 query.Refering here 帮助了我
我已经使用字符串数组来索引字段,如下所示:
public class MetaData
{
public string[] time { get; set; }
public string name { get; set; }
}
client.CreateIndex(casedirectory_metadata, c => c
AddMapping<object>(m => m
.Properties(props => props
.String(ps => ps.Name("time").IndexAnalyzer("keyword"))
.String(ps => ps.Name("name").IndexAnalyzer("keyword"))
)));
MetaData objmetadata = new MetaData();
objmetadata.time = new string[] { "morning" };
objmetadata.name = "jhon";
client.Index<object>((object)objmetadata);
MetaData objmetadata = new MetaData();
objmetadata.time = new string[] {"this morning", "9.30 am", "evening" };
objmetadata.name = "jhon rapher";
client.Index<object>((object)objmetadata);
在上面的代码中有两个索引时间和名称的字段。
时间字段为字符串数组类型,名称字段为简单字符串类型
在下面的代码中,通配符搜索是在时间字段
var qryRes1 = client.Search<object>(x => x
.Aggregations(ag => ag
.Filter("filter", (flt => flt
.Filter(f =>
{
FilterContainer filter = null;
filter &= f.Query(qr => qr.Wildcard(wl => wl.OnField("time").Value("morning")));
return filter;
})
.Aggregations(agr => agr
.Terms("time", tr =>
{
TermsAggregationDescriptor<object> trmAggDescriptor = new TermsAggregationDescriptor<object>();
trmAggDescriptor.Field("time");
trmAggDescriptor.Size(0);
return trmAggDescriptor;
}))))
));
上面的查询应该 return 只聚合计数为 1 的 "morning" 因为首先 "morning" 使用通配符过滤掉然后应用聚合但是它聚合并且 return s 所有值在时间 filed.If 相同的查询应用于字段名称 ="john" 它是 returning 正确的结果 1 记录。
我是否需要执行任何其他操作才能在数组类型字段上进行通配符搜索?
我解决了 myself.I 必须在聚合中使用 include 和 exclude 才能使过滤器工作并删除通配符类型 query.Refering here 帮助了我