LunrJS-basierte Suche nach Middleman.
Fügen Sie diese Zeile zur Gemfile Ihrer Anwendung hinzu:
gem 'middleman-search'
Und dann ausführen:
$ bundle
Oder installieren Sie es selbst als:
$ gem install middleman-search
Sie müssen das Modul in Ihrer config.rb
aktivieren und der Erweiterung mitteilen, wie Ihre Ressourcen indiziert werden sollen:
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
Wobei resources
eine Liste mit den URL-Anfängen der zu indizierenden Ressourcen ist (getestet mit String#start_with?
), index_path
der relative Pfad der generierten Indexdatei auf Ihrer Site und fields
ein Hash mit einem Eintrag für jedes Feld ist zu indizieren, mit einem Hash von Optionen verbunden:
boost
Gibt den Lunr-Relevanz-Boost an, wenn dieses Feld durchsucht wirdstore
Gibt an, ob dieses Feld in der Dokumentzuordnung gespeichert werden soll (siehe unten), der Standardwert ist „false“.index
Gibt an, ob dieses Feld indiziert werden soll. Der Standardwert ist „true“.required
Die Ressource wird nicht indiziert, wenn ein als erforderlich markiertes Feld einen leeren oder Nullwert hat Beachten Sie, dass automatisch eine spezielle Feld id
mit einer automatisch generierten Kennung eingefügt wird, die als ref
für das Dokument verwendet wird.
Alle Feldwerte werden aus den data
(d. h. ihrem Ausgangsmaterial) oder aus den options
in den resource.metadata
(d. h. allen auf einer proxy
-Seite angegebenen Optionen) abgerufen, mit Ausnahme von:
url
die die tatsächliche Ressourcen-URL istcontent
Der aus der gerenderten Ressource extrahierte Text, ohne dessen Layout einzubeziehen Anschließend können Sie den Index von Javascript über das lunrIndex
-Objekt abfragen (weitere Informationen finden Sie in der Indexdatei):
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 ] ) ;
}
} ) ;
(Danke @Jeepler für die Anpassung des Lodash v3-Codes, den wir früher bei Manas verwendet haben)
Dieses Juwel enthält Assets für alternative Sprachen, die von MihaiValentin/lunr-sprachen bereitgestellt werden. Eine Liste der verfügbaren Sprachen finden Sie in diesem Repository.
Wenn Sie mit einer Sprache arbeiten möchten, die nicht enthalten ist, richten Sie eine lunr.yourlang.js
Datei in einem Ordner in Ihrem Projekt ein und fügen Sie diesen Ordner zu lunr_dirs
hinzu, damit das Gem weiß, wo es danach suchen muss.
Sie können den Inhalt, der pro Ressource indiziert und gespeichert werden soll, vollständig anpassen, indem Sie einen before_index
Rückruf definieren:
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
Diese Option akzeptiert einen Rückruf, der für jede Ressource ausgeführt wird, und zwar mit dem zu indizierenden Dokument und der zu speichernden Karte, in den Objekten index
und docs
der Ausgabe (siehe unten) sowie der Ressource verarbeitet wird. Sie können diesen Rückruf verwenden, um eine davon zu ändern, oder throw(:skip)
um die betreffende Ressource zu überspringen.
In einigen Fällen möchten Sie möglicherweise neue Funktionen zur Lunr-Pipeline hinzufügen, sowohl für die Erstellung der Indizierung als auch für die Suche. Sie können dies tun, indem Sie einen pipeline
Hash mit Funktionsnamen und Text bereitstellen, zum Beispiel:
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
Dadurch wird die tildes
-Funktion in der Lunr-Pipeline registriert und beim Erstellen des Index hinzugefügt. Aus der Lunr-Dokumentation:
Funktionen in der Pipeline werden mit drei Argumenten aufgerufen: dem aktuell verarbeiteten Token; der Index dieses Tokens im Token-Array und die gesamte Liste der Token, die Teil des verarbeiteten Dokuments sind. Dies ermöglicht eine einfache Unigramm-Verarbeitung von Token sowie eine anspruchsvollere N-Gramm-Verarbeitung.
Die Funktion sollte die verarbeitete Version des Textes zurückgeben, die wiederum an die nächste Funktion in der Pipeline übergeben wird. Durch die Rückgabe von „undefiniert“ wird die weitere Verarbeitung des Tokens verhindert, und das Token gelangt nicht in den Index.
Beachten Sie, dass, wenn Sie der Pipeline eine Funktion hinzufügen, diese auch beim Deserialisieren des Indexes geladen wird und lunr mit der Fehlermeldung Cannot load un-registered function: tildes
fehlschlägt, wenn sie nicht erneut registriert wurde. Sie können sie entweder manuell registrieren oder einfach Folgendes in eine .js.erb
Datei einfügen, die vor dem Laden des Index ausgeführt werden soll:
<%= search_lunr_js_pipeline %>
Die generierte Indexdatei enthält ein JSON-Objekt mit zwei Eigenschaften:
index
enthält den serialisierten lunr.js-Index, den Sie über lunr.Index.load(lunrData.index)
laden können.docs
ist eine Zuordnung der automatisch generierten Dokument-IDs zu einem Objekt, das die für die Speicherung konfigurierten Attribute enthält Normalerweise laden Sie den index
in eine Lunr-Indexinstanz und verwenden dann die docs
, um den zurückgegebenen Wert nachzuschlagen und ihn dem Benutzer anzuzeigen.
Sie sollten auch die Datei lunr.min.js
in Ihrer Haupt-Sprockets-Javascript-Datei require
(bei Verwendung der Asset-Pipeline), um den Index tatsächlich laden zu können:
//= require lunr.min
Wenn Sie die i18n-Funktionen von lunr nutzen, sollten Sie auch die Stemmer-Unterstützungs- und Sprachdateien (in dieser Reihenfolge) hier laden:
//= require lunr.min
//= require lunr.stemmer.support
//= require lunr.es
Die Middleman-Pipeline (falls aktiviert) enthält standardmäßig keine json
-Dateien. Sie können dies jedoch leicht ändern, indem Sie .json
zur exts
Option der entsprechenden Erweiterungen hinzufügen, z. B. gzip
und asset_hash
:
activate :asset_hash do | asset_hash |
asset_hash . exts << '.json'
end
Beachten Sie, dass Sie, wenn Sie die Index-JSON-Datei über die Asset-Hash-Erweiterung ausführen, die tatsächliche Ziel-URL abrufen müssen, wenn Sie die Datei für die Suche in den Browser laden, indem Sie den Ansichtshelfer search_index_path
“ verwenden:
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 ) ;
}
} ) ;
Ein großes Dankeschön an:
middleman-alias
Erweiterung, in der wir diese Erweiterung entwickelt haben.middleman-lunrjs
und middleman-lunr
Erweiterungen, die als Inspiration für die Erstellung dieses Produkts dienten.lunr.js
Mitwirkenden