clear-code / redmine_full_text_search

Full text search for Redmine
MIT License
63 stars 24 forks source link

Support similar issue search #26

Closed kou closed 7 years ago

kou commented 7 years ago

このプラグインのスコープかどうかから検討する必要があると思いますが、今見ているissueと類似のissueを検索できる(issue表示画面に勝手に類似issueが表示される方がよさそう)と「この問題はどこかで見た気がするな。。。どのissueだろう。。。」というときにすぐに見つけられてうれしいです。

技術的には、Mroongaの場合は、1つテーブルを用意して、1issue(+全コメント)につき1レコードを作ってそこのカラムにテキストを格納し、そのカラムにTokenMecabな全文検索用インデックスを張って、そのカラムに対して検索対象のissue(+全コメント)のテキストを検索文字列として(IN BOOLEAN MODEじゃなくて)IN NATURAL LANGUAGE MODEで全文検索すると実現できます。

イメージ:

CREATE TABLE issue_texts (
  issue_id int NOT NULL,
  text longtext NOT NULL,
  FULLTEXT KEY (text)
) ENGINE=Mroonga
  DEFAULT CHAREST=utf8mb4;

INSERT INTO issue_texts
  SELECT CONCAT(subject, '\n', description),  -- コメントの内容も入れたい
         id
    FROM issues;

SELECT *
  FROM issues
  WHERE id IN (
    SELECT issue_id
      FROM issue_texts
      WHERE MATCH(text) AGAINST('見ているissueのタイトルと説明とコメント全部を連結したテキスト' IN NATURAL LANGUAGE MODE)
     ORDER BY MATCH(text) AGAINST(...↑と同じもの...) DESC
     LIMIT 3
  );
okkez commented 7 years ago

view は <%= call_hook(:view_issues_show_details_bottom, :issue => @issue) %><%= call_hook(:view_issues_show_description_bottom, :issue => @issue) %> があるのでどちらかを使える。

okkez commented 7 years ago

Wikiは簡単にできる。

c.select_value("select pgroonga.command('select', ARRAY['table', pgroonga.table_name('index_searcher_records_pgroonga'), 'filter', 'text *S \"#{w}\" && original_type == \"WikiPage\" && original_id != 1', 'output_columns', 'original_id, original_type,text,_score', 'sort_keys', '-_score'])::json")

output columns にはテキス自体はいらない。そのページへのリンクを作るために必要な情報さえあれば。 Wikiのサイドバーにコンテンツを追加するフックがない。

okkez commented 7 years ago

project_id みたいに issue_id を追加して以下のようにやるとそれっぽい結果にならないだろうか。

select --table searcher_records \
--filter '(description *S "..." || notes *S "...") in_values(original_type, "Issue", "Journal") ' \
--drilldown issue_id

これでダメそうなら、最初の案の通り専用のテーブルを追加してやるのがいい気がする。

okkez commented 7 years ago

https://www.slideshare.net/kou/groongaseminar201708 によると PGroonga でも v2 演算子を使うようにすれば SQL から全文検索できる。 Mroonga と PGroonga で完全に書き方が分かれてしまうので、互いに参考にすることができなくなってあんまりうれしくない。

okkez commented 7 years ago

Merged #35