我正尝试通过 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")));
有人建议嵌套查询/过滤器,因为有人建议我应该扁平化我的文档,我可以这样做,但我正在尝试创建一个模型来更好地代表真实域,所以我陷入了困境。
同样,我知道在某些时候我还必须使用分面,所以我想正确地构建所有内容以支持它。
谢谢 蒂姆
最佳答案
事实证明,我的文档结构没有太大问题。这个例子很陈腐,我在集合上查询的真实属性是一个字符串,而不是一个 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”,但它现在可以工作。
关于elasticsearch - 将 NEST 与 Elastic Search 一起用于集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17151750/