gpt4 book ai didi

go - 查找按最佳匹配排序的所有元素

转载 作者:行者123 更新时间:2023-12-01 22:16:41 25 4
gpt4 key购买 nike

我的数据库中有一些实体,称为“事件” 。每个事件都包含一个字符串数组,称为“标签”

我想进行查询以获取与将在参数中给出的标记数组匹配的所有事件。

但是,我希望将这些事件排序为:

  • 第一个是包含我在参数中给出的大多数标签的标签。
  • 第二个是包含我在参数中给出的大多数标签的第二个。
  • 等。

  • 如果有多个事件包含相同数量的标签,则我希望它们按照其 “名称” 属性(按 字母顺序排序)进行排序。

    示例:
  • “名称” =“事件1”,“标签” = [“食物”,“音乐”,“游戏”,“运动”]
  • “名称” =“事件2”,“标签” = [“游戏”]
  • “名称” =“事件3”,“标签” = [“音乐”,“体育”]
  • “名称” =“事件4”,“标签” = [“食物”,“音乐”,“游戏”,“运动”]
  • “name” =“event5”,“tags” = [“音乐”,“sport”,“编码”]
  • “名称” =“事件6”,“标签” = [“编码”]
  • “名称” =“事件7”,“标签” = [“食物”,“游戏”,“运动”]

  • 在此示例中,我在参数中给出的标签数组为:[“食物”,“音乐”,“游戏”,“运动”]

    本示例的结果将是一个事件数组,按以下顺序包含:
    event1,event4,event7,event3,event5,event2

    要获取所有包含标签的事件,我只需使用 “$ or” 运算符进行查询。如果事件至少包含parameter中给定的标签之一,那么这使我可以获得所有事件。

    代码:

        var events []model.Event

    var MyQuery []map[string]interface{}
    for i := 0; i < len(tags); i++ {
    currentCondition := bson.M{"tags": tags[i]}
    MyQuery = append(MyQuery, currentCondition)
    }

    err := dbEvents.C(collectionEvents).Find(bson.M{"$or": OrQuery}).All(&events)

    但是我真的不知道如何像我给你看的那样对它们进行排序。

    最佳答案

    package main

    import (
    "fmt"

    "github.com/ahmetb/go-linq"
    )

    type T struct {
    Name string
    Tags []string
    }

    func main() {
    params := []string{"food", "music", "gaming", "sport"}
    t := []T{
    T{Name: "event1", Tags: []string{"food", "music", "gaming", "sport"}},
    T{Name: "event2", Tags: []string{"gaming"}},
    T{Name: "event3", Tags: []string{"music", "sport"}},
    T{Name: "event4", Tags: []string{"food", "music", "gaming", "sport"}},
    T{Name: "event5", Tags: []string{"music", "coding", "sport"}},
    T{Name: "event6", Tags: []string{"coding"}},
    T{Name: "event7", Tags: []string{"food", "gaming", "sport"}},
    }
    var result []T
    linq.From(t).SortT(func(t1 T, t2 T) bool {
    var rs1 []string
    linq.From(t1.Tags).IntersectByT(linq.From(params), func(str string) string {
    return str
    }).ToSlice(&rs1)
    var rs2 []string
    linq.From(t2.Tags).IntersectByT(linq.From(params), func(str string) string {
    return str
    }).ToSlice(&rs2)
    return len(rs1) > len(rs2)
    }).ToSlice(&result)

    fmt.Printf("%+v", result)
    }

    [{Name:event1标签:[美食游戏游戏]]} {Name:event4标签:[美食游戏游戏]} {Name:event7标签:[美食游戏游戏]} {Name:event3标签:[音乐游戏]} {名称:event5标签:[音乐编码运动]} {名称:event2标签:[游戏]} {名称:event6标签:[编码]}]

    上面的程序根据您的要求对数组进行排序,希望这会对您有所帮助。

    关于go - 查找按最佳匹配排序的所有元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59525630/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com