【问题标题】:Using Elasticsearch.Net/NEST to search parent documents based on child attributes, where parent/child documents are stored separately使用Elasticsearch.Net/NEST根据子属性搜索父文档,父/子文档分开存放
【发布时间】:2014-07-19 22:24:08
【问题描述】:

我想使用 Elasticsearch.Net/NEST 搜索相关文档。例如,我有:

Person:

id name address_id
-- ---- ----------
1  John 1
2  Mary 2

Address:

id city
-- ------
1  Boston
2  Berlin

我想分别存储 Person 和 Address 文档,并根据 Address 字段查询我返回 Person 文档的位置。例如,归还居住在波士顿的人的所有文件。我在 Elaticsearch 文档中看到了一些使用映射和父/子指令的示例,但对于 Elasticsearch.Net/NEST 则没有。任何代码示例或指针将不胜感激...

【问题讨论】:

    标签: .net elasticsearch nest


    【解决方案1】:

    我认为最好的地方是 NEST 单元测试。

    Nest Documentation Site 上还有一个用于运行has_child 查询的小sn-p。 (和单元测试差不多)

    【讨论】:

    • 这些链接有所帮助,但不清楚如何将文档添加到索引中。那里有任何指针吗?
    【解决方案2】:

    这是一个小sn-p,地址是父级

    编辑: 创建索引:

    var indicesOperationResponse = _client.CreateIndex(ci => ci.Index("test")
                .AddMapping<Address>(m => m.MapFromAttributes())
                .AddMapping<Person>(m => m.MapFromAttributes().SetParent<Address>()));
    

    索引文件:

    var bulkResponse = _client.Bulk(b => b
                .Index<Address>(bd => bd.Object(new Address { Name = "Tel Aviv", Id = 1 }).Index("test"))
                .Index<Person>(bd => bd.Index("test").Object(new Person {Id = 5, Address = 1, Name = "Me"}).Parent(1)));
    

    并按父母搜索

    var searchResponse = _client.Search<Person>(s => s
            .Query(q=>q.MatchAll())
            .Filter(q => q
                .HasParent<Address>(c => c
                    .Query(cq => cq.Match(m=>m.OnField(t => t.Name).Query("Tel Aviv"))))));
    

    【讨论】:

    • 谢谢。查询看起来像我需要的,但是如何正确地将 Person 和 Address 文档添加到索引中?
    • @BillyP。 - 我将创建索引和索引文档添加到 sn-p
    • 其实有问题。当我搜索“东京”时,我也会返回“我”。
    • 没关系,我发现了我的问题。您的解决方案效果很好!非常感谢!
    • 如何索引单个子文档?据我所知,_client.Index(somePerson) 是单独索引文档的唯一方法。之后无法指定.Parent(parentId)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-17
    • 1970-01-01
    • 2013-03-19
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    相关资源
    最近更新 更多