タグ

ブックマーク / blog.createfield.com (12)

  • Groongaでb Bit MinHashを使って高速に類似検索 - CreateField Blog

    Groonga Advent Calendar 2015の23日目の記事です。 はじめに GroongaでJaccard係数を計算するプラグインを作る - CreateField Blog こちらの記事では、GroongaでJaccard係数を計算できるプラグインを作りました。しかしながら、毎回すべてのレコードについて類似度を計算すると非常に計算量が多くなってしまいます。 そこで、b Bit MinHashという方法を使って高速にJaccard係数を推定する方法を実装して試してみました。 naoa/groonga-minhash · GitHub ハッシュ関数にはMurmur3のc port、乱数の生成にはXorShiftを利用しています。 MinHashとは 2つの集合に対するランダムなハッシュ関数による最小ハッシュ値が一致する確率は、Jaccard係数に等しいという性質を持ちます。 こ

    Groongaでb Bit MinHashを使って高速に類似検索 - CreateField Blog
  • MroongaでGroongaの機能を使いこなす高度なテーブル設計をする方法 - CreateField Blog

    はじめに MySQL/MariaDBで高速に全文検索するためのオープンソースのストレージエンジンMroongaは、以下のように、Engine=Mroonga、FULLTEXT INDEX (${source_column})と書くだけで非常に簡単に全文検索を使い始めることができます。 CREATE TABLE memos ( id INT NOT NULL PRIMARY KEY, content TEXT NOT NULL, FULLTEXT INDEX (content) ) Engine=Mroonga DEFAULT CHARSET=utf8; 検索するときも以下のようにMATCH ... AGAINSTを使うだけです。 mysql> INSERT INTO memos VALUES (1, "1日の消費㌍は約2000㌔㌍"); Query OK, 1 row affected (

    MroongaでGroongaの機能を使いこなす高度なテーブル設計をする方法 - CreateField Blog
  • Railsで高速全文検索エンジンMroongaを使うためのチュートリアル - CreateField Blog

    はじめに MySQLでオープンソースの日語対応の高速な全文検索エンジンGroongaが使えるMroongaを使って簡単に全文検索機能付きのRailsアプリケーションを作成する方法を紹介します。Railsのデモアプリケーションと実際に使えるサンプルの検索用のメソッドを使って具体的に説明します。 前準備 まず、RailsMySQLとMroongaが使えるようにしてください。 これらはすでに情報がたくさんあると思うので、さほど苦なく用意できると思います。最近のMariaDBであればデフォルトでバンドルされていたりします。 簡単に試すことができるようにRubyMySQLとMroongaが自動で環境構築されるVagrantファイルを用意しておきました。 naoa/start-mroonga-with-rails · GitHub vagrantとubuntu/trusty64のboxとvagr

    Railsで高速全文検索エンジンMroongaを使うためのチュートリアル - CreateField Blog
  • MySQLで編集距離を求めるUDF - CreateField Blog

    先日、Groongaでビットパラレルで高速な編集距離の実装を検証してました。 ビットパラレルを使ってGroongaで高速な編集距離関数の検証 - CreateField Blog 編集距離とは挿入、置換、削除、並び替えの編集操作によって一方の文字列をもう一方の文字列に変形するのに必要な手順の最小回数です。 ちょこっとだけ表記ゆれしている文字列を抽出したりできます。 ちょっとMySQLでもカジュアルに使いたいなぁと思って編集距離を求めるUDFをさくっと作りました。 naoa/mysql-edit-distance · GitHub 1バイト文字であればビットパラレル法でそこそこ高速に編集距離を求めることができます。 10万レコードの比較 文字数x文字数 動的計画法 ビットパラレル固定長 62x62 11.6524 sec 0.1811 sec とりあえず、英語で使いたかっただけということもあ

    MySQLで編集距離を求めるUDF - CreateField Blog
  • Mroongaを使って全文検索Webサービスを作ったときにはまったこと(第1回) - CreateField Blog

    前回のエントリに書いたように、1年半ほどをかけて、独学で特許の全文検索サービスを開発しました。 PatentField | 無料特許検索 最初は、MySQLを使ったこともない状態だったこともあり、かなり紆余曲折しました。Groonga開発チームの懇切な対応もあって、専用サーバ1台で最大で1千万レコード超、400GiB以上のサイズのテキストデータを高速に検索できるようになりました。 今後、何回かにわけて、Mroonga(Groonga)を使って全文検索Webサービスを作ったときにはまったこと、学んだことを全て書き出したいと思います。 全文検索エンジンMroongaとは? Mroongaは全文検索エンジンであるGroongaをベースとしたMySQL用のストレージエンジンです。Mroongaは、MySQLが使える人であれば、簡単に高速な全文検索機能が使えます。MariaDB10.0系にもバンドル

    Mroongaを使って全文検索Webサービスを作ったときにはまったこと(第1回) - CreateField Blog
  • Groongaのパトリシアトライを使って高速なあいまい検索を実装した - CreateField Blog

    はじめに あいまい検索はたとえば、編集距離を求めることによって実現することができます。 レーベンシュタイン距離(レーベンシュタインきょり、英: Levenshtein distance)は、二つの文字列がどの程度異なっているかを示す距離の一種である。編集距離(へんしゅうきょり、英: edit distance)とも呼ばれる。具体的には、1文字の挿入・削除・置換によって、一方の文字列をもう一方の文字列に変形するのに必要な手順の最小回数として定義される。 レーベンシュタイン距離 - Wikipedia 最もベーシックな動的計画法によって編集距離を求める場合、計算量はO(nm)であり、レコード郡から編集距離が近いものだけを列挙する場合、さらにレコード数分の比較が必要になり計算量がとても大きくなってしまいます。 文字列の比較自体は、ビット演算を用いることによりそこそこ高速化できますが*1、この場合

  • 数百GiBの全文検索用データベースをMroongaのストレージモードにしてはまったこと - CreateField Blog

    前回は、全文検索Webサービスを作ったときにはまったことの第2回として、 Mroongaのラッパーモードからストレージモードに変えた理由という記事を書きました。 今回は、Mroongaのストレージモードにしたことによってはまったことについて書きたいと思います。 Spiderストレージエンジンを使ったMroongaの分散構成の検討 当初、データベースを複数に分割し、Spiderストレージエンジンを使ってデータベースシャーディングする予定でした。 Spiderストレージエンジンは、ストレージエンジンの種類を問わずデータベースを水平分散させることができるMySQL/Mariadbのストレージエンジンです。 Spiderストレージエンジンは、国産で個人の方が開発されたストレージエンジンでMariaDB10.0系にすでにバンドルされています。 Spiderストレージエンジンの開発者の方は、全文検索M

    数百GiBの全文検索用データベースをMroongaのストレージモードにしてはまったこと - CreateField Blog
  • Groongaが得意でない類似文書検索にGETAssocという連想検索エンジンを使った話 - CreateField Blog

    GroongaおよびMroongaにおける類似文書検索について GroongaおよびMroongaには、類似文書検索の機能が実装されています。 GroongaおよびMroongaの類似文書検索では、検索クエリが完全に含まれる文書をヒットさせるのではなく、検索クエリをトークンに分割にし、転置インデックスを使ったトークンごとのマッチ検索結果に対して所定の重みづけ処理や並べ替え等をし、TF(語句の出現頻度)とIDF(語句の稀少性)を考慮させて検索クエリに似ている文書を上位表示させます。 類似文書検索では、必ずしも全てのトークンが文書に含まれていなくとも検索にヒットします。 スコアの算出基準の詳細は、こちらを参照してください。 なお、Groongaの類似文書検索ではない全文検索のデフォルトでは、TFのみが考慮された順番でソートされています。SolrやElasticsearchのデフォルトでは、TF

  • Mroongaのラッパーモードからストレージモードに変えた理由 - CreateField Blog

    前回は、全文検索Webサービスを作ったときにはまったことの第1回という記事を書きました。 今回は、Mroongaを使って全文検索Webサービスを作ったときにはまったことの第2回として、ラッパーモードからストレージモードに変えた理由について書きたいと思います。 なお、かなり長く、MySQL、Groongaについて前提知識がないと理解できない部分が多々含まれている可能性があります。 ラッパーモードとは 全文検索Mroongaストレージエンジンでは、全文検索するためにラッパーモードとストレージモードの2つのモードが用意されています。 (引用) ラッパーモードでは全文検索機能のみGroongaの機能を利用し、データストアはInnoDBなど既存のストレージエンジンを利用します。ラッパーモードを利用することにより、ストレージエンジンとして多くの利用実績のあるInnoDBに全文検索エンジンとして実績のあ

    Mroongaのラッパーモードからストレージモードに変えた理由 - CreateField Blog
  • GroongaとElasticsearchの転置索引の違いと更新反映速度について - CreateField Blog

    はじめに こちらの記事では、GroongaとElasticsearchの単純な検索性能、更新性能、 ディスク使用効率を比較しました。 その結果では、Groongaの検索速度がElasticsearchよりも数倍ほど速く、Elasticsearchの更新速度がGroongaよりも数倍ほど速かったです。 なお、前回の記事では、Elasticsearchでフレーズ検索がされていなかったり*1、punctuation、whiespaceが転置索引に入っていなかったため、追加検証結果を追記しています。 シーケンシャルなスクリプトではGroongaの更新速度のほうが遅かったですが、これは、GroongaとElasticsearchが利用しているLuceneの転置索引の作成方法や管理方法の違いによるものです。 Groongaにおける転置索引 Groongaでは、即時更新に強く更新にかかる処理コストが低く

    GroongaとElasticsearchの転置索引の違いと更新反映速度について - CreateField Blog
  • 独学で特許の全文検索サービスを開発しました - CreateField Blog

    はてなブログ初投稿です。 大学の授業でC言語をかじった程度のサラリーマンですが、1年半ほどをかけて、独学で特許の全文検索サービスを開発しました。 PatentField | 無料特許検索 1年半前は、データベースもサーバサイドの言語もJavaScriptもまったく触ったことがなく、Ajaxって何?ってぐらいの技術レベルでしたが、ようやく先月公開することができました。 まだまだ未完成ですが、最大で1千万レコード以上、400GiB以上のサイズのテキストデータを高速に全文検索することができます。 このサービスでは、ただ公報データを全文検索するだけではなく、整理標準化データと呼ばれる権利の死活情報等を含む数十種類の項目を組み合わせて検索することができます。これにより、一般の利用者が特許を侵害していないかどうかを確認し易く、また、特許期限切れのフリ―な技術情報を簡単に参照できるようにしています。 ま

    独学で特許の全文検索サービスを開発しました - CreateField Blog
  • 専門用語を自動抽出するTermExtractをDockerで簡単に使えるようにしました - CreateField Blog

    はじめに 品詞のつながりや出現頻度、学習情報から複合語らしきキーワードを自動で抽出するPerlモジュールTermExtractが公開されています。 これを利用すれば、形態素解析済みのテキストをわせるだけでそこそこそれらしい専門用語をたくさん得ることができます。 このTermExtractは、ソースからインストールする必要があったり、EUC環境であったり形態素解析後のデータを入力に必要としたりなかなかめんどくさいです。 そこで、MeCabとTermExtractが自動で環境構築されるDockerファイルを作りました。 https://github.com/naoa/docker-termextract このDockerファイルでは、正規表現フィルタや形態素解析、コスト推定などを自動でやってくれるPerlスクリプトも自動で導入されるようになっています。 これでDockerを実行できる環境があ

    専門用語を自動抽出するTermExtractをDockerで簡単に使えるようにしました - CreateField Blog
  • 1