Middleman에 대한 LunrJS 기반 검색입니다.
애플리케이션의 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
각 필드에 대해 하나의 항목이 있는 해시입니다. 연관된 옵션 해시를 사용하여 색인을 생성합니다.
boost
이 필드를 검색할 때 lunr 관련성 향상을 지정합니다.store
이 필드를 문서 맵에 저장할지 여부(아래 참조), 기본값은 false입니다.index
이 필드를 색인화할지 여부, 기본값은 true입니다.required
필수로 표시된 필드에 비어 있거나 null 값이 있으면 리소스가 인덱싱되지 않습니다. 문서의 ref
로 사용되는 자동 생성 식별자와 함께 특수 필드 id
자동으로 포함됩니다.
모든 필드 값은 다음을 제외하고 리소스 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 ] ) ;
}
} ) ;
(Manas에서 사용했던 lodash v3 코드를 적용해 준 @Jeepler에게 감사드립니다)
이 gem에는 MihaiValentin/lunr-langs에서 제공하는 대체 언어용 자산이 포함되어 있습니다. 사용 가능한 언어 목록은 해당 저장소를 참조하세요.
포함되지 않은 언어로 작업하려면 프로젝트의 폴더에 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
그러면 lunr 파이프라인에 tildes
기능이 등록되고 인덱스를 빌드할 때 추가됩니다. Lunr 문서에서:
파이프라인의 함수는 세 가지 인수, 즉 처리 중인 현재 토큰과 함께 호출됩니다. 토큰 배열에 있는 해당 토큰의 인덱스와 처리 중인 문서의 전체 토큰 목록 부분입니다. 이를 통해 토큰의 간단한 유니그램 처리뿐만 아니라 보다 정교한 n-그램 처리도 가능합니다.
함수는 텍스트의 처리된 버전을 반환해야 하며, 이는 다시 파이프라인의 다음 함수로 전달됩니다. 정의되지 않은 값을 반환하면 토큰이 더 이상 처리되지 않으며 해당 토큰은 인덱스에 포함되지 않습니다.
파이프라인에 함수를 추가하면 인덱스를 역직렬화할 때 해당 함수도 로드되며, 다시 등록되지 않은 경우 lunr은 Cannot load un-registered function: tildes
오류와 함께 실패합니다. 수동으로 등록하거나 인덱스를 로드하기 전에 실행할 .js.erb
파일에 다음을 포함할 수 있습니다.
<%= search_lunr_js_pipeline %>
생성된 인덱스 파일에는 두 가지 속성이 있는 JSON 개체가 포함되어 있습니다.
index
에는 lunr.Index.load(lunrData.index)
통해 로드할 수 있는 직렬화된 lunr.js 인덱스가 포함되어 있습니다.docs
자동 생성된 문서 ID를 스토리지용으로 구성된 속성이 포함된 객체로 매핑한 것입니다. 일반적으로 lunr 인덱스 인스턴스에 index
로드한 다음 docs
맵을 사용하여 반환된 값을 조회하고 사용자에게 제공합니다.
또한 실제로 인덱스를 로드하려면 기본 스프로킷 자바스크립트 파일(자산 파이프라인을 사용하는 경우)에 lunr.min.js
파일이 require
.
//= require lunr.min
lunr의 i18n 기능을 사용하는 경우 Stemmer 지원 및 언어 파일(순서대로)도 여기에 로드해야 합니다.
//= require lunr.min
//= require lunr.stemmer.support
//= require lunr.es
미들맨 파이프라인(활성화된 경우)은 기본적으로 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
확장을 위한 Jagthedrummer입니다. 우리는 이것을 개발하기 위해 기반을 두었습니다.middleman-lunrjs
및 middleman-lunr
확장을 위한 jnovos 및 256dpi는 이것을 만드는 데 영감을 주었습니다.lunr.js
기여자