2015-01-17 244 views
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记录。

我必须做其他任何事情来做阵列类型字段的通配符搜索吗?

+0

我不知道是什么原因您的查询返回两个记录。在我看来,查询应该实际上只返回第一条记录。话虽如此,我认为你应该尝试使“时间”字段不被分析。为什么你在该领域使用关键字分析器(而不是分析)? –

+0

@dogjones谢谢你的答复。请检查上面编辑的代码是我需要什么 – USER007

回答

0

我解决它我自己。我不得不使用包括和排除在聚集,使过滤器的工作和删除外卡型query.Refering here帮我