3

我试图通过 NEST .Net api 使用 Elastic Search 弄脏我的手,并遇到了几个问题。我怀疑我误解了某些东西,或者我的文档建模不正确,但希望能得到一些帮助。

我有一个包含集合的文档。下面是一个类似的老生常谈的例子:

public class Company
{
    public DateTime RegisteredOn {get;set;}
    public string Name {get;set;}

    [ElasticProperty(Type = FieldType.nested)]
    public List<Employee> Employees {get;set;}
}

public class Employee 
{
   public string FirstName {get;set;}
   public string LastName {get;set;}

   [ElasticProperty(Type = FieldType.nested)]
   public List<SalesFigure> SalesFigures {get;set}
}

public class SaleFigure
{
   public int AverageMonthlySaleValue {get;set;}
   public int AverageVolumeSold {get;set;}
}

我在层次结构的每个级别和索引调用之前创建了一个索引,其中包含一些数据client.MapFromAttributes<Company>();

以下工作,但我想了解如何找到所有员工的名字为 Bob 的公司,或者找到所有员工的平均 AverageMonthlySaleValue > $1100 的公司

client.Search<Company>(query => query.Index("companies").Type("company")
                                 .From(0)
                                 .Size(100)
                                 .Filter(x => x.Term(n => n.Name, "Microsoft")));

有人建议使用嵌套查询/过滤器,因为有人建议我应该展平我可以做的文档,但我正在尝试创建一个更好地代表真实域的模型,所以我陷入了困境。

同样,我知道在某些时候我还必须使用构面,因此希望正确构建所有内容以支持这一点。

谢谢蒂姆

4

1 回答 1

3

所以事实证明我的文档结构并没有太大问题。这个例子是陈腐的,我在一个集合上查询的真实属性是一个字符串,而不是一个 int,所以区分大小写。

我不得不更改查询以使用小写字符串值进行比较,这很有效。像下面这样的东西起作用了。

client.Search<Company>(query => query.Index("companies")
               .Type("company")
               .From(0)
               .Size(100)
               .Filter(x => x.Term("company.employees.firstName", "microsoft")));

我仍然要弄清楚如何使用 lamda 代替“company.employees.firstName”,但它现在可以工作。

于 2013-06-18T13:18:53.483 回答