佐藤
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