Kazuhiko
kazuh****@fdiar*****
2014年 9月 27日 (土) 16:54:19 JST
こんにちは。 話が発散してしまってすみません。短くいうと、 * boolean modeは、挙動に特に不満はないけれど、仕様が明記されていない(な ので明記したい) * natural language modeは、仕様は明記されているけれど不満がある(なので 改善したい) という話です。 On 27/09/2014 07:26, Kouhei Sutou wrote: > まず、WHEREにMATCH AGAINSTを指定せずに、SELECT MATCH AGAINST > でスコアだけを使うというのは考えないほうがよいと思います。そ > ういう使い方をしたいケースってあります? もちろん、実際はWHEREにMATCH AGAINSTを書きます。これまでの例で、WHEREを 指定していないのは、どのレコードは除外されるのかも分かるようにスコアが0 のも一覧に出していただけです。 (というか、ドキュメントの例にならったつもり) > で、「0かそうじゃないか」みたいに考えずに、「マッチするかど > うか」で考えたほうがよいと思います。検索というのは「指定した > 条件にマッチしたものを選択する」っていう処理ですよね。そのレ > ベルで考えると「0かそうじゃないか」はもっと下のレイヤーでの > 話で、「マッチするかどうか」で考えるときは気にするべきでない > ことだと思います。(せっかくの抽象化しているのに詳細が漏れ出 > している。) 全文検索のスコアには、「マッチするかどうか」だけでなく「マッチした度合 い」も期待することが多いと思うのですが、「0かそうじゃないか」と書いたの は「マッチするかどうか」だけの意味で、boolean modeでもスコアに「マッチし た度合い」を期待できるのかが、ドキュメントを見たかぎりではよく分からな かったのです。 > で、スコアは「マッチした度合い」(求める文書に近い度合い)だ > と思います。そして、それは絶対的な値であることが重要ではなく、 > 相対的な値であることが重要だと思います。例えば、文書Aのスコ > アが10で、文書Bのスコアが5であることが重要なのでなく、文書A > の方が文書Bよりも求める文書に近そうだ、ということが重要だと > いうことです。 (snip) >> それでも、Mroongaのboolean modeでは「各キーワードが出現した数の合計、た >> だしANDやNOT等の条件を満たさない場合は無条件にゼロ」みたいに何らかの仕様 >> が明記してあると安心して利用できる気がします。もちろん、「0かそうでない >> か以上の意味は期待できない」という仕様もありでしょう。その場合は、「じゃ >> あ、ソートしなくていいね」という判断ができますし。 > > スコアは求める文書に近い度合いなのでソートする意味があります。 スコアは相対的な大小がより重要、ということも分かっていますが、それなら、 'word1 word2 *S"this is a pen"' in boolean mode みたいなクエリで、*S"..."の結果だけが突出して高い値を持ってしまって、 word1とかword2はあってもなくても関係なくなってしまうのは「求める文書に近 い度合い」的にOKなのでしょうか? 個人的にはそういう混在した使い方はたぶんしないので別にかまわないのです が、仕様としてそういう混在がありで、スコアは「求める文書に近い度合い」を 表すということであれば、類似度検索のスコア部分については「上位N個のトー クンの重みの最高値か最低値か平均値かなにかで割る」くらいの処理をしたほう がいいように思いますが、どうでしょうか? 類似度検索じゃない部分のboolean modeでのスコアについては「各キーワードが 出現した数の合計、ただしANDやNOT等の条件を満たさない場合は無条件にゼロ」 みたいな仕様っぽいので、MyISAMのboolean modeと比べると、文書中の出現数に よってスコアが増える分、より「文書に近い度合い」と言えるのかなという感想 ですが、その仕様の理解であっていますか? (あっていたら、ドキュメントに 書きたいので)。 > こっちも、かずひこさんの考えが発散しちゃっているのかなぁと思 > いました。「いい感じのスコアでソート」を考えるならやっぱり > 「いい感じはこういうこと」というのを決めないと評価できないと > 思います。 > > それはそれとして、気になったんですけど、NATURAL LANGUAGE > MODEをキーワードを突っ込む感じで使おうとしています?それは期 > 待した使い方と違うんじゃないかと思いました。NATURAL LANGUAGE > MODEというだけあって、普通の文章を突っ込むものだと思うんです > よ、これ。 > > I want to do full-text search in MySQL > > みたいに普通の文章を突っ込んでそれと似たような文書を探すもの > じゃないですかねぇ。 「いい感じ」というかスコアについては、TF-IDFでかまわないのですが、それな らそれで、「7単語までのクエリは実際は1単語の分しか検索しない」という挙動 は困るのだけれど、他の人は困っていないの? というのが出発点でした。 そして、NATURAL LANGUAGE MODEには普通の文章をつっこむものだというのは分 かっていますが、うろおぼえの複数のキーワードで検索して、結果のスコアが TF-IDFで重み付けされているほうが'word1 OR word2' in boolean modeより嬉し い、という使い方をしたいのです。 かずひこ