BloGroonga

2021-03-31

Groonga 11.0.1リリース

Groonga 11.0.1をリリースしました!

それぞれの環境毎のインストール方法: インストール

変更内容

主な変更点は以下の通りです。

改良

  • Debian GNU/Linux ARM64向けのパッケージをサポートしました。

  • select キーワードごとに重みをカスタマイズできるようにしました。

    • 今まで、スコアーを調整するには、すべてのキーワードに対して <> を指定する必要がありました。デフォルトのスコアの重み(1)より、デフォルトの重みの調整量(6 または 4)のほうが大きいためです。
    • 例えば、 A <B では、 "A" の重みは1、 "B" の重みは4になります。デクリメントされていない "A" の重み(1)より、デクリメントされた "B" の重み(4)のほうが大きくなります。これは、期待した動作ではありません。"B" に "A" より小さい重みを使うためには、 >A <B と指定する必要があります。 >A <B では、 "A" の重みは6、 "B" の重みは4になります。
    • 今回のリリースから、対象のキーワードに <${WEIGHT} または >${WEIGHT} と指定するだけで、キーワードごとに重みの調整量をカスタマイズできます。例えば、 A <0.1B では、 "A" の重みは1、 "B" の重みは0.9になります。("B" の重みを0.1デクリメントしています。)
    • ただし、これらの形式( >${WEIGHT}...<${WEIGHT}...~${WEIGHT}... )は互換性が無いことに注意してください。
  • select Apache Arrow形式で FloatFloat32 の値を出力できるようにしました。

  • select 結果出力時に、インデックスカラム経由で参照先のデータを取得できるようになりました。

    • 今までは、 出力値に index_column.xxx のように指定すると、Groongaは意図しない値を返していました。例えば以下の例では、 --columns[tags].value purchases.tag の値は、 ["apple",["many"]],["banana",["man"]],["cacao",["man"]] になりました。このケースでは、期待される値は、 ["apple",["man","many"]],["banana",["man"]],["cacao",["woman"]] でした。今回のリリースから、以下のように、インデックスカラム経由で参照先の正しい値を取得できます。

      table_create Products TABLE_PAT_KEY ShortText
      
      table_create Purchases TABLE_NO_KEY
      column_create Purchases product COLUMN_SCALAR Products
      column_create Purchases tag COLUMN_SCALAR ShortText
      
      column_create Products purchases COLUMN_INDEX Purchases product
      
      load --table Products
      [
      {"_key": "apple"},
      {"_key": "banana"},
      {"_key": "cacao"}
      ]
      
      load --table Purchases
      [
      {"product": "apple",  "tag": "man"},
      {"product": "banana", "tag": "man"},
      {"product": "cacao",  "tag": "woman"},
      {"product": "apple",  "tag": "many"}
      ]
      
      select Products \
        --columns[tags].stage output \
        --columns[tags].flags COLUMN_VECTOR \
        --columns[tags].type ShortText \
        --columns[tags].value purchases.tag \
        --output_columns _key,tags
      [
        [
          0,
          0.0,
          0.0
        ],
        [
          [
            [
              3
            ],
            [
              [
                "_key",
                "ShortText"
              ],
              [
                "tags",
                "ShortText"
              ]
            ],
            [
              "apple",
              [
                "man",
                "many"
              ]
            ],
            [
              "banana",
              [
                "man"
              ]
            ],
            [
              "cacao",
              [
                "woman"
              ]
            ]
          ]
        ]
      ]
      
  • select ネストされたインデックスの一部として直接インデックスカラムを指定できるようになりました。

    • index_column.except_source_column を使ってフィルター後にソーステーブルを検索できます。例えば、以下の例では、検索時に comments.content を指定しています。この場合、最初に、このクエリは Comments テーブルの content カラムを全文検索し、次に Comments テーブルを検索した結果のレコードを参照する Articles テーブルのレコードを取得します。

      table_create Articles TABLE_HASH_KEY ShortText
      
      table_create Comments TABLE_NO_KEY
      column_create Comments article COLUMN_SCALAR Articles
      column_create Comments content COLUMN_SCALAR ShortText
      
      column_create Articles content COLUMN_SCALAR Text
      column_create Articles comments COLUMN_INDEX Comments article
      
      table_create Terms TABLE_PAT_KEY ShortText \
        --default_tokenizer TokenBigram \
        --normalizer NormalizerNFKC130
      column_create Terms articles_content COLUMN_INDEX|WITH_POSITION \
        Articles content
      column_create Terms comments_content COLUMN_INDEX|WITH_POSITION \
        Comments content
      
      load --table Articles
      [
      {"_key": "article-1", "content": "Groonga is fast!"},
      {"_key": "article-2", "content": "Groonga is useful!"},
      {"_key": "article-3", "content": "Mroonga is fast!"}
      ]
      
      load --table Comments
      [
      {"article": "article-1", "content": "I'm using Groonga too!"},
      {"article": "article-3", "content": "I'm using Mroonga!"},
      {"article": "article-1", "content": "I'm using PGroonga!"}
      ]
      
      select Articles --match_columns comments.content --query groonga \
        --output_columns "_key, _score, comments.content
      [
        [
          0,
          0.0,
          0.0
        ],
        [
          [
            [
              1
            ],
            [
              [
                "_key",
                "ShortText"
              ],
              [
                "_score",
                "Int32"
              ],
              [
                "comments.content",
                "ShortText"
              ]
            ],
            [
              "article-1",
              1,
              [
                "I'm using Groonga too!",
                "I'm using PGroonga!"
              ]
            ]
          ]
        ]
      ]
      
  • load オブジェクトリテラルを使って、参照先のレコードをロードできるようにしました。

    • 例えば、以下のように、 "key" : "[ { "key" : "value", ..., "key" : "value" } ]" のようなデータをロードできます。

      table_create Purchases TABLE_NO_KEY column_create Purchases item COLUMN_SCALAR ShortText column_create Purchases price COLUMN_SCALAR UInt32

      table_create Settlements TABLE_HASH_KEY ShortText column_create Settlements purchases COLUMN_VECTOR Purchases column_create Purchases settlements_purchases COLUMN_INDEX Settlements purchases

      load –table Settlements [ { "_key": "super market", "purchases": [ {"item": "apple", "price": 100}, {"item": "milk", "price": 200} ] }, { "_key": "shoes shop", "purchases": [ {"item": "sneakers", "price": 3000} ] } ] ```

    • この機能によって、参照カラムにJSONデータを追加しやすくなります。
    • 現状、この機能は、JSONの入力のみをサポートしています。
  • load JSON文字列で、参照先のレコードをロードできるようにしました。

    • 以下のように、JSONテキストを使ってソーステーブルから参照ベクターへデータをロードできます。

      table_create Purchases TABLE_HASH_KEY ShortText
      column_create Purchases item COLUMN_SCALAR ShortText
      column_create Purchases price COLUMN_SCALAR UInt32
      
      table_create Settlements TABLE_HASH_KEY ShortText
      column_create Settlements purchases COLUMN_VECTOR Purchases
      
      column_create Purchases settlements_purchases COLUMN_INDEX Settlements purchases
      
      load --table Settlements
      [
      {
        "_key": "super market",
        "purchases": "[{\"_key\": \"super market-1\", \"item\": \"apple\", \"price\": 100}, {\"_key\": \"super market-2\", \"item\": \"milk\",  \"price\": 200}]"
      },
      {
        "_key": "shoes shop",
        "purchases": "[{\"_key\": \"shoes shop-1\", \"item\": \"sneakers\", \"price\": 3000}]"
      }
      ]
      
      dump \
        --dump_plugins no \
        --dump_schema no
      load --table Purchases
      [
      ["_key","item","price"],
      ["super market-1","apple",100],
      ["super market-2","milk",200],
      ["shoes shop-1","sneakers",3000]
      ]
      
      load --table Settlements
      [
      ["_key","purchases"],
      ["super market",["super market-1","super market-2"]],
      ["shoes shop",["shoes shop-1"]]
      ]
      
      column_create Purchases settlements_purchases COLUMN_INDEX Settlements purchases
      
    • 現状、この機能は、ネストされた参照レコードをサポートしていません。

  • [Windows] time_classify_* 関数で UNIXエポック を扱えるようになりました。

  • query_parallel_or クエリーを並行して実行できる新しい関数を追加しました。

  • select 存在しないソートキーを無視するようにしました。

    • 今まで、存在しないソートキーを指定したとき、Groongaはエラーを出力していましたが、今回のリリースから存在しないソートキーを無視します。(エラーを出力しなくなります。)
    • この機能は、一貫性のために実装しています。 output_columns も無効な値を無視します。また、 sort_keys も無効な値のほとんどを無視します。
  • select drilldowns[].table で存在しないテーブルを無視します。

    • 今まで、 drilldowns[].table で存在しないテーブルを指定したとき、Groongaはエラーを出力していましたが、今回のリリースから存在しないテーブルを無視します。(エラーを出力しなくなります。)
    • この機能は、一貫性のために実装しています。 output_columns も無効な値を無視します。また、 sort_keys も無効な値のほとんどを無視します。
  • [httpd] バンドルしているnginxのバージョンを1.19.8に更新しました。

修正

  • reference_acquire 参照の自動リリースが発生する前に、テーブルにカラムが追加されテーブルの参照が獲得されたときにGroongaがクラッシュする問題を修正しました。

    • 追加されたカラムの参照は獲得されませんが、自動リリースの対象になるためです。
  • [Windows] 別のスレッドで、他のバックトレースロギングプロセスが動作しているときに、新しくバックトレースロギングプロセスが開始されると、1つ以上のプロセスがSEGVのバックトレースの出力に失敗する問題を修正しました。

既知の問題

  • 現在Groongaには、ベクターカラムに対してデータを大量に追加、削除、更新した際にデータが破損することがある問題があります。

さいごに

詳細については、以下のお知らせも参照してください。

お知らせ 11.0.1リリース

それでは、Groongaでガンガン検索してください!

2021-02-09

Groonga 11.0.0リリース

Groonga 11.0.0をリリースしました!

それぞれの環境毎のインストール方法: インストール

変更内容

主な変更点は以下の通りです。

  • select ネストされたインデックス経由でスカラーカラムとベクターカラムの値を出力できるようになりました。
    • ネストされたインデックスとは、以下のような構造です。

      table_create Products TABLE_PAT_KEY ShortText
      
      table_create Purchases TABLE_NO_KEY
      column_create Purchases product COLUMN_SCALAR Products
      column_create Purchases tag COLUMN_SCALAR ShortText
      
      column_create Products purchases COLUMN_INDEX Purchases product
      
    • 上記の例では、 Products.purchases カラムは Purchases.product カラムのインデックスです。また、 Purchases.product カラムは、 Products テーブルへの参照です。

  • [Windows] Linux上のMinGWを使ってクロスコンパイルしていたWindows向けパッケージの提供をやめました。

    • おそらく、ほとんどの人がこのパッケージを使っていないためです。
    • これからは、以下のパッケージを使用してください。

      • groonga-latest-x86-vs2019-with-vcruntime.zip
      • groonga-latest-x64-vs2019-with-vcruntime.zip
    • 既に Microsoft Visual C++ Runtime Library がインストール済みのシステムの場合は、以下のパッケージを使用してください。

      • groonga-latest-x86-vs2019.zip
      • groonga-latest-x64-vs2019.zip
  • インデックス内のデータを大量に追加、削除、更新した際にインデックスが破損することがある問題を修正しました。

    • この問題は、インデックス内のデータを大量に削除しただけでも発生します。ただ、インデックスにデータを追加しただけでは発生しません。
    • この問題によって破損したインデックスは、インデックスを再構築することで修復できます。
    • この問題は、壊れたインデックスを参照しない限り発覚しません。したがって、既にインデックスが破損しているかもしれません。
    • index_column_diff コマンドを使うことで、インデックスが破損しているかどうかを確認できます。

さいごに

詳細については、以下のお知らせも参照してください。

お知らせ 11.0.0リリース

それでは、Groongaでガンガン検索してください!

2021-01-25

Groonga 10.1.1リリース

Groonga 10.1.1をリリースしました!

それぞれの環境毎のインストール方法: インストール

変更内容

主な変更点は以下の通りです。

  • select Apache Arrow形式の出力でUInt64の値が出力できるようになりました。

  • select Apache Arrow形式の出力でヒット数を出力するようにしました。

  • select 前方一致検索のパフォーマンスを改善しました。

  • query query() で "order by estimated size" の最適化をサポートしました。

  • between パフォーマンスを改善しました。

  • TokenMecab トークンカラムを並列で構築する際のパフォーマンスを改善しました。

  • sub_filter slices[].filter 内で sub_filter が動作しない問題を修正しました。

  • ハッシュテーブルに対して、繰り返し大量のデータを追加、削除すると、Groongaがクラッシュしたり、データの追加ができなくなる可能性がある問題を修正しました。

さいごに

詳細については、以下のお知らせも参照してください。

お知らせ 10.1.1リリース

それでは、Groongaでガンガン検索してください!

2020-12-29

Groonga 10.1.0リリース

Groonga 10.1.0をリリースしました!

それぞれの環境毎のインストール方法: インストール

変更内容

主な変更点は以下の通りです。

  • highlight_html 全角スペースをハイライト対処から除外しました。

  • status 新しい項目 features を追加しました。

  • status 新しい項目 apache_arrow を追加しました。

  • ウインドウ関数 対象のテーブルがシャードをまたいでいる場合でも、全てのテーブルを一度に処理するようにしました。(実験的)

  • 参照カラムに対する検索でシーケンシャルサーチをサポートしました。

  • [tokenizers] TokenDocumentVectorTFIDFTokenDocumentVectorBM25 でトークンカラムをサポートしました。

  • 以下のケースのパフォーマンスを改善しました。

    • (column @ "value") && (column @ "value")
  • Ubuntu Ubuntu 20.10 (Groovy Gorilla)をサポートしました。

  • Debian stretchのサポートをやめました。

  • CentOS CentOS 6のサポートをやめました。

  • [httpd] バンドルしているnginxのバージョンを1.19.6に更新しました。

  • 複数のドリルダウンのキーと複数のアクセサーを使用した時にGroongaがクラッシュする問題を修正しました。

  • 同じフレーズが複数回出現すると、近傍フレーズ検索がマッチしない問題を修正しました。

さいごに

詳細については、以下のお知らせも参照してください。

お知らせ 10.1.0リリース

それでは、Groongaでガンガン検索してください!

2020-12-01

Groonga 10.0.9リリース

Groonga 10.0.9をリリースしました!

それぞれの環境毎のインストール方法: インストール

変更内容

主な変更点は以下の通りです。

  • select limit-1 を指定した時のパフォーマンスを改善しました。

  • reference_acquire 新しいオプション --auto_release_count を追加しました。

  • Groongaが空の vectoruvector を評価した時の動作を変更しました。

    • このリリースから、空の vectoruvector はcommand version 3では、 false と評価されます。
  • ノーマライザー Unicode 13.0 の NFKC(Normalization Form Compatibility Composition)をベースにしたノーマライザー NormalizerNFKC130 を追加しました。

  • トークンフィルター Unicode 13.0 の NFKC(Normalization Form Compatibility Composition)をベースにしたトークンフィルター NormalizerNFKC130 を追加しました。

  • select "_score = column - X" のパフォーマンスを改善しました。

  • reference_acquire --recursive dependent オプションを指定した時に必要のないインデックスカラムへの参照を取得しないように改善しました。

  • select 順序限定の近傍フレーズ検索をサポートしました。

    • 今までの近傍フレーズ検索は、指定したフレーズ間の距離が近いレコードのみを探していました。
    • この機能は、以下の条件を満たすレコードを探します。

      • 指定したフレーズ間の距離が近い場合。
      • 指定したフレーズが指定した順序で並んでいる場合。
  • Groonga HTTPサーバー Groonga HTTP server が全てのワーカースレッドの完全な終了を待たずに終了していた問題を修正しました。

  • [httpd] バンドルしているnginxのバージョンを1.19.5に更新しました。

さいごに

詳細については、以下のお知らせも参照してください。

お知らせ 10.0.9リリース

それでは、Groongaでガンガン検索してください!