Elasticsearch通配符搜索

时间:2015-01-17 07:38:25

标签: elasticsearch nest

我使用字符串数组索引字段如下:

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;
                                       }))))
                         ));

上面的查询应该只返回&#34; morning&#34;因为第一个&#34;早上&#34;使用通配符过滤掉,然后应用聚合,但它聚合并返回时间字段中的所有值。如果对字段名称应用相同的查询=&#34; john&#34;它返回正确的结果1记录。

我是否还需要做任何其他事情来在阵列类型字段上进行外卡搜索?

1 个答案:

答案 0 :(得分:0)

我自己解决了这个问题。我必须在聚合中使用include和exclude来使过滤器工作并删除通配符类型查询。查看here帮助我

相关问题