HAYASHI Kentaro
null+****@clear*****
Wed Nov 28 16:21:55 JST 2012
HAYASHI Kentaro 2012-11-28 16:21:55 +0900 (Wed, 28 Nov 2012) New Revision: 844612476a18d01350a1e33bdb28574d7ba924ec https://github.com/groonga/groonga.github.com/commit/844612476a18d01350a1e33bdb28574d7ba924ec Log: doc: add 2.0.9 release entry Added files: en/_posts/2012-11-29-release.textile ja/_posts/2012-11-29-release.textile Added: en/_posts/2012-11-29-release.textile (+283 -0) 100644 =================================================================== --- /dev/null +++ en/_posts/2012-11-29-release.textile 2012-11-28 16:21:55 +0900 (902e50a) @@ -0,0 +1,283 @@ +--- +layout: post.en +title: Groonga 2.0.9 has been released +description: Groonga 2.0.9 has been released! +publish: false +--- + +h2. Groonga 2.0.9 has been released + +"Groonga 2.0.9":/docs/news.html#release-2-0-9 has been released! + +How to install: "Install":/docs/install.html + +There are four topics for this release. + +* Supported snippet_html() function +* Supported nested index search among related table by column index +* Supported range search by using index +* Supported calculation across meridian, equator, the date line by geo_distance() function + +h3. Supported snippet_html() function + +This release began to support snippet_html() function which extract keyword and surrounding text. +Note that this is experimentally supported API, so this API would be changed in the future. + +Use snippet_html() fuction following syntax: + +<pre> + snippet_html(column name) +</pre> + +Here is the more concrete example. + +Schema definition: + +<pre> + table_create Documents TABLE_NO_KEY + column_create Documents content COLUMN_SCALAR Text + table_create Terms TABLE_PAT_KEY|KEY_NORMALIZE ShortText --default_tokenizer TokenBigram + column_create Terms documents_content_index COLUMN_INDEX|WITH_POSITION Documents content +</pre> + +Sample data: + +<pre> + load --table Documents + [ + ["content"], + ["Groonga is a fast and accurate full text search engine based on inverted index."], + ["Groonga is also a column-oriented database management system (DBMS)."], + ["Mroonga was called groonga storage engine."] + ] +</pre> + +If you want to search 'groonga' and extract 'groonga' and surrounding text from Documents +table, try following: + +Here is the query to search 'groonga' with snippet_html function. + +<pre> + select Documents --output_columns "snippet_html(content)" --command_version 2 --match_columns content --query "groonga" + [ + [0,1353893385.5454,0.000486850738525391], + [ + [ + [3], + [["snippet_html","null"]], + [["<span class=\"keyword\">Groonga</span> is a fast and accurate full text search engine based on inverted index."]], + [["<span class=\"keyword\">Groonga</span> is also a column-oriented database management system (DBMS)."]], + [["Mroonga was called <span class=\"keyword\">groonga</span> storage engine."]] + ] + ] + ] +</pre> + +As a result, specified keyword is surrounded by @<span>@ tag, and keyword 'groonga' and surrounding text is extracted like a highlighted search results. + +Note that you need to specify @'--command_version 2'@ in the query. +The reason why function call in @--output_column@ has supported from version 2.0.9. + +See following documentation about "snippet_html":http://groonga.org/docs/reference/functions/snippet_html.html details. + + +h3. Supported nested index search among related table by column index + +This release began to support nested index search among related table by column index. + +If there are relationships among multiple table with column index, you can search multiple table by specifing column index name. + +Here is the concrete example. + +there are tables which store blog articles, comments for articles. The table which stores articles has columns for article and comment, and the comment column refers comments table. +The table which stores comments has columns for comment and column index to article table. + +In the previous release of groonga, if you want to search the articles which contain specified keyword in comment, you need to execute fulltext search for table of comment, then search the records which contains fulltext search results. + +Now, you can search the records by specifing the refererence column index at once. + +here is the sample how to use this feature. + +Schema definition: + +<pre> + table_create Comments TABLE_HASH_KEY UInt32 + column_create Comments content COLUMN_SCALAR ShortText + + table_create Articles TABLE_NO_KEY + column_create Articles content COLUMN_SCALAR Text + column_create Articles comment COLUMN_SCALAR Comments + + table_create Lexicon TABLE_PAT_KEY|KEY_NORMALIZE ShortText --default_tokenizer TokenBigram + column_create Lexicon articles_content COLUMN_INDEX|WITH_POSITION Articles content + column_create Lexicon comments_content COLUMN_INDEX|WITH_POSITION Comments content + + column_create Comments article COLUMN_INDEX Articles comment +</pre> + +Sample data: + +<pre> + load --table Comments + [ + {"_key": 1, "content": "I'm using groonga too!"}, + {"_key": 2, "content": "I'm using groonga and mroonga!"}, + {"_key": 3, "content": "I'm using mroonga too!"} + ] + + load --table Articles + [ + {"content": "Groonga is fast!", "comment": 1}, + {"content": "Groonga is useful!"}, + {"content": "Mroonga is fast!", "comment": 3} + ] +</pre> + +You can write the query that search the records which contains specified keyword as a comment, then fetch the articles which refers to it. + +<pre> + select Articles --match_columns comment.content --query groonga --output_columns "_id, _score, *" +</pre> + +You need to concatinate comment column of articles table and content column of comments table with period(.) as @--match_columns@ arguments. + +At first, this query execute fulltext search from content of comments table, then fetch the records of articles table which refers to already searched records of comments table. +(Because of this, if you comment out the query which create column index 'article' of comments table, you can't get intended search results.) + +<pre> + [ + [0,1353903149.81632,0.000459432601928711], + [ + [ + [1], + [["_id","UInt32"],["_score","Int32"],["comment","Comments"],["content","Text"]], + [1,1,1,"Groonga is fast!"] + ] + ] + ] +</pre> + +Now, you can search articles which contains specific keywords as a comment. + +h3. Supported range search by using index + +This release began to support range search by using index. +For example, you can search date after the specified one for the column which stores the value of Time type. + +Here is the sample how to use this feature. + +Schema definition: + +<pre> + table_create Users TABLE_HASH_KEY ShortText + column_create Users birthday COLUMN_SCALAR Time + table_create Birthdays TABLE_PAT_KEY Time + column_create Birthdays users_birthday COLUMN_INDEX Users birthday +</pre> + +Sample data: + +<pre> + load --table Users + [ + {"_key": "Alice", "birthday": "1992-02-09 00:00:00"}, + {"_key": "Bob", "birthday": "1988-01-04 00:00:00"}, + {"_key": "Carlos", "birthday": "1982-12-29 00:00:00"} + ] +</pre> + +Now, registered birthdays, you can search date after the specified one. + +Here is the sample query to search person who is younger than Bob. + +In range search, you can specify 'younger' expression as 'birthday > "1988-01-04 00:00:00"' in this case. + +Here is concrete example. + +<pre> + select Users --filter 'birthday > "1988-01-04 00:00:00"' + [ + [0,1354069642.52512,0.000299692153930664], + [ + [ + [1], + [ + ["_id","UInt32"], + ["_key","ShortText"], + ["birthday","Time"] + ], + [1,"Alice",697561200.0] + ] + ] + ] +</pre> + +Alice is the only person who is younger than Bob, you see that search results is valid. + +In range search, you can specify @>@, @<@, @>=@, @<=@ operators. + +h3. Supported calculation across meridian, equator, the date line by geo_distance() function + +This release began to support calculation of the value of distance across meridian, equator, the date line by geo_distance() function. + +This functional enhancement is applied to the case which the way to approximate is 'rectangle'. + +There are some calculation method how to approximate the value of distance. + +Groonga supports folowing three method which has trade-offs in point of view of speed, acculacy. + +* "Rectangle":http://groonga.org/docs/reference/functions/geo_distance.html#rectangle + This regards geographical feature between specified points as level surface. + You can calculate the value of distance fast, but the error of distance increases as it approaches the pole. + +* "Sphere":http://groonga.org/docs/reference/functions/geo_distance.html#sphere + This regards geographical feature between specified points as spherical surface. + It is slower than rectangle, but the error of distance becomes smaller than rectangle. + +* "Ellipsoid":http://groonga.org/docs/reference/functions/geo_distance.html#ellipsoid + This regards geographical feature between specified points as ellipsoid. + It is slower than sphere, but the error of distance becomes smaller than sphere. + +Here is the sample how to caluculate the value of distance across meridian. + +This sample shows the value of distance between Paris(France) to Madrid(Spain). The geographical feature is approximated as level surface (rectangle). + +"175904000x8464000" means Paris(France) expressed in milliseconds. "145508000x-13291000" means Madrid(Spain) expressed in milliseconds. + +<pre> + select Geo --output_columns distance --scorer 'distance = geo_distance("175904000x8464000", "145508000x-13291000", "rectangle")' + [ + [ + 0, + 1337566253.89858, + 0.000355720520019531 + ], + [ + [ + [ + 1 + ], + [ + [ + "distance", + "Int32" + ] + ], + [ + 1051293 + ] + ] + ] + ] +</pre> + +See following documentation how to express "longitude and latitude in milliseconds":http://groonga.org/docs/reference/type.html + +See following documentation how to use "geo_distance":http://groonga.org/docs/reference/functions/geo_distance.html + + +h3. Conclusion + +See "Release 2.0.9 2012/11/29":/docs/news.html#release-2-0-9 about detailed changes since 2.0.8. + +Let's search by groonga! Added: ja/_posts/2012-11-29-release.textile (+275 -0) 100644 =================================================================== --- /dev/null +++ ja/_posts/2012-11-29-release.textile 2012-11-28 16:21:55 +0900 (f2918b4) @@ -0,0 +1,275 @@ +--- +layout: post.ja +title: groonga 2.0.9リリース +description: groonga 2.0.9をリリースしました! +published: false +--- + +今日は "groonga勉強会「全文検索エンジンgroongaを囲む夕べ 3」":http://atnd.org/events/33070 の当日ですね。 + +h2. groonga 2.0.9リリース + +"groonga 2.0.9":/ja/docs/news.html#release-2-0-9 をリリースしました! + +今回のリリースの主なトピックは4つあります。 + +* snippet_html()関数の実験的なサポート +* インデックスにより関連付けられたテーブル間のネストしたインデックス検索のサポート +* 指定範囲の検索をサポート +* geo_distance()関数で矩形近似により境界をまたぐ二点間の距離計算をサポート + +それぞれの環境毎のインストール方法: "インストール":/ja/docs/install.html + +h3. snippet_html()関数の実験的なサポート + +今回のリリースでは、実験的ではありますが、キーワードとその周辺のテキストを抽出するためのsnippet_html()関数をサポートしました。 +あくまで実験的なので今後予告なく変更する可能性があります。 + +snippet_html()関数は以下のような構文で使用します。 + +<pre> + snippet_html(column名) +</pre> + +どんな風に使えるかを具体例で説明します。以下は説明のためのスキーマ定義とサンプルデータです。 + +<pre> + table_create Documents TABLE_NO_KEY + column_create Documents content COLUMN_SCALAR Text + table_create Terms TABLE_PAT_KEY|KEY_NORMALIZE ShortText --default_tokenizer TokenBigram + column_create Terms documents_content_index COLUMN_INDEX|WITH_POSITION Documents content + + load --table Documents + [ + ["content"], + ["Groonga is a fast and accurate full text search engine based on inverted index."], + ["Groonga is also a column-oriented database management system (DBMS)."], + ["Mroonga was called groonga storage engine."] + ] +</pre> + +Documentsテーブルに登録したデータからキーワードgroongaを含むテキストを抽出するには以下のクエリを実行します。 + +<pre> + select Documents --output_columns "snippet_html(content)" --command_version 2 --match_columns content --query "groonga" +</pre> + +上記クエリでは検索したいキーワードgroongaを @--query@ に指定し、検索対象のカラムには @--match_columns content@ としてDocumentテーブルのcontentカラムを指定します。 + +このとき、クエリにコマンドバージョン(@--command_version 2@)を指定する必要があります。これは、 @--ouput_columns@ で関数を呼びだすことができるようになったのは2.0.9からだからです。 + +結果は以下のようになり、指定したキーワードが @<span>@ タグで囲まれ、キーワード周辺のテキストとして抽出できていることがわかります。 + +検索結果のキーワードをハイライト表示したいときに便利な機能です。 + +<pre> + [ + [0,1353893385.5454,0.000486850738525391], + [ + [ + [3], + [["snippet_html","null"]], + [["<span class=\"keyword\">Groonga</span> is a fast and accurate full text search engine based on inverted index."]], + [["<span class=\"keyword\">Groonga</span> is also a column-oriented database management system (DBMS)."]], + [["Mroonga was called <span class=\"keyword\">groonga</span> storage engine."]] + ] + ] + ] +</pre> + +関数の詳細については "snippet_html()":http://groonga.org/ja/docs/reference/functions/snippet_html.html を参照してください。 + +h3. インデックスにより関連付けられたテーブル間のネストしたインデックス検索のサポート + +今回のリリースでは複数のテーブルの間でインデックスが張られているなど、テーブル間の関連が存在する場合にインデックス名をネストして指定することで複数テーブルからまとめて検索することができるようになりました。 + +これだけだとわかりにくいので、例を示します。 + +ブログ記事を格納してるテーブルと記事に対するコメントを格納するテーブルがあるとします。 + +記事を格納しているテーブルには記事そのもののカラムとコメントテーブルを参照するカラムがあり、コメントテーブルにはコメントを格納するカラムと、記事テーブルへのインデックスカラムがあるとします。 + +これまで特定のキーワードをコメントに含む記事を探すには、コメントテーブルの全文検索と、その全文検索結果から該当記事を検索する必要がありました。 + +これが、参照先のインデックスカラムを指定することでまとめて検索できるようになりました。 + +どう使うかのサンプルを以下で示します。 + +サンプルのスキーマ定義は以下の通りです。 + +<pre> + table_create Comments TABLE_HASH_KEY UInt32 + column_create Comments content COLUMN_SCALAR ShortText + + table_create Articles TABLE_NO_KEY + column_create Articles content COLUMN_SCALAR Text + column_create Articles comment COLUMN_SCALAR Comments + + table_create Lexicon TABLE_PAT_KEY|KEY_NORMALIZE ShortText --default_tokenizer TokenBigram + column_create Lexicon articles_content COLUMN_INDEX|WITH_POSITION Articles content + column_create Lexicon comments_content COLUMN_INDEX|WITH_POSITION Comments content + + column_create Comments article COLUMN_INDEX Articles comment +</pre> + +記事とコメントのサンプルデータは以下のようにして登録します。 + +<pre> + load --table Comments + [ + {"_key": 1, "content": "I'm using groonga too!"}, + {"_key": 2, "content": "I'm using groonga and mroonga!"}, + {"_key": 3, "content": "I'm using mroonga too!"} + ] + + load --table Articles + [ + {"content": "Groonga is fast!", "comment": 1}, + {"content": "Groonga is useful!"}, + {"content": "Mroonga is fast!", "comment": 3} + ] +</pre> + +コメントテーブルから指定したキーワードを含むレコードを検索し、そのコメントのレコードを参照しているカラムの記事データを取得するクエリは以下のように書くことができます。 + +<pre> + select Articles --match_columns comment.content --query groonga --output_columns "_id, _score, *" +</pre> + + �� --match_columns@ にはArticlesテーブルのcommentカラムとCommentsテーブルのcontentカラムとをピリオドで連結して指定します。 + +するとCommentsテーブルのcontentカラムをまずはじめに全文検索し、該当するレコードを参照しているArticlesのcommentカラムのレコードを取得できる仕組みになっています。 +(そのため、上記スキーマ定義でCommentsテーブルにインデックスカラムarticleがない場合、CommentsテーブルからArticlesテーブルを辿れないので正しい結果が得られません。) + +<pre> + [ + [0,1353903149.81632,0.000459432601928711], + [ + [ + [1], + [["_id","UInt32"],["_score","Int32"],["comment","Comments"],["content","Text"]], + [1,1,1,"Groonga is fast!"] + ] + ] + ] +</pre> + +従来から可能であった特定のキーワードを含む記事の全文検索だけでなく、特定のキーワード(上記の場合はgroonga)を含むコメントを参照している記事を取得することができるようになりました。 + +h3. 指定範囲の検索をサポート + +今回のリリースでは、範囲を指定した検索を行えるようになりました。 + +例えば、Time型のカラムで指定した日以前の結果を検索することができるようになりました。 + +どう使うかのサンプルを誕生日を例に示します。 + +サンプルのスキーマ定義は以下の通りです。 + +<pre> + table_create Users TABLE_HASH_KEY ShortText + column_create Users birthday COLUMN_SCALAR Time + table_create Birthdays TABLE_PAT_KEY Time + column_create Birthdays users_birthday COLUMN_INDEX Users birthday +</pre> + +以下のように個人の誕生日を登録します。 + +<pre> + load --table Users + [ + {"_key": "Alice", "birthday": "1992-02-09 00:00:00"}, + {"_key": "Bob", "birthday": "1988-01-04 00:00:00"}, + {"_key": "Carlos", "birthday": "1982-12-29 00:00:00"} + ] +</pre> + +誕生日のデータを登録できたので、実際に検索してみます。ここでは、Bobの誕生日より後の誕生日の人を検索してみます。 + +誕生日はTime型のカラムに登録してあるので、範囲の指定にはbirthdayに対してBobの誕生日より後というのを @'birthday > "1988-01-04 00:00:00"'@ として表現します。 + +実際の検索結果は以下のようになります。 + +<pre> + select Users --filter 'birthday > "1988-01-04 00:00:00"' + [ + [0,1354069642.52512,0.000299692153930664], + [ + [ + [1], + [ + ["_id","UInt32"], + ["_key","ShortText"], + ["birthday","Time"] + ], + [1,"Alice",697561200.0] + ] + ] + ] +</pre> + +Bobより後の誕生日は、Aliceだけなので正しく検索できていることがわかります。範囲検索では、不等号( @>,<,<=,>=@ )が使えます。 + +h3. geo_distance()関数で矩形近似により境界をまたぐ二点間の距離計算をサポート + +今回のリリースでは、geo_distance()関数で子午線や日付変更線、赤道といった境界をまたいだ場合での任意の二点間の距離計算をサポートしました。 + +距離の近似方法にはいくつかやりかたがあります。groongaではgeo_distance関数において以下の近似方法をサポートしています。 +それぞれ、速度や正確さにトレードオフが存在します。 + +* "矩形近似":http://groonga.org/ja/docs/reference/functions/geo_distance.html#rectangle + 二点間の地形を平面とみなして計算します。 + 最も高速に距離を計算できますが、二点間の距離が離れると正確に計算できません。 + +* "球面近似":http://groonga.org/ja/docs/reference/functions/geo_distance.html#sphere + 二点間の地形を球面とみなして計算します。 + 矩形近似より遅くなりますが、より正確に距離を計算できます。 + +* "楕円近似":http://groonga.org/ja/docs/reference/functions/geo_distance.html#ellipsoid + 二点間の地形を楕円体とみなして計算します。 + 球面近似より遅くなりますが、より正確に距離を計算できます。 + +今回の機能追加は近似方法として矩形近似を選択した場合に有効です。 + +実際に、子午線をまたいで二点間の距離を計算するサンプルを紹介します。 + +以下のサンプルではパリ(フランス)からマドリード(スペイン)の距離を矩形近似で計算しています。 + +"175904000x8464000"と表記されているのがパリ(フランス)のミリ秒表記で、"145508000x-13291000"がマドリード(スペイン)のミリ秒表記です。 + +<pre> + select Geo --output_columns distance --scorer 'distance = geo_distance("175904000x8464000", "145508000x-13291000", "rectangle")' + [ + [ + 0, + 1337566253.89858, + 0.000355720520019531 + ], + [ + [ + [ + 1 + ], + [ + [ + "distance", + "Int32" + ] + ], + [ + 1051293 + ] + ] + ] + ] +</pre> + +ある点の経緯度をどのようにミリ秒表記で表わすかについては、 "組込型":http://groonga.org/ja/docs/reference/type.html に詳細を記載してあります。 + +関数の詳しい使いかたについては "geo_distance":http://groonga.org/ja/docs/reference/functions/geo_distance.html#ellipsoid のドキュメントを参照してください。 + +h3. さいごに + +2.0.8からの詳細な変更点は "2.0.9リリース 2012/11/29":/ja/docs/news.html#release-2-0-9 を確認してください。 + +それでは、groongaでガンガン検索してください! -------------- next part -------------- HTML����������������������������... Télécharger