フレーズ検索とキーワード検索を一緒に実装しています (おそらくこの種の検索には名前がありますが、わかりません)。たとえば、 I like turtlesという検索は次のように一致する必要があります。
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
これは、検索結果を並べ替えるための実行可能なアプローチですか?
あらゆる種類のセマンティック分析はさておき、それを改善するために他に何を検討できますか?