[groonga-dev,00443] Re: ()~:+><-* などの記号を含んだ文字の検索について

Back to archive index

佐藤 yfa02****@nifty*****
2011年 1月 26日 (水) 18:03:30 JST


しまむら様、須藤様

お世話になっております、佐藤です。

インフルエンザにより倒れていたため、お返事が遅くなりました。
誠に申し訳ございません。


シングルクオート内でダブルクオートを利用して文字列をクオートすることで検索する
ことができる旨、
了解いたしました。
手元の環境でも無事動作を確認しました。
ありがとうございました。

> 須藤様(もしご覧になられていれば)
rroongaで利用するにあたっては、そのままではシングルクオートではくくれないため
、
手元で以下のようにモンキーパッチを当てて運用しております。
rroonga本体でもシングルクオートにご対応頂けたらとても助かります。
よろしくお願い致します。

==============

class Groonga::Context::SelectCommand
  def query
    if****@table*****_a?(String)
      table_name = @table
    else
      table_name =****@table*****
    end
    _query = "select #{table_name}"
    @options.each do |key, value|
      value = value.join(", ") if value.is_a?(::Array)
      escaped_value = value.to_s.gsub(/(["'])/){"\\" + $1}
      if key == 'query' then                     
        _query << " --#{key} '\"#{escaped_value}\"'"
      else
        _query << " --#{key} \"#{escaped_value}\""
      end
    end
    _query
  end
end

==============

----- Original Message -----
>Date: Sat, 15 Jan 2011 00:06:32 +0900
>From: Yutaro Shimamura <yu****@irx*****>
>To: 全文検索エンジンGroonga開発メーリングリスト <groon****@lists*****
e.jp>
>Subject: [groonga-dev,00442] Re:
> ()~:+><-* などの記号を含んだ文字の検索について
>
>
>
>佐藤さま
>
>しまむらです。
>
>エスケープについてなのですが、文字列としてダブルクオートで囲うことにより利用
することが可能です。
>
>ドキュメントのチュートリアルデータを参考に、以下の挙動になります。
>http://groonga.org/docs/tutorial/tutorial10.html
>
>
>囲わない場合(佐藤さまの利用方法の場合)、syntax errorとなってしまいますが、
>
>  > select --table Comments --output_columns "comment,_score" --query "commen
t:@("
>    [[-63,1295017293.32507,0.000623724,"Syntax error! (comment:@()",[["yy_syn
tax_error","ecmascript.y",19]]],[]]
>
>
>このように、シングルクオート内でダブルクオートを利用して文字列をクオートする
ことで検索することができます。
>
>  > select --table Comments --output_columns "comment,_score" --query 'commen
t:@"("'
>    [[0,1295017103.31636,0.000433497],[[[2],[["comment","ShortText"],["_score
","Int32"]],["マイクロブログ作ってみました(甘栗むいちゃいました的な感じで)。
",1],["@daijiro @tasukuchan ( 登録してみましたよー!",1]]]]
>
>
>また、クエリ文字列自体をダブルクオート内で表記して検索できます。
>  > select --table Comments --output_columns "comment,_score" --query 'commen
t:@"(甘"'
>    [[0,1295017165.62638,0.000138811],[[[2],[["comment","ShortText"],["_score
","Int32"]],["マイクロブログ作ってみました(甘栗むいちゃいました的な感じで)。
",1],["@daijiro @tasukuchan ( 登録してみましたよー!",1]]]]
>
>
>
>上記ではシングルクオート内で囲って表現していますが、
>  "\"(\""
>このようにダブルクオートをエスケープすることでも大丈夫です。
>
>
>どうぞよろしくお願いいたします。
>
>
>On Fri, 14 Jan 2011 22:40:37 +0900 (JST)
>佐藤 <yfa02****@nifty*****> wrote:
>
>> お世話になっております、佐藤です。
>> 
>> 表題の通り、()~:+><-*などの記号を含んだ文字を検索すると、エラーが返ってきま
す
>>>> 多分エスケープをしないといけないだろうと思うのですが、具体的にはどのように
エス
>> ケープ処理等をすればいいのでしょうか。
>> 
>> 具体的には以下のようなクエリーをgroongaコマンド経由で実行するとエラーが返っ
て
>> きました。
>> 
>> select Entries --match_columns "body" --limit "10" --query "(" --offset "0"
>> 
>> [[-63,1295012241.02491,0.000546,"Syntax error! (()",[["yy_syntax_error","ec
mas
>> cript.y",19]]],[]]
>> 
>> ちなみに、実際に利用する際には、rroonga経由で以下のように利用したいと考えて
お
>> ります。
>> 
>> GroongaBase.groonga_context.select("Entries",
>>                            :match_columns => "body",
>>                            :query => query,
>>                            :limit => per_page,
>>                            :offset => per_page * (page - 1)
>>                           )
>> 
>> 
>> よろしくお願いします。
>> 
>> _______________________________________________
>> groonga-dev mailing list
>> groon****@lists*****
>> http://lists.sourceforge.jp/mailman/listinfo/groonga-dev
>
>_______________________________________________
>groonga-dev mailing list
>groon****@lists*****
>http://lists.sourceforge.jp/mailman/listinfo/groonga-dev




groonga-dev メーリングリストの案内
Back to archive index