LunrJS ベースの Middleman 検索。
次の行をアプリケーションの Gemfile に追加します。
gem 'middleman-search'
そして、以下を実行します。
$ bundle
または、次のように自分でインストールします。
$ gem install middleman-search
config.rb
内のモジュールをアクティブにして、拡張機能にリソースのインデックス付け方法を指示する必要があります。
activate :search do | search |
search . resources = [ 'blog/' , 'index.html' , 'contactus/index.html' ]
search . index_path = 'search/lunr-index.json' # defaults to `search.json`
search . lunr_dirs = [ 'source/vendor/lunr-custom/' ] # optional alternate paths where to look for lunr js files
search . language = 'es' # defaults to 'en'
search . fields = {
title : { boost : 100 , store : true , required : true } ,
content : { boost : 50 } ,
url : { index : false , store : true } ,
author : { boost : 30 }
}
end
ここで、 resources
インデックスを作成するリソースの URL の先頭のリスト ( String#start_with?
でテスト)、 index_path
はサイト内に生成されたインデックス ファイルの相対パス、 fields
フィールドごとに 1 つのエントリを持つハッシュです。オプションのハッシュが関連付けられてインデックスが作成されます。
boost
このフィールドを検索するときに、lunr 関連性ブーストを指定します。store
このフィールドをドキュメント マップ (下記を参照) に保存するかどうか。デフォルトは false です。index
このフィールドにインデックスを付けるかどうか。デフォルトは truerequired
必須としてマークされたフィールドの値が空または null の場合、リソースはインデックス付けされません。特別なフィールドid
が自動的に含まれ、自動生成された識別子がドキュメントのref
として使用されることに注意してください。
すべてのフィールド値は、リソースdata
(つまり、そのフロントマター)、またはresource.metadata
のoptions
(つまり、 proxy
ページで指定されたオプション) から取得されます。ただし、次の場合は除きます。
url
content
レンダリングされたリソースから抽出されたテキスト (レイアウトは含まれません)その後、 lunrIndex
オブジェクトを介して Javascript からインデックスをクエリできます (詳細については、インデックス ファイルを参照してください)。
var max_search_entries = 50 ;
var result = [ ] ; //initialize empty array
lunrIndex . search ( request . term ) . forEach ( function ( item , index ) {
if ( index < max_search_entries ) {
result . push ( lunrData . docs [ item . ref ] ) ;
}
} ) ;
(マナスで使用していた lodash v3 コードを適応させてくれた @Jeepler に感謝します)
この gem には、MihaiValentin/lunr-langages によって提供される代替言語のアセットが含まれています。利用可能な言語のリストについては、そのリポジトリを参照してください。
含まれていない言語を使用する場合は、プロジェクト内のフォルダーにlunr.yourlang.js
ファイルをセットアップし、そのフォルダーをlunr_dirs
に追加して、Gem がどこを検索すればよいかを認識できるようにします。
before_index
コールバックを定義することで、リソースごとにインデックスを作成して保存するコンテンツを完全にカスタマイズできます。
activate :search do | search |
search . before_index = Proc . new do | to_index , to_store , resource |
if author = resource . data . author
to_index [ :author ] = data . authors [ author ] . name
end
end
end
このオプションは、リソースごとに実行されるコールバックを受け入れます。コールバックは、リソースだけでなく、出力のindex
オブジェクトとdocs
オブジェクトにそれぞれインデックス付けされるドキュメントと保存されるマップを使用して実行されます。処理中です。このコールバックを使用してそれらのいずれかを変更することも、 throw(:skip)
使用して問題のリソースをスキップすることもできます。
場合によっては、インデックス作成と検索の両方のために、lunr パイプラインに新しい関数を追加することができます。これを行うには、次のように関数名と本体を含むpipeline
ハッシュを提供します。
activate :search do | search |
search . pipeline = {
tildes : <<-JS
function(token, tokenIndex, tokens) {
return token
.replace('á', 'a')
.replace('é', 'e')
.replace('í', 'i')
.replace('ó', 'o')
.replace('ú', 'u');
}
JS
}
end
これにより、 tildes
関数が lunr パイプラインに登録され、インデックスの構築時に追加されます。 Lunr ドキュメントから:
パイプライン内の関数は、処理中の現在のトークンという 3 つの引数を使用して呼び出されます。トークンの配列内のそのトークンのインデックス、および処理されるドキュメントの一部であるトークンのリスト全体。これにより、トークンの単純なユニグラム処理だけでなく、より高度な N グラム処理も可能になります。
この関数はテキストの処理されたバージョンを返す必要があり、それがパイプライン内の次の関数に渡されます。未定義を返すと、それ以上のトークンの処理が妨げられ、そのトークンはインデックスに登録されなくなります。
パイプラインに関数を追加すると、インデックスのシリアル化解除時にその関数もロードされ、再登録されていない場合、lunr は「 Cannot load un-registered function: tildes
。これらを手動で登録することも、インデックスをロードする前に実行される.js.erb
ファイルに次のコードを含めることもできます。
<%= search_lunr_js_pipeline %>
生成されたインデックス ファイルには、次の 2 つのプロパティを持つ JSON オブジェクトが含まれています。
index
シリアル化された lunr.js インデックスが含まれており、これはlunr.Index.load(lunrData.index)
経由でロードできます。docs
自動生成されたドキュメント ID から、ストレージ用に構成された属性を含むオブジェクトへのマップです。通常は、 index
lunr インデックス インスタンスにロードし、 docs
マップを使用して戻り値を検索し、ユーザーに表示します。
実際にインデックスをロードできるようにするには、メインの sprockets JavaScript ファイル (アセット パイプラインを使用している場合) にlunr.min.js
ファイルもrequire
です。
//= require lunr.min
lunr の i18n 機能を使用している場合は、Stemmer サポートと言語ファイルも (この順序で) ここでロードする必要があります。
//= require lunr.min
//= require lunr.stemmer.support
//= require lunr.es
Middleman パイプライン (有効な場合) には、デフォルトではjson
ファイルが含まれませんが、 gzip
やasset_hash
などの対応する拡張子のexts
オプションに.json
を追加することで、これを簡単に変更できます。
activate :asset_hash do | asset_hash |
asset_hash . exts << '.json'
end
アセット ハッシュ拡張子を介してインデックス json ファイルを実行する場合は、検索のためにブラウザにファイルをロードするときに、 search_index_path
ビュー ヘルパーを使用して実際の宛先 URL を取得する必要があることに注意してください。
var lunrIndex = null ;
var lunrData = null ;
// Download index data
$ . ajax ( {
url : "<%= search_index_path %>" ,
cache : true ,
method : 'GET' ,
success : function ( data ) {
lunrData = data ;
lunrIndex = lunr . Index . load ( lunrData . index ) ;
}
} ) ;
深く感謝します:
middleman-alias
拡張機能用のジャグザドラム。これを開発するために使用しました。middleman-lunrjs
およびmiddleman-lunr
拡張機能。これを作成する際のインスピレーションとなりました。lunr.js
貢献者