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
- ヘッダーにある quick-search で開くパネルが対象
- 入力と同時にクオーテーションとANDを差し込んでくれる
confluence-suggest-search.user.js
- 検索ページ (
/dosearchsite.action
) が対象 - 検索後、クオーテーションとANDを差し込んだものを提案してくれる
インストール方法
ユーザの場合
- Tampermonkey( https://www.tampermonkey.net/ ) をインストール
- ↑のリンクを開くと Tampermonkey でインストールしますか?と言われるのでインストールする
- replace-search のほうは、
@match
をあなたの Confluence URL に書き換える(suggest-search は書き換えなくても動きます)
管理者の場合
全ユーザに反映させたい場合は、いい感じにソースコードをコピーして、管理画面のカスタムHTMLに貼り付けてください。