代码之家  ›  专栏  ›  技术社区  ›  NullHypothesis

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

  •  0
  • NullHypothesis  · 技术社区  · 6 年前

    组ID -一个有很多线索的“聊天室”

    线程ID -发生消息的特定线程

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

    信息 聊天的人写的线程

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

    {
     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!"
    }
    

    我的问题

         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”,那么它总是返回

    这意味着,尽管文档#1、文档#2和文档#3在主题中都包含iPhone,但我只想返回文档#1(因为消息包含iPhone)和文档#3(因为它比文档#2创建得更晚)

    在使用聚合之类的弹性搜索中,这样的事情可能发生吗?

    我本来打算在拿到复制品后在C里做这个,但我觉得那不会有效果,你觉得呢?

    非常感谢您的考虑!

    1 回复  |  直到 6 年前
        1
  •  0
  •   NullHypothesis    6 年前

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

            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)
            );