Elggの検索の挙動

49 views
Skip to first unread message

ひいろ

unread,
Dec 15, 2010, 6:19:49 AM12/15/10
to Elgg 日本ユーザーグループ
初めまして。
Elgg 1.7.4 を CentOS環境で少しずつ動作を確かめながら改造しています。

Elgg1.7.4(無改造)の検索を試していたところ、以下のような挙動になっていました。

・3文字以内の検索は問題なく動作する。
 例えば「あいうえお」「ABCDEFG」という文字列を含むエンティティがあれば、「いうえ」や
 「CDE」で検索すればヒットする。

・4文字以上の検索で、単語の部分一致はヒットしない。
 例えば「あいうえお」「ABCDEFG」という文字列を含むエンティティが存在し、「いうえお」
 や「BCDE」で検索してもヒットしない。

・空白や改行等で区切られている単語に完全一致すれば、4文字以上でもヒットする。
 例えば「あいうえお(改行)」「ABCDEFG HIJ」(GとHの間にスペース)という文字列を
 含むエンティティが存在すれば、「あいうえお」「ABCDEFG」で検索すればヒットする。

これは元来の仕様なのでしょうか。

単語に部分一致しないとなると非常に使い勝手が悪いので、とりあえず4文字以上で
あっても部分一致したら検索結果として返すようにしたいのですが、何か簡単に実現
する方法はないでしょうか。

ソースを追いかけようとしたのですが、知識不足もあって難航しています。
何らかのご教授をいただけると幸いです。
--
ひいろ

Takeshi Fujisawa

unread,
Dec 15, 2010, 8:16:31 AM12/15/10
to elgg-...@googlegroups.com
サーチは仕様がグチャグチャしてますね。。

mod/search/start.php の中に search_get_where_sql という関数があります。

この中に以下のif文があり、 search_info['min_chars'] は4みたいなので、3文字以内で挙動が変わることと合致しますね。

if (elgg_strlen($query) < $CONFIG->search_info['min_chars']) {

#とりあえず min_charsの値を大きくすれば何とかなったり。。

2010年12月15日20:19 ひいろ <hiro...@gmail.com>:

--
藤澤 武 <takeshi....@gmail.com>
http://chnops.jp/

ひいろ

unread,
Dec 16, 2010, 1:18:06 AM12/16/10
to Elgg 日本ユーザーグループ
藤澤様

ご回答ありがとうございました。

mysqlの ft_min_word_len を読み込んで、検索文字数のしきい値に使用している
ようですね。

とりあえず /etc/my.cnf の[mysqld] に

ft_min_word_len = 20

と記述し、mysqlを再起動したらうまくいきました。


ft_min_word_len 以上の文字数で検索すると、mysqlの全文検索機能を使用するように
なってたんですね。
残念ながら日本語の文章はデリミタ(1バイトスペースとか)で区切られていないので、
全文検索機能はあまりうまく機能しないようですが・・・。


On 12月15日, 午後10:16, Takeshi Fujisawa <takeshi.fujis...@gmail.com>
wrote:
> サーチは仕様がグチャグチャしてますね。。
>
> mod/search/start.php の中に search_get_where_sql という関数があります。
>
> この中に以下のif文があり、 search_info['min_chars'] は4みたいなので、3文字以内で挙動が変わることと合致しますね。
>
> if (elgg_strlen($query) < $CONFIG->search_info['min_chars']) {
>
> #とりあえず min_charsの値を大きくすれば何とかなったり。。
>
> 2010年12月15日20:19 ひいろ <hiro2...@gmail.com>:
>
>
>
>
>
> > 初めまして。
> > Elgg 1.7.4 を CentOS環境で少しずつ動作を確かめながら改造しています。
>
> > Elgg1.7.4(無改造)の検索を試していたところ、以下のような挙動になっていました。
>
> > ・3文字以内の検索は問題なく動作する。
> > 例えば「あいうえお」「ABCDEFG」という文字列を含むエンティティがあれば、「いうえ」や
> > 「CDE」で検索すればヒットする。
>
> > ・4文字以上の検索で、単語の部分一致はヒットしない。
> > 例えば「あいうえお」「ABCDEFG」という文字列を含むエンティティが存在し、「いうえお」
> > や「BCDE」で検索してもヒットしない。
>
> > ・空白や改行等で区切られている単語に完全一致すれば、4文字以上でもヒットする。
> > 例えば「あいうえお(改行)」「ABCDEFG HIJ」(GとHの間にスペース)という文字列を
> > 含むエンティティが存在すれば、「あいうえお」「ABCDEFG」で検索すればヒットする。
>
> > これは元来の仕様なのでしょうか。
>
> > 単語に部分一致しないとなると非常に使い勝手が悪いので、とりあえず4文字以上で
> > あっても部分一致したら検索結果として返すようにしたいのですが、何か簡単に実現
> > する方法はないでしょうか。
>
> > ソースを追いかけようとしたのですが、知識不足もあって難航しています。
> > 何らかのご教授をいただけると幸いです。
> > --
> > ひいろ
>
> --
> 藤澤 武 <takeshi.fujis...@gmail.com>http://chnops.jp/- 引用テキストを表示しない -
>
> - 引用テキストを表示 -
Reply all
Reply to author
Forward
0 new messages