最近、特定のトピックを検索すると、そのトピックの最初の投稿ではなく、途中の投稿が検索結果に表示されることに気づきました。これは、トピック内の投稿に、トピックのタイトルに含まれていると同じ検索語が含まれている場合に発生します。以下は、http://community.wanikani.com から最近の例を2つ挙げたものです。
「Self Study Quiz」または「Self-Study Quiz」を検索すると、最初の投稿ではなく [Userscript] Self-Study Quiz - #731 by prouleau - API And Third-Party Apps - WaniKani Community が表示されます。
「ご注文はうさぎですか」を検索すると、最初の投稿ではなく ご注文はうさぎですか miscellaneous discussion - #93 by seanblue - Book Clubs - WaniKani Community が表示されます。
これが私が説明している通りに以前から機能していたものかどうかは100%確信がないため、#feature に投稿しました。しかし、上記の2番目の検索語は年数回検索しており、以前は検索結果でそのトピックの最初の投稿が返っていたとかなり 確信しています。もしこれが何らかの理由で意図せず変更されたのであれば、これは bug と見なすこともできます。
トピックのタイトルのみを検索する高度な検索オプションがあることは承知していますが、この場合は不要に思えます。検索語がトピック内の多くの投稿だけでなくタイトル自体にも一致する場合、タイトルとの一致を自動的に優先し、最初の投稿を返すべきだと考えます。
「いいね!」 6
これは @tgxworld と @sam が最近検索機能に対して行った変更の結果です。おそらく彼らから回答があるでしょう。
「いいね!」 4
sam
(Sam Saffron)
2021 年 1 月 7 日午前 5:59
3
はい、これについては長く議論しました。全体的な私の好みとしては、検索は非常に単純で、ランキングに関係なくトピック内の最初の一致を常に優先するべきです。そうすれば人々に説明しやすく、ランキングは非常に恣意的で魔法のように感じられるからです。
「いいね!」 7
fhe
(Florian)
2021 年 1 月 7 日午前 8:46
5
OT でのリクエスト、つまり検索条件にトピックタイトルが一致する場合にトピック自体(最初の投稿)を参照し、一致しない場合は一致が発生した具体的な投稿を参照するという要望は理解しています。
「いいね!」 3
sam
(Sam Saffron)
2021 年 1 月 7 日午前 8:48
6
問題は、1 つのトピックに 15 件の一致がある場合、そのうちの 1 つが最も高い「ランク」を持つ可能性があることです。
「いいね!」 4
正直なところ、最初の投稿(タイトル一致による)が何よりも優先されていれば、それ以降の詳細にはあまりこだわらないのですが、おっしゃることは理にかなっていると思います。トピック内で12件ほどの投稿が検索フレーズと完全に一致する場合、現在検索結果として返ってくるものがどれかは確かに恣意的に感じられます。トピック内で一致する最も古い投稿を常に返すのは、良い解決策のように思えます。
とはいえ、検索アルゴリズムは少なくとも、検索語の部分的な一致しか持たない古い投稿が、完全一致する新しい投稿よりも優先されないよう、完全一致を依然として優先すべきでしょう。アルゴリズムに詳しくないため、それが関連するかどうかはわかりません。いずれにせよ、前述の通り、タイトル一致を最優先することの方が、これらの詳細よりもはるかに重要だと考えています。
「いいね!」 6
私がトピックの途中にある自分の投稿へのリンクを共有しようとした人からタグ付けされ続けています。現在のやり方は確かに混乱を招いています。
「いいね!」 1
その通りです @tgxworld と @sam 、これは本当に変更する必要があります。ここでは「3 の法則」を遥かに超えています。タイトル一致には、ランキングにおいて超巨大な超新星ブラックホール のような重みを持たせるべきです。
「いいね!」 9
tgxworld
(Alan Tan)
2021 年 1 月 18 日午前 2:16
10
常にトピックの最初の投稿を優先するほど単純ではないと思います。特定の検索シナリオを変更すると、別のシナリオに影響を及ぼすからです。以下のシナリオを考えてみてください。
トピック X とトピック Y の両方に、検索語「discourse」に一致する投稿が含まれています。
トピック X の投稿 1 と投稿 100 が検索語「discourse」に一致します。
投稿 100 の内容が検索語「discourse」に非常に良く一致するため、投稿 100 の方が上位にランクされます。
トピック Y の投稿 1 が検索語「discourse」に一致します。
投稿 1 の内容が検索語「discourse」により関連性が高いため、トピック Y の投稿 1 の方がトピック X の投稿 1 よりも上位にランクされます。
以前の手法では、トピック X の投稿 100 のランキングを使って、トピック Y の投稿 1 と比較していました。この場合、トピック Y の投稿 1 の方が検索語との一致が明確に優れているにもかかわらず、トピック X の投稿 1 の方が検索結果で上位に表示されてしまいます。これは、トピック内の最も高いランキングの投稿を使ってトピックをランク付けしているのと同じことです。
もし単に検索語に一致するトピック内の最初の投稿を採用する場合、より良い一致であるにもかかわらず投稿番号が大きい投稿が除外されてしまいます。これにより、「なぜこの投稿が検索結果に含まれなかったのか」という疑問を招くことになります。
私がここで提案されている内容に対して主な異議を唱えている点は、デフォルトの検索は投稿を対象としているため、ユーザーが実際に検索しているのは投稿本文であり、タイトルではないということです。タイトルは、適切な投稿を探すためにトピック全体をフィルタリングするのに役立ちます。
実際、私たちはタイトル一致により高い重みを付けています。唯一の問題は、タイトルが特定のトピック内のすべての投稿の検索データの一部であるため、すべての投稿がタイトル一致に対して同じ重みの恩恵を受けている点です。
「いいね!」 2
しかし、誰もそのような提案をしているわけではないと思います。私たちが言っているのは、タイトルが一致するものをより上位にランク付けすることであり、あなたが刚才説明したシナリオとは異なります。タイトルが検索語と一致する場合、トピック内のすべての投稿ではなく、特に最初の投稿のランクを上げるべきです。
この評価には同意できません。ユーザーは特定の「投稿」を見つけることに関心があるのではなく、「コンテンツ」を見つけることに関心があります。トピックが適切に命名されている場合、タイトルはユーザーが求めているものの最良の指標となることが多く、その場合の大半は最初の投稿から始まります。
少なくとも私が利用しているコミュニティでは、特定のサブカテゴリに、他のユーザーが助けを求めた際にトピックを共有する目的で頻繁に検索されるトピックがあります。検索結果からトピック内の最初の投稿ではなく、ランダムな投稿が表示されることで、誤った投稿が共有され、ユーザーが迅速に助けを得られないという事態が発生しました。
共有のためであれ個人的な利用のためであれ、ユーザーが同じトピックを繰り返し検索したい頻度を過小評価していると思います。そのような場合、ユーザーの大多数は、最初の投稿を閲覧したいか、または中断した場所から再開したいと考えているはずです。
「いいね!」 5
tgxworld
(Alan Tan)
2021 年 1 月 18 日午前 4:47
12
私が述べたシナリオは、Discourse の検索が以前どのように機能していたかを示すものであり、それは誤った動作です。
この表現は誤解を招くものでした。デフォルトでは、トピックのタイトルと投稿の本文の両方を組み合わせて検索します。
これは事実である場合もありますが、常にそうとは限りません。なぜなら、これは検索語が常にトピックのタイトルと一致すると仮定しているからです。コーディングフォーラムでは、時々コードのスニペットを検索することがありますが、そのようなものはタイトルには現れません。
提案されていることは不可能ではありませんが、いくつかの技術的な判断とトレードオフを考慮する必要があります。例えば、最初の投稿以外の投稿については、PostSearchData からトピックのタイトルを除外する必要があります。これにより、トピックのタイトルが一致した場合、最初の投稿が他の投稿よりも高いランキングを得るようになりますが、それでも Postgres のランキングアルゴリズムに依存せざるを得ないという点では変わりません。
「いいね!」 4
tgxworld
(Alan Tan)
2021 年 1 月 19 日午前 1:41
14
@sam これについてあなたの考えをお聞かせください。検索が正しくランキングされているのは、「投稿のどこかに」という部分が、タイトルと本文の両方に検索語を含んでいるのに対し、最初の投稿はタイトルにのみ検索語を含んでいるためです。別の投稿の方がはるかに良い一致であるのに、最初の投稿を表示したくなるのは直感に反しているように思えます。私の観察によると、検討できるオプションがいくつかあります。
古い動作に戻す。トピック内の複数の投稿が指定された検索語に一致する場合、常に最も小さい投稿番号を持つ投稿を選択する。ここでの欠点は、最も小さい投稿番号が常に最初の投稿とは限らず、その場合検索結果が不十分になる可能性があることです。また、投稿の本文が明らかにはるかに良い一致であるにもかかわらず、そのトピック内のより低い投稿番号を持つ別の投稿が検索語に一致するだけで除外されてしまうケースもあります。
UX 側から問題を解決できないか考えてみます。投稿へ移動する単一のリンクだけでなく、検索結果のタイトルは常にタイトル内の最初の投稿へリンクし、検索抜粋は検索結果でランク付けされた投稿へリンクするようにするのはいかがでしょうか。
最初の投稿以外の投稿の PostSearchData からトピックタイトルの情報を除外する。少し実験が必要ですが、これにより検索結果が最初の投稿に大きく偏って返されると予想されます。
私はオプション 2 を試してみたいと考えています。これにより検索結果の精度を保ちつつ、自分が何を検索しているかを知っているユーザーが、検索結果から最初の投稿へ移動する手段を提供できるからです。
「いいね!」 4
これは非常に不快感を覚えます。ユーザーがホバー時のリンクデータを読み(解釈する)習慣がない限り、この動作は明白ではありません。
2段階検索を検討してみてはいかがでしょうか?
トピックタイトルを検索し、EXACT_MATCH と CONTAINS_ALL のみで一致させる
これらは結果の最上部に配置され、EXACT_MATCH が優先されます
その後、現在の重み付け検索を使用して残りの結果を埋めます。ただし、最初の段階でヒットしたトピック開始投稿は除外します。
「いいね!」 3
tgxworld
(Alan Tan)
2021 年 1 月 19 日午前 2:18
16
Sailsman63:
これは直感的ではありません。
この案は、UX を変更してこれを直感的にすることです。
Sailsman63:
2段階検索を検討するのはどうでしょうか?
トピックタイトルを検索し、EXACT_MATCH と CONTAINS_ALL のみで一致させる
これらは結果の最上部に配置され、EXACT_MATCH が優先される
次に、現在の重み付け検索を使用して残りの結果を埋める(ただし、1段階目でヒットしたトピックの投稿元ポストは除外する)
アイデアは妥当ですが、like や ilike 演算子での一致を試みる際にインデックスのサポートがないため、Postgres の検索クエリを効率的に実行できないと思います。もう一つの考慮点は、完全一致や部分一致をランク付けする方法がないことです。そのため、Postgres が提供する全文検索機能に完全に依存しています。
「いいね!」 1
最初の投稿とマッチした投稿へのリンクを、より明確に区別する方法が必要になると思います。提案された方法は直感的ではないように思います(あくまで例示だと理解しています)。
私が考えた別の可能性としては、トピック内のすべての一致する投稿を表示する方法があります。例えば、展開/折りたたみ機能を使うのです。現在の表示と同様に、すべての一致するトピックから最もよく一致した投稿を表示し、各一致トピックの隣に矢印などを配置して、そのトピック内のすべての一致する投稿リストを展開できるようにするのです。ただし、これはやりすぎかもしれませんね。
Sailsman63:
2段階検索を検討してみてはいかがでしょうか?
トピックタイトルを検索し、EXACT_MATCH と CONTAINS_ALL のみでマッチング
これらは結果の最上部に配置され、EXACT_MATCH が優先されます
次に、現在の重み付け検索を使用して残りの結果を埋めます。ただし、1段階目でヒットしたトピック開始ポストは除外します。
これはぜひ試してみる価値があると思います。タイトルマッチを優先することで、私が不満に思っていた問題を解決できます。また、@tgxworld さんが指摘されたコーディングフォーラムのシナリオも解決できます。ご指摘の通り、コードスニペットはタイトルに含まれないためです。
もちろん、非現実的であれば話は別ですね。もっとパフォーマンスを向上させる方法をご存知の方がいるかもしれません。
既存の技術に依存するのは素晴らしいことですが、それがあなたのユースケースを適切に解決する場合に限ります。このトピックで提起された問題から考えると、Postgres のフルテキスト検索だけでは不十分であるように思えます。@Sailsman63 さんが提案されたようなハイブリッドアプローチが理想的ですが、実現可能かどうかは別問題です。
tgxworld:
以前の動作に戻す。
現時点で「簡単な答え」がないようなので、より完全な解決策が検討されている間は、これが最善の選択肢だと思います。UX の変更や、データベースの最適化やその他のパフォーマンス上の考慮事項を必要とする新しいアルゴリズムは、適切に機能するようになるまでに時間がかかる可能性があります。そのため、応急措置として以前の動作に戻すことは妥当だと考えます。
tgxworld
(Alan Tan)
2021 年 1 月 19 日午前 2:39
18
残念ながら、「自分たちにとってより良いものへ切り替えよう」と言うだけでは簡単にはいきません。最終的な決定を下す前に、ビジネス面と技術面の両方からトレードオフを検討する必要があります。
しかし、それではより良い解決策へと進展しないため、実施には慎重です。むしろ、古い挙動は誤っているとの強い信念を持っています。このトピックで説明されているケースは、検索するユーザーがまさに探したいトピックを正確に知っているという単一の状況に基づいており、検索結果が最初の投稿へのリンクになることが直感的に見えるものです。しかし、私はあえて主張します。すでに探しているトピックのタイトルを知っているユーザーは、in:title という高度な検索フィルターを使用すべきです。検索の大半の場合、投稿の内容が重要であり、トピックタイトルの部分一致だけでそのトピックの最初の投稿を表示させるべきではありません。
「いいね!」 1
はい、それも一理あるかもしれませんね。
もし高度な検索がもっとシンプルであれば、それで十分かもしれません。個人的には、オプションが多すぎて必要なものを見つけるのが非常に難しく、使いにくいと感じています。もしかしたら私だけかもしれませんが
in:title チェックボックスを常に表示させるようにするのが適切かもしれません。あるいは、もっと良い案として、入力ボックスの左側に「すべて」「タイトル」「投稿」などのオプションがあるドロップダウンメニューを設けて、検索範囲を指定できるようにするのはどうでしょうか。このような検索フィルターは比較的一般的だと思いますし、ユーザーにとって直感的に使いこなせるか、あるいは必要なければ無視できるものになるはずです(と願います)。比較例として、IMDb では「すべて」「タイトル」「俳優」などで検索できます(正確なオプションは覚えていません)。現在「すべて」と「投稿」は実質的に同じものなので、どう区別するかは考える必要がありますが、このアプローチを検討する価値はあるかもしれません。
「いいね!」 2
私たちがやるべきことはこれです。トピック内のすべての投稿にトピックタイトルが関連付けられているというのは、私には全く意味がわかりません。
「いいね!」 2
tgxworld
(Alan Tan)
2021 年 1 月 19 日午前 6:02
21
これについては @sam と確認が必要です。当社の検索インデックスはこれまでこのように構築されてきたからです。実際、各投稿の検索インデックスには、その投稿が最初の投稿でなくても、タイトル、カテゴリ名、タグ名が含まれています。
「いいね!」 1