可以通过这种方式在ElasticSearch中过滤出结果吗?

时间:2018-11-09 18:50:21

标签: elasticsearch nest

我正在C#和NEST上在AWS上使用Elastic Search,并想寻求一些帮助来解决我的问题。考虑以下格式的一些文档。

GroupId -一个拥有大量线程的“聊天室”

ThreadId -发生消息的特定线程

主题-特定主题的主题(每个主题不变)

消息该人向该话题写的聊天

这样就是一个例子(前三个文档是同一线程的一部分,第四个文档是新线程)。全部都属于同一组。

{
 Id: 4bd0a786-488b-4e97-a7cf-eb5cc223975e,
 GroupId: 6bd0a123-4bb3-4c91-abcf-cb5cc114314c,
 ThreadId: 22d1b2ac-4ed3-5c91-d2fa-cb2ba44cba4d,
 DateCreated: "2018-11-1 01:00:00",
 Subject: "iPhone",
 Message: "Are you going to buy the new iPhone?"
}

{
 Id: bcd0a1d3-1b1e-5f1c-a7cf-ebdce22eeb5c,
 GroupId: 6bd0a123-4bb3-4c91-abcf-cb5cc114314c,
 ThreadId: 22d1b2ac-4ed3-5c91-d2fa-cb2ba44cba4d,
 DateCreated: "2018-11-2 01:00:00",
 Subject: "iPhone",
 Message: "No, you?"
}

{
 Id: bcd04e86-518b-4c16-c6cf-eb444c3b175d,
 GroupId: 6bd0a123-4bb3-4c91-abcf-cb5cc114314c,
 ThreadId: 22d1b2cc-4ed3-5c91-d2fa-cb2ba44cba4d,
 Subject: "iPhone",
 DateCreated: "2018-11-3 01:00:00",
 Message: "I did it and I like it!"
}

其他线程和消息

{
 Id: cbd04786-418b-3c16-b6cf-eb4cc333975e,
 GroupId: 6bd0a123-4bb3-4c91-abcf-cb5cc114314c,
 ThreadId: 11d0a3cb-4dd3-4c91-defa-cb2ca113314c,
 Subject: "Party tomorrow?",
 DateCreated: "2018-11-8 11:05:00",
 Message: "Are you going to come to the party? Bring your iPhone or camera so we can take some pictures!"
}

我的查询

目标是查找给定groupId的主题或消息中包含“ term”的所有文档。到此为止,我已经取回了所有文档,但是现在我想使其更加强大。

     var results = client.Search<IndexedMessage>(s => s.Type("indexedmessage")
                    .Query(q => 
                           (q.Match(m => m.Field(f => f.Body).Query(term)) || 
q.Match(m => m.Field(f => f.Subject).Query(term)))
                           && q.Match(m => m.Field(f => f.GroupId).Query(groupId.ToString()))
                    )
                    );

因此,这在大多数情况下都有效,但是现在的问题是,如果我搜索“ iPhone”,由于主题和消息包含“ iPhone”,我会获得所有文档

在这种情况下,我希望做到的是让用户搜索“ iPhone”:

  • 如果消息包含“ iPhone”,则始终返回
  • 如果主题包含iPhone,但不包含消息,则将其返回;但是,如果多个主题包含iPhone(而消息不包含),则仅获取最新文档。这是因为如果在“ iPhone”线程上写入了1,000条消息,则查询将返回1,000条消息。

因此,这意味着虽然主题中的文档#1,#2和#3都包含iPhone,但我只想返回文档#1(因为消息包含iPhone)和文档#3(因为它的创建时间比#2)

在Elastic Search中使用聚合或类似的东西是否可能发生这种情况?

我将在获得重复项后使用C#进行此操作,但是我觉得那不会表现出色,你怎么看?

非常感谢您的考虑!

1 个答案:

答案 0 :(得分:0)

我最终在同一方法内进行了另一个查询,然后执行了以下操作:

        var subjectResults = client.Search<IndexedMessage>(s => s.Type("indexedmessage")
        .Query(q =>
               q.Match(m => m.Field(f => f.Subject).Query(term)) && q.Match(m => m.Field(f => f.GroupId).Query(groupId.ToString()))
              ).Sort(sort => sort
                     .Descending(f => f.DateCreated)).Size(1)
        );

然后我将它们连接在一起并返回。效果很好!