しるろぐ

いろいろ書きます。

Confluence の検索を OR から AND にする UserScript を書いた

Confluence の検索には罠があり直感的な検索ができないので、それをいい感じに検索できるようにしました。

Confluence: Change from OR search to AND search. · GitHub

Confluence 検索の闇

その1. 二文字ずつ分割して検索

Confluence を日本語で使っている人はおそらく検索インデックスとして CJK を利用していると思います。 CJK にした場合、単語区切りではなく、bi-gram(検索文字列を2文字ずつ分割)で全文検索を行います。

https://<YOUR-CONFLUENCE-URL>/explain.action?queryString=東京特許許可局 で細かい挙動を確認することができます。

query:
((((spanNear([title:東京, title:京特], 5, false) spanNear([title:東京, title:特許], 5, false) spanNear([title:京特, title:特許], 5, false) spanNear([title:東京, title:許許], 5, false) spanNear([title:京特, title:許許], 5, false) spanNear([title:特許, title:許許], 5, false) spanNear([title:東京, title:許可], 5, false) spanNear([title:京特, title:許可], 5, false) spanNear([title:特許, title:許可], 5, false) spanNear([title:許許, title:許可], 5, false) spanNear([title:東京, title:可局], 5, false) spanNear([title:京特, title:可局], 5, false) spanNear([title:特許, title:可局], 5, false) spanNear([title:許許, title:可局], 5, false) spanNear([title:許可, title:可局], 5, false))^2.0) (spanNear([contentBody:東京, contentBody:京特], 5, false) spanNear([contentBody:東京, contentBody:特許], 5, false) spanNear([contentBody:京特, contentBody:特許], 5, false) spanNear([contentBody:東京, contentBody:許許], 5, false) spanNear([contentBody:京特, contentBody:許許], 5, false) spanNear([contentBody:特許, contentBody:許許], 5, false) spanNear([contentBody:東京, contentBody:許可], 5, false) spanNear([contentBody:京特, contentBody:許可], 5, false) spanNear([contentBody:特許, contentBody:許可], 5, false) spanNear([contentBody:許許, contentBody:許可], 5, false) spanNear([contentBody:東京, contentBody:可局], 5, false) spanNear([contentBody:京特, contentBody:可局], 5, false) spanNear([contentBody:特許, contentBody:可局], 5, false) spanNear([contentBody:許許, contentBody:可局], 5, false) spanNear([contentBody:許可, contentBody:可局], 5, false)))^4.0) title:"東京 京特 特許 許許 許可 可局"^2.0 contentBody:"東京 京特 特許 許許 許可 可局" ((title:東京^2.0 title:京特^2.0 title:特許^2.0 title:許許^2.0 title:許可^2.0 title:可局^2.0) (contentBody:東京 contentBody:京特 contentBody:特許 contentBody:許許 contentBody:許可 contentBody:可局) (content-name-unstemmed:東京 content-name-unstemmed:京特 content-name-unstemmed:特許 content-name-unstemmed:許許 content-name-unstemmed:許可 content-name-unstemmed:可局))

その2. 単語を並記はOR検索

また、Confluence の検索エンジン Lucene では、ANDやORを明示的に指定する必要があり、指定しない場合(スペースの場合)ORとして扱われます。

「Confluence 検索」と検索したとき:

  • 期待するもの:「Confluence AND 検索」
  • 実際の動作:「Confluence OR 検索」

いい感じにするUserScript

2つの UserScript を書きました。

confluence-replace-search.user.js

f:id:ofsilvers:20200915132310g:plain

  • ヘッダーにある quick-search で開くパネルが対象
  • 入力と同時にクオーテーションとANDを差し込んでくれる

confluence-suggest-search.user.js

f:id:ofsilvers:20200915131024g:plain

  • 検索ページ ( /dosearchsite.action ) が対象
  • 検索後、クオーテーションとANDを差し込んだものを提案してくれる

インストール方法

ユーザの場合

  1. Tampermonkey( https://www.tampermonkey.net/ ) をインストール
  2. ↑のリンクを開くと Tampermonkey でインストールしますか?と言われるのでインストールする
  3. replace-search のほうは、 @match をあなたの Confluence URL に書き換える(suggest-search は書き換えなくても動きます)

管理者の場合

全ユーザに反映させたい場合は、いい感じにソースコードをコピーして、管理画面のカスタムHTMLに貼り付けてください。