Установка | Обзор | Токенизация | Стемминг | Стоп-слова | Индекс поиска | Индексная стратегия
Js Search обеспечивает эффективный поиск объектов JavaScript и JSON на стороне клиента. Он совместим с ES5 и не требует jQuery или каких-либо других сторонних библиотек.
Js Search начинался как облегченная реализация Lunr JS, предлагающая повышение производительности во время выполнения и меньший размер файла. С тех пор он расширился и теперь включает богатый набор функций, поддерживающих стемминг, стоп-слова и ранжирование TF-IDF.
Вот несколько тестов JS Perf, сравнивающих две библиотеки поиска. (Спасибо Olivernn за настройку Лунра для лучшего сравнения!)
Если вы ищете более простую, оптимизированную для веб-работников утилиту поиска JS, обратите внимание на js-worker-search.
Вы можете установить его с помощью Bower или NPM следующим образом:
npm install js-search
bower install js-search
На высоком уровне вы настраиваете Js Search, сообщая ему, какие поля он должен индексировать для поиска, а затем добавляете объекты для поиска.
Например, простое использование JS Search будет выглядеть следующим образом:
import * as JsSearch from 'js-search' ;
var theGreatGatsby = {
isbn : '9781597226769' ,
title : 'The Great Gatsby' ,
author : {
name : 'F. Scott Fitzgerald'
} ,
tags : [ 'book' , 'inspirational' ]
} ;
var theDaVinciCode = {
isbn : '0307474275' ,
title : 'The DaVinci Code' ,
author : {
name : 'Dan Brown'
} ,
tags : [ 'book' , 'mystery' ]
} ;
var angelsAndDemons = {
isbn : '074349346X' ,
title : 'Angels & Demons' ,
author : {
name : 'Dan Brown' ,
} ,
tags : [ 'book' , 'mystery' ]
} ;
var search = new JsSearch . Search ( 'isbn' ) ;
search . addIndex ( 'title' ) ;
search . addIndex ( [ 'author' , 'name' ] ) ;
search . addIndex ( 'tags' )
search . addDocuments ( [ theGreatGatsby , theDaVinciCode , angelsAndDemons ] ) ;
search . search ( 'The' ) ; // [theGreatGatsby, theDaVinciCode]
search . search ( 'scott' ) ; // [theGreatGatsby]
search . search ( 'dan' ) ; // [angelsAndDemons, theDaVinciCode]
search . search ( 'mystery' ) // [angelsAndDemons, theDaVinciCode]
Токенизация — это процесс разбиения текста (например, предложений) на более мелкие, доступные для поиска токены (например, слова или части слов). Js Search предоставляет базовый токенизатор, который должен хорошо работать на английском языке, но вы можете предоставить свой собственный, например:
search . tokenizer = {
tokenize ( text /* string */ ) {
// Convert text to an Array of strings and return the Array
}
} ;
Стемминг — это процесс сведения токенов поиска к их корню (или «основе»), чтобы поиск различных форм слова по-прежнему давал результаты. Например, слова «поиск», «поиск» и «искалось» можно свести к основе «поиск».
Js Search не реализует собственную библиотеку стемминга, но поддерживает стемминг посредством использования сторонних библиотек.
Чтобы включить стемминг, используйте StemmingTokenizer
следующим образом:
var stemmer = require ( 'porter-stemmer' ) . stemmer ;
search . tokenizer =
new JsSearch . StemmingTokenizer (
stemmer , // Function should accept a string param and return a string
new JsSearch . SimpleTokenizer ( ) ) ;
Стоп-слова очень распространены (например, a, an, the, of) и часто не имеют семантического значения. По умолчанию Js Search не фильтрует эти слова, но фильтрацию можно включить с помощью StopWordsTokenizer
следующим образом:
search . tokenizer =
new JsSearch . StopWordsTokenizer (
new JsSearch . SimpleTokenizer ( ) ) ;
По умолчанию Js Search использует слегка измененную версию стоп-слов из истории Google, перечисленных на сайте www.ranks.nl/stopwords. Вы можете изменить этот список стоп-слов, добавляя или удаляя значения из объекта JsSearch.StopWordsMap
следующим образом:
JsSearch . StopWordsMap . the = false ; // Do not treat "the" as a stop word
JsSearch . StopWordsMap . bob = true ; // Treat "bob" as a stop word
Обратите внимание, что стоп-слова пишутся строчными буквами, поэтому использование дезинфицирующего средства, чувствительного к регистру, может помешать удалению некоторых стоп-слов.
В состав js-search
входят два поисковых индекса.
Частота термина — обратная частота документов (или TF-IDF) — это числовая статистика, предназначенная для отражения того, насколько важно слово (или слова) для документа в корпусе. Значение TF-IDF увеличивается пропорционально количеству раз, когда слово появляется в документе, но компенсируется частотой этого слова в корпусе. Это помогает скорректировать тот факт, что некоторые слова (например, and или the) встречаются чаще, чем другие.
По умолчанию Js Search поддерживает ранжирование TF-IDF, но это можно отключить из соображений производительности, если это не требуется. Вы можете указать альтернативную реализацию ISearchIndex
, чтобы отключить TF-IDF, например:
// default
search . searchIndex = new JsSearch . TfIdfSearchIndex ( ) ;
// Search index capable of returning results matching a set of tokens
// but without any meaningful rank or order.
search . searchIndex = new JsSearch . UnorderedSearchIndex ( ) ;
В js-search
включены три стратегии индексирования.
Индексы PrefixIndexStrategy
для поиска по префиксам. (например, термин «кот» индексируется как «c», «ca» и «cat», что позволяет осуществлять поиск по префиксу).
Индексы AllSubstringsIndexStrategy
для всех подстрок. Другими словами, «c», «ca», «cat», «a», «at» и «t» соответствуют слову «cat».
Индексы ExactWordIndexStrategy
для точного совпадения слов. Например, «боб» будет соответствовать «бобу Джонсу» (а «бо» — нет).
По умолчанию Js Search поддерживает индексацию префиксов, но это можно настроить. Вы можете указать альтернативную реализацию IIndexStrategy
, чтобы отключить индексацию префикса, например:
// default
search . indexStrategy = new JsSearch . PrefixIndexStrategy ( ) ;
// this index strategy is built for all substrings matches.
search . indexStrategy = new JsSearch . AllSubstringsIndexStrategy ( ) ;
// this index strategy is built for exact word matches.
search . indexStrategy = new JsSearch . ExactWordIndexStrategy ( ) ;