Сортировка результатов поиска
Я реализую поиск по фразе и по ключевым словам вместе (скорее всего, у этого вида поиска есть имя, но я его не знаю). В качестве примера, поиск, который я люблю черепах, должен соответствовать:
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
Это жизнеспособный подход для сортировки результатов поиска?
Оставляя в стороне какой-либо семантический анализ, что еще я мог бы рассмотреть, чтобы улучшить его?