[groonga-dev,04459] Re: 日本語、英語、仏語のまざった文章で複数形や過去形をフォローできますでしょうか

Back to archive index

toshio_uchiy****@mirro***** toshio_uchiy****@mirro*****
2017年 9月 8日 (金) 10:02:24 JST


矢田さま

 返信、ありがとうございます。
 HDD を SSD に換装して、メモリーにデータが載っていない時に検索に
5秒くらいかかります。そして、物理メモリー32GB で、データベースの
サイズが90GBくらいあります。ls -al pgrn* の合計サイズが 45GB くらいです。
 Groonga はカラムストア型のデータベースと書いてありますね。
Groonga の使い方を勉強して、使ってみました。結果、column_list 
コマンドを使ってみることができました。

> column_list Sources17328 --output_pretty yes
[
  [
    0,
    1504831557.563424,
    0.0002183914184570312
  ],
  [
    [
      [
        "id",
        "UInt32"
      ],
      [
        "name",
        "ShortText"
      ],
      [
        "path",
        "ShortText"
      ],
      [
        "type",
        "ShortText"
      ],
      [
        "flags",
        "ShortText"
      ],
      [
        "domain",
        "ShortText"
      ],
      [
        "range",
        "ShortText"
      ],
      [
        "source",
        "ShortText"
      ]
    ],
    [
      288,
      "ctid",
      "pgrn.0000120",
      "fix",
      "COLUMN_SCALAR|PERSISTENT",
      "Sources17328",
      "UInt64",
      [
      ]
    ],
    [
      290,
      "lower",
      "pgrn.0000122",
      "var",
      "COLUMN_SCALAR|COMPRESS_ZSTD|PERSISTENT",
      "Sources17328",
      "LongText",
      [
      ]
    ]
  ]
]

もしかして、カラム毎にファイルが分かれているのでしょうか。
Postgres でのカラム名と groonga でのカラム名の対応表って
どこかにありますでしょうか?

cat pgrn.必要としているカラムのファイル > /dev/null

すれば良い。ということでしょうか。
 これは、多分、効果が実証済みだと思います。
 問題は、以前に教えていただいた方に、一度、メモリーに
載せても、消えていきます。一時間に一回とか cron で
実行するのは考えものです。と言われました。

 現在の対策としては、YouTube 上での視聴回数が少ない
動画の情報は削除したテーブルを用いてデータ量を少なくしたら
検索が早くなる?かと考えています。

 アドバイスありましたらよろしくお願いします。

-----Original Message-----
From: groon****@lists***** [mailto:groon****@lists*****] On Behalf Of Susumu Yata
Sent: Tuesday, September 5, 2017 6:35 PM
To: 全文検索エンジンGroonga開発メーリングリスト
Subject: [groonga-dev,04458] Re: 日本語、英語、仏語のまざった文章で複数形や過去形をフォローできますでしょうか

内山さま

矢田です.

ご丁寧に報告いただきましてありがとうございます.
無事にステミングを実現できてよろしゅうございました.

メモリ(ページキャッシュ)にデータが載っていないときに時間がかかる問題については,
状況によって適切な対処法は変わると思います.
PGroonga には詳しくないので Groonga 単体での対処法になりますが,いくつか挙げてみます.

- DB 全体がメモリに収まる場合
  - `cat db/* > /dev/null` などの方法で明示的にデータをメモリに載せることができます.
- DB の一部しかメモリに収まらない場合
  - 検索時間に影響の大きいカラムがあれば,上と同様の方法でメモリに載せることができます.
- HDD が遅い場合
  - SSD にすることで高速化できます.

更新の頻度が低ければ,キャッシュの設定を調整することでも改善できるかもしれません.

参考になりましたら幸いです.


2017年9月3日 15:25  <toshio_uchiy****@mirro*****>:
> 矢田さま、メーリングリストの皆様
>
>  ステミングの情報についてはお世話になり
> ありがとうございます。
>  以前は、CentOS 6.9 上に PostgreSQL + PGronnga
> のプラットフォームで動画検索エンジンを構築して
> いたため、英語字幕についてのステミングができない
> 状態でした。
>  一念発起して、CentOS 7.3 + PostgreSQL 9.6 +
> PGroonga 2.0 で、字幕を検索する動画検索エンジンを
> 再構築しました。結果、英語字幕について
> CREATE INDEX PGronnga のオプションとして TokenFilterStem
> をもちい、ステミングを実現することができました。
>
> http://moovle.org/
>
> で、swim と入力していただくと、検索結果の一番上に
> swimming を含む文章が現れます。
>  Gronnga, PGronnga の開発スタッフの方々には
> お世話になりっぱなしです。ありがとうございます。
>
> /usr/lib64/groonga/plugins/token_filters/stop_word.so
>
> もあるので、 stop word のオプションも使えるのかな?と
> 考えています。
>  現在、swim で検索すると、メモリーにデータが載っていない時は
> 5秒程度かかってしまいます。これは、今後の課題です。
>  これからもよろしくお願いします。
>
> -----Original Message-----
> From: groon****@lists***** 
> [mailto:groon****@lists*****] On Behalf Of 
> toshio_uchiy****@mirro*****
> Sent: Friday, July 21, 2017 11:47 AM
> To: '全文検索エンジンGroonga開発メーリングリスト'
> Subject: [groonga-dev,04408] Re: 
> 日本語、英語、仏語のまざった文章で複数形や過去形をフォローできますでしょうか
>
> 矢田様
>
>  お世話になります。内山です。
>  分かりやすいご回答ありがとうございます。
> あれから、英語だけでもステミングしてみようと
> 思い、私も stem.c を見てみました。
>  全文検索をおこなえるようにしているプラットフォームが
> 最初、FreeBSD 11.0 + PostgreSQL 9.6 + PGRonnga でしたが、
> 安定動作のため、CentOS 7.3 がインストールできず、
> CentOS 6.9 でサービスを展開しています。
>  どうやら、CentOS 6 系では、stem.c は動作しないようです。
> やるとしたら、debian とかに乗り換えるか、CentOS 7 系が
> インストールできるように頑張ってみるかですね。
>  マシンは、Fujitsu TX1310 M1 です。
>
>  また、英語・フランス語・日本語の文章の混ざったテーブルに
> 複数のトークンフィルターを適用すると問題が起こる可能性が
> ある。とのこと。
>
>  これらのことから考えて、ステミング、ノーマライズをおこなうのは
> もっと検討してからの方が良さそうです。
>
>  今回は、実現しようとしたユーザーへのサービスを、すぐには
> 実現できないという結論ですが、これも、将来への課題ということに
> したいと思います。ユーザーには申し訳ありませんが、現在のところ
> これで精いっぱいです。
>
>  ありがとうございます。
>
> -----Original Message-----
> From: groon****@lists***** 
> [mailto:groon****@lists*****] On Behalf Of Susumu Yata
> Sent: Thursday, July 20, 2017 12:51 PM
> To: 全文検索エンジンGroonga開発メーリングリスト
> Subject: [groonga-dev,04404] Re: 
> 日本語、英語、仏語のまざった文章で複数形や過去形をフォローできますでしょうか
>
> 内山様
>
> 未来検索ブラジルの矢田です.
>
>> CREATE INDEX manual_pgroonga_content_idx on ( manual ) using pgroonga 
>> WITH (plugins='token_filters/stem', token_filters="TokenFilterStem' 
>> );
>>
>> のようにすれば、今のままで英語についてステミングができるのでしょうか。
>
> できるはずです.
> 基本的にはトークナイザと併せて使うことになると思います.
>
>> PGroonga のマニュアルによると
>>
>> token_filters='${トークンフィルター1}, ${トークンフィルター2}, ..., ${トークンフィルターN}'
>>
>> のように複数のトークンフィルターを指定できるようです。英語のステミング
>> をおこなうトークンフィルター、フランス語のステミングをおこなうトークンフィルター
>> を両方とも指定することは可能でしょうか。
>
> ソースコードを見る限り,トークンフィルターを複数指定した場合,それらは順番に適用されるだけのようです.
> そのため,実際に入力された言語に関係なく,英語用のステミングとフランス語用のステミングが両方とも適用されてしまいます.
> うまく機能する可能性もありますが,検索結果がおかしくなるケースもありそうです.
> フランス語のことはほとんどわからないため,たしかなことは言えません.
>
>> ちなみに、プラグインでステミングを指定して、トークナイザーに TokenMecab を指定する:
>>
>> CREATE INDEX manual_pgroonga_content_idx on ( manual ) using pgroonga 
>> WITH (plugins='token_filters/stem', token_filters="TokenFilterStem', 
>> tokenizer='TokenMecab' );
>>
>> のようなことも可能でしょうか。
>
> 私は PGroonga を使ったことがないので「できるはず」としか言えません.
> 試してから返信できれば良かったのですが,まだ試せていないのです.
>
> それから,ノーマライザーも併せて使った方が良いかもしれません.
>
>> アドバイスなどありましたらよろしくお願いします。
>
> ほかの Groonga 開発者さんにも少し話を聞いてみました.
>
> 現状,ステミングについては,英語のみのサポートとなっています.
> ほかの言語については,言語別にトークンフィルターを用意すると種類がすごく増えてしまうため,
> どうやって対応するのか検討中とのことです.
>
> 複数言語の取り扱いについては,各言語のステミングに対応したとしても,
> 現状では言語別に保存するカラムを分け,さらにインデックス用のテーブルも分けるしかなさそうです.
> 検索時には,クエリの言語によって検索対象を変更するか,
> あるいは問答無用ですべての言語について検索するかという話になりそうです.
>
> 2017年7月19日 9:40  <toshio_uchiy****@mirro*****>:
>> 矢田様、メーリングリストの皆様
>>
>>  お世話になります。内山です。質問が多くて申し訳ありません。
>>  ようやく、PGroonga の Create Index のトークンフィルターと
>> Groonga のトークンフィルターについて、ドキュメントを読む時間が
>> 取れました。
>>
>> CREATE INDEX manual_pgroonga_content_idx on ( manual ) using pgroonga 
>> WITH (plugins='token_filters/stem', token_filters="TokenFilterStem' 
>> );
>>
>> のようにすれば、今のままで英語についてステミングができるのでしょうか。
>> PGroonga のマニュアルによると
>>
>> token_filters='${トークンフィルター1}, ${トークンフィルター2}, ..., ${トークンフィルターN}'
>>
>> のように複数のトークンフィルターを指定できるようです。英語のステミング
>> をおこなうトークンフィルター、フランス語のステミングをおこなうトークンフィルター
>> を両方とも指定することは可能でしょうか。
>>  ちなみに、プラグインでステミングを指定して、トークナイザーに
>> TokenMecab を指定する:
>>
>> CREATE INDEX manual_pgroonga_content_idx on ( manual ) using pgroonga 
>> WITH (plugins='token_filters/stem', token_filters="TokenFilterStem', 
>> tokenizer='TokenMecab' );
>>
>> のようなことも可能でしょうか。
>>  アドバイスなどありましたらよろしくお願いします。
>>
>> -----Original Message-----
>> From: groon****@lists***** 
>> [mailto:groon****@lists*****] On Behalf Of Susumu Yata
>> Sent: Tuesday, July 18, 2017 3:35 PM
>> To: 全文検索エンジンGroonga開発メーリングリスト
>> Subject: [groonga-dev,04399] Re:
>> 日本語、英語、仏語のまざった文章で複数形や過去形をフォローできますでしょうか
>>
>> 内山さん
>>
>> 未来検索ブラジルの矢田です.
>>
>> 英語やフランス語の活用による変化を検索で無視する方法としては,
>> ステミングを使うことが多いかと思います.
>> PGroonga, Groonga のドキュメントにおいては,以下のページに記述が見つかりました.
>>
>> - CREATE INDEX USING pgroonga | PGroonga
>>   -
>> https://pgroonga.github.io/ja/reference/create-index-using-pgroonga.h
>> t
>> ml#custom-token-filters
>> - 7.9. トークンフィルター — Groonga v7.0.4ドキュメント
>>   - http://groonga.org/ja/docs/reference/token_filters.html
>>
>> ただ,実装を見る限りでは,英語用のステミングとなっているようです.
>>
>>  groonga/plugins/token_filters/stem.c
>>   54: const char *algorithm = "english";
>>   55: const char *encoding = "UTF_8";
>>   56: token_filter->stemmer = sb_stemmer_new(algorithm, encoding);
>>
>> これを真似して "english" のところを "french" にすれば,
>> フランス語用のステミングプラグインを用意できそうな気はしますが,
>> フランス語について無知なので断言できません.
>>
>> 後は,もし同じカラムに日本語,英語,フランス語が格納されているのであれば,
>> どれを適用するかが問題になると思います.
>>
>> 解決方法としては,以下のような選択肢が思い浮かびました.
>>
>> - 言語によってカラムを分割する.
>>   - あらかじめデータを言語別に分けなければならない.
>> - 英語用とフランス語用のステミングを両方とも適用する.
>>   - 副作用で検索の精度が下がる恐れがある.
>>
>> 参考になりましたら幸いです.
>>
>>
>> 2017年7月17日 6:58  <toshio_uchiy****@mirro*****>:
>>> メーリングリストの皆様
>>>
>>>
>>>
>>>  お世話になります。内山と申します。
>>>
>>>  日本語、英語、フランス語の短いセンテンスが
>>>
>>> たくさんあります。これに、PGroonga で索引をつけ
>>>
>>> PostgreSQL で全文検索しています。 トークナイザーは
>>>
>>> TokenMecab です。
>>>
>>> 検索を実行するサイトでは、日本語、英語、フランス語
>>>
>>> で検索できます。と謳うつもりです。
>>>
>>>  この時、英語を例にとると、dependency と dependencies
>>>
>>> は別々に検索しないとヒットしないようです。以前より気に
>>>
>>> なってました。
>>>
>>>  Google では、単数形で検索すれば複数形もヒットするように
>>>
>>> 見えました。
>>>
>>>  仕組みとしては、単数形と複数形の辞書、過去形や過去分詞と
>>>
>>> 現在系の辞書を持てば何とかなりそうな気がしてしまいます。
>>>
>>>  今回、日本語と英語に加えて、フランス語の文章も全文検索
>>>
>>> の対象に加えたので、男性、中性、女性などの型も気になり、
>>>
>>> 少しここを調べようと思いググってみました。しかし、groonga
>>>
>>> full text search で検索しても、これだという情報を見つける
>>>
>>> ことができませんでした。
>>>
>>> 今回の疑問について参考となるサイトなどありましたら、
>>>
>>> 教えていただけますでしょうか。
>>>
>>>  よろしくお願いします。
>>>
>>>
>>>
>>>
>>> _______________________________________________
>>> groonga-dev mailing list
>>> groon****@lists*****
>>> http://lists.osdn.me/mailman/listinfo/groonga-dev
>>>
>>
>>
>>
>> --
>> Susumu Yata <susum****@gmail*****>
>> _______________________________________________
>> groonga-dev mailing list
>> groon****@lists*****
>> http://lists.osdn.me/mailman/listinfo/groonga-dev
>> _______________________________________________
>> groonga-dev mailing list
>> groon****@lists*****
>> http://lists.osdn.me/mailman/listinfo/groonga-dev
>
>
>
> --
> Susumu Yata <susum****@gmail*****>
> _______________________________________________
> groonga-dev mailing list
> groon****@lists*****
> http://lists.osdn.me/mailman/listinfo/groonga-dev
> _______________________________________________
> groonga-dev mailing list
> groon****@lists*****
> http://lists.osdn.me/mailman/listinfo/groonga-dev
> _______________________________________________
> groonga-dev mailing list
> groon****@lists*****
> http://lists.osdn.me/mailman/listinfo/groonga-dev



--
Susumu Yata <susum****@gmail*****>
_______________________________________________
groonga-dev mailing list
groon****@lists*****
http://lists.osdn.me/mailman/listinfo/groonga-dev



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