null+****@clear*****
null+****@clear*****
2010年 9月 17日 (金) 19:19:11 JST
Kouhei Sutou 2010-09-17 10:19:11 +0000 (Fri, 17 Sep 2010) New Revision: 020b949a792d84057a1906a9c55037fb92bdaeba Log: add a document about search. (paritally) Added files: doc/ja/source/search.txt Added: doc/ja/source/search.txt (+81 -0) 100644 =================================================================== --- /dev/null +++ doc/ja/source/search.txt 2010-09-17 10:19:11 +0000 (2ec8b16) @@ -0,0 +1,81 @@ +.. highlightlang:: none + +.. _search: + +検索 +==== + +ref:`select` コマンドがqueryパラメータを使ってどのように検索するのかを説明します。 + +検索の挙動 +---------- + +検索の挙動には以下の3種類あり、検索結果によって動的に使い分けています。 + +1. 完全一致検索 +2. 非わかち書き検索 +3. 部分一致検索 + +どのように検索の挙動を使い分けているかを説明する前に、まず、それぞれの検索の挙動を説明します。 + +完全一致検索 +++++++++++++ + +完全一致検索はキーワードに完全一致するレコードを検索します。 + +例えば、「bill」というキーワードで検索した場合、「bill」はヒットしますが、「billiard」はヒットしません。 + +非わかち書き検索 +++++++++++++++++ + +非わかち書き検索はパトリシア木で語彙表を構築している場合のみ利用可能です。 + +非わかち書き検索の挙動はTokenBigramなどN-gram系のトークナイザーを利用している場合とTokenMecabトークナイザーを利用しようしている場合で挙動が変わります。 + +N-gram系のトークナイザーを利用している場合はキーワードで前方一致検索をします。 + +例えば、「bill」というキーワードで検索した場合、「bill」も「billiard」もヒットします。 + +TokenMeCabトークナイザーの場合はわかち書き前のキーワードで前方一致検索をします。 + +例えば、「スープカレー」というキーワードで検索した場合、「スープカレーバー」(1単語扱い)にヒットしますが、「スープカレー」("スープ"と"カレー"の2単語扱い)や「スープカレーライス」("スープ"と"カレーライス"の2単語扱い)にはヒットしません。 + +部分一致検索 +++++++++++++ + +部分一致検索はパトリシア木で語彙表を構築していて、かつ、KEY_WITH_SISオプションを指定している場合のみ利用可能です。KEY_WITH_SISオプションが指定されていない場合は非わかち書き検索と同等です。 + +部分一致検索の挙動はTokenBigramなどN-gram系のトークナイザーを利用している場合とTokenMecabトークナイザーを利用しようしている場合で挙動が変わります。 + +Bigramの場合は前方一致検索と中間一致検索と後方一致検索を行います。 + +例えば、「ill」というキーワードで検索した場合、「bill」も「billiard」もヒットします。 + +TokenMeCabトークナイザーの場合はわかち書き後のキーワードで前方一致検索と中間一致検索と後方一致検索をします。 + +例えば、「スープカレー」というキーワードで検索した場合、「スープカレー」("スープ"と"カレー"の2単語扱い)や「スープカレーライス」("スープ"と"カレーライス"の2単語扱い)、「スープカレーバー」(1単語扱い)にもヒットします。 + + +検索の使い分け +-------------- + +基本的に完全一致検索のみを行います。完全一致検索で1件もヒットしない場合に限り、非わかち書き検索を行い、それでも1件もヒットしない場合は部分一致検索を行います。 + +ただし、すでに検索結果セットが存在する場合はたとえ1件もヒットしなくても完全一致検索のみを行います。 + +例えば、以下のようなクエリの場合は、それぞれの検索で1件もヒットしない場合は完全一致検索、非わかち書き検索、部分一致検索を順に行います。 + + select Shops --match_column description --query スープカレー + +しかし、以下のように全文検索を行う前に検索結果セットが存在する場合は完全一致検索のみを行います。(point > 3で1件以上ヒットしている場合) + + select Shops --filter '"point > 3 && description @ \"スープカレー\""' + +そのため、descriptionに「スープカレーライス」が含まれていても、「スープカレーライス」は「スープカレー」に完全一致しないのでヒットしません。 + + +問題 +---- + +対策 +----