Sorting 对搜索结果进行排序

Sorting 对搜索结果进行排序,sorting,language-agnostic,text-search,Sorting,Language Agnostic,Text Search,我正在同时实现短语和关键字搜索(这种搜索很可能有一个名称,但我不知道)。举例来说,我喜欢海龟的搜索应该匹配: I like turtles He said I like turtles I really like turtles I really like those reptiles called turtles Turtles is what I like 简而言之,字符串必须包含要匹配的所有关键字 然后是对搜索结果进行排序的问题 天真地说,我假设匹配项越接近结果的开头和原始查询,结果就越

我正在同时实现短语和关键字搜索(这种搜索很可能有一个名称,但我不知道)。举例来说,我喜欢海龟的搜索应该匹配:

I like turtles
He said I like turtles
I really like turtles
I really like those reptiles called turtles
Turtles is what I like
简而言之,字符串必须包含要匹配的所有关键字

然后是对搜索结果进行排序的问题

天真地说,我假设匹配项越接近结果的开头和原始查询,结果就越好。我如何表达这个代码

我的第一种方法是根据关键字与原始查询中预期位置的接近程度,为每个结果中的每个关键字分配分数。在伪代码中:

score(result,query) {
    keywords = query.split(" ");
    score = 0
    for i to keywords.length() {
       score += score(result,query,keywords,i)
    }
    return score
}

score(result,query,keywords,i) {
    index = text.indexOf(keywords[i])
    if (i == 0) return index;

    previousIndex = text.indexOf(keywords[i-1])
    indexInSearch = query.indexOf(keywords[i])
    previousIndexInSearch = query.indexOf(keywords[i-1])

    expectedIndex = previousIndex + (indexInSearch - previousIndexInSearch)

    return abs(index - expectedIndex)
}
分数越低,结果越好。上述例子的分数似乎足够令人满意:

I like turtles = 0
I really like turtles = 7
He said I like turtles = 8
I really like those reptiles called turtles = 38
Turtles is what I like = 39
这是对搜索结果进行排序的可行方法吗


撇开任何类型的语义分析不谈,我还能考虑什么来改进它呢?

字符串相似性的度量方法有很多种;请参见例如…@jornsharpe字符串距离算法不会惩罚较长的搜索结果吗?或者您正在考虑列表中的某个特定字符串相似性算法?这似乎有很多偶然的变化。“我不喜欢海龟”比“我真的喜欢海龟”得分更高。@JerryCoffin从句法角度看,“我不喜欢海龟”比“我真的喜欢海龟”更接近原始查询1个字符。当然,搜索引擎应该考虑语义学,但我宁愿把它排除在问题的范围之外。我想如果我这么做的话,至少我只会看整个单词的位置,而不是单个单词中的字母个数。我可能也会做一些预处理,比如去除噪音词和对剩下的词进行词干分析。