使用否定关键字进行关键字搜索

Keyword search with negative keywords

我有一个关于在 Go 中搜索关键字的简单问题。

我想使用肯定关键字和否定关键字搜索字符串

func keyword(itemTitle string, keywords string) bool {
    splits := strings.Split(keywords, ",")
    for _, item := range splits {
        item = strings.TrimSpace(item)

        fmt.Println(strings.ToUpper(itemTitle))
        fmt.Println(strings.ToUpper(item))

        if strings.Contains(item,"-") {
            item = item[1:]
            if strings.Contains(strings.ToUpper(itemTitle), strings.ToUpper(item)) {
                return false
            }
        }

        item = item[1:]
        fmt.Println(strings.ToUpper(item))

        if strings.Contains(strings.ToUpper(itemTitle), strings.ToUpper(item)) {
            return true
        }
    }

    return false
}

这是我的搜索方法

func TestKeyword(t *testing.T) {
    test1 := "Pokemon Nintendo Switch Cool Thing"
    keywordTest1 := "+pokemon,-nintendo"

    if keyword(test1, keywordTest1) {
        fmt.Println("matched")
    } else {
        fmt.Println("test")
    }

    test2 := "Pokemon Cards Cool"

    if keyword(test2, keywordTest1) {
        fmt.Println("matched")
    } else {
        fmt.Println("test")
    }
}

我的测试用例 我明白为什么它不起作用,因为 +amd 是切片中的第一个,它的 ofc 将 return true 并且不测试其他任何一个,比如 -radeon 但我只是对要做什么感到困惑。

给出的输出

matched
matched

预期输出

test
matched

我更新了你的搜索功能,但保留了签名

func keyword(itemTitle string, keywords string) bool {
    a := strings.ToUpper(itemTitle)
    b := strings.ToUpper(keywords)
    keys := strings.Split(strings.Replace(b, "-", " ", -1), ",")
    for _, key := range keys {
        key = strings.TrimSpace(key)
        if strings.Contains(a, key) {
            return true
        }
    }
    return false
}

并用一个通过的测试和一个失败的测试更新了你的测试函数,看看它是如何工作的。

func TestKeyword(t *testing.T) {
    test1 := "Pokemon Nintendo Switch Cool Thing"
    keywordTest1 := "+pokemon,-nintendo"

    if keyword(test1, keywordTest1) {
        t.Log("matched")
    } else {
        t.Fail()
    }

    test2 := "Pokemon Cards Cool"

    if keyword(test2, keywordTest1) {
        t.Log("matched")
    } else {
        t.Fail()
    }
}

关于第二个测试因带有 + 的关键字而失败,如果需要,您可以通过正则表达式传递它以仅获取字母数字字符。