首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可以在ElasticSearch中以这种方式过滤出结果吗?

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

Stack Overflow用户
提问于 2018-11-09 18:50:21
回答 1查看 43关注 0票数 0

我正在使用弹性搜索在AWS,与C#和NEST,并希望寻求一些帮助,以解决我的问题。考虑以下格式的一些文档。

GroupId --一个包含大量线程的“聊天室”。

ThreadId -消息发生的特定线程

subject -特定线程的主题(每个线程不更改)

消息这个人写到线程的聊天

举个例子(前3个文档是同一个线程的一部分,第四个文档是一个新线程)。他们都属于同一组。

代码语言:javascript
复制
{
 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!"
}

一个不同的线程和消息

代码语言:javascript
复制
{
 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的“术语”的所有文档。我已经走到了这一步,并拿回了所有的文档,但现在我想让它更加健壮。

代码语言:javascript
复制
     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 (而message不包含),则只接受最近的文档。这是因为如果在“iPhone”线程上写入了1,000条消息,则查询将返回1,000条消息。

这意味着当文档#1、#2和#3都包含主题中的iPhone时,我只想返回文档#1(因为消息包含iPhone)和文档#3(因为它是最近创建的,而不是# 2)。

在弹性搜索中,使用聚合或其他类似的方法是否可能出现这样的情况?

我本来打算在C#上做这个,在我得到复制之后,但我觉得这不会是演戏,你觉得呢?

非常感谢你的关心!

EN

回答 1

Stack Overflow用户

发布于 2018-11-10 03:45:43

最后,我进行了另一个查询(在同一方法中),只执行以下操作:

代码语言:javascript
复制
        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)
        );

然后我把它们连在一起还了回来。效果很好!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53231708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档