0
我已经使用字符串数组索引作为下面的字段:弹性搜索通配符搜索
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;
}))))
));
上述查询应该只返回聚合的“早晨”与因为使用通配符过滤掉第一个“早晨”,然后应用Aggregations,但它会聚合并返回时间字段中的所有值。如果相同查询应用于字段名称=“john”,则返回正确的结果1记录。
我必须做其他任何事情来做阵列类型字段的通配符搜索吗?
我不知道是什么原因您的查询返回两个记录。在我看来,查询应该实际上只返回第一条记录。话虽如此,我认为你应该尝试使“时间”字段不被分析。为什么你在该领域使用关键字分析器(而不是分析)? –
@dogjones谢谢你的答复。请检查上面编辑的代码是我需要什么 – USER007