Простой синтаксический анализатор расширенного поискового запроса.
Он анализирует строку следующим образом:
from:[email protected],[email protected] to:me subject:vacations date:1/10/2013-15/04/2014 photos
И превращает его в такой объект:
{
from : [ '[email protected]' , '[email protected]' ] ,
to : 'me' ,
subject : 'vacations' ,
date : {
from : '1/10/2013' ,
to : '15/04/2014'
} ,
text : 'photos' ,
offsets :
[ { keyword : 'from' , value : '[email protected],[email protected]' , offsetStart : 0 , offsetEnd : 32 } ,
{ keyword : 'to' , value : 'me' , offsetStart : 33 , offsetEnd : 38 } ,
{ keyword : 'subject' , value : 'vacations' , offsetStart : 39 , offsetEnd : 56 } ,
{ keyword : 'date' , value : '1/10/2013-15/04/2014' , offsetStart : 57 , offsetEnd : 82 } ,
{ text : 'photos' , offsetStart : 83 , offsetEnd : 89 } ]
}
$ npm install search-query-parser
var searchQuery = require ( 'search-query-parser' ) ;
var query = 'from:[email protected],[email protected] to:me subject:vacations date:1/10/2013-15/04/2014 photos' ;
var options = { keywords : [ 'from' , 'to' , 'subject' ] , ranges : [ 'date' ] }
var searchQueryObj = searchQuery . parse ( query , options ) ;
// searchQueryObj.from is now ['[email protected]', '[email protected]']
// searchQueryObj.to is now 'me'
// searchQueryObj.date is now {from: '1/10/2013', to: '15/04/2014'}
// searchQueryObj.text is now 'photos'
Вы можете настроить, какие ключевые слова и диапазоны должен принимать синтаксический анализатор, с помощью аргумента options. Он принимает 5 значений:
keywords
, которые могут быть разделены запятыми (,). Принимает массив строк.ranges
, которые могут быть разделены дефисом (-). Принимает массив строк.tokenize
, который управляет поведением условий текстового поиска. Если установлено значение true
, текстовые термины, не являющиеся ключевыми словами, возвращаются в виде массива строк, где каждый термин в массиве представляет собой слово, разделенное пробелами, или термин, состоящий из нескольких слов, заключенный в одинарные или двойные кавычки.alwaysArray
— логическое значение, управляющее поведением возвращаемого запроса. Если установлено значение true
, все соответствующие ключевые слова всегда будут массивами, а не строками. Если установлено значение false
они будут строками, если им соответствует одно значение. По умолчанию установлено значение false
.offsets
— логическое значение, которое управляет поведением возвращаемого запроса. Если установлено значение true
, запрос будет содержать объект смещений. Если установлено значение false
, запрос не будет содержать объект смещений. По умолчанию true
. Если ключевые слова или диапазоны не указаны или их нет в данном поисковом запросе, то searchQuery.parse
вернет строку, если tokenize
имеет значение false, или массив строк под ключевым text
, если tokenize
имеет значение true.
var searchQuery = require ( 'search-query-parser' ) ;
var query = 'a query with "just text"' ;
var parsedQuery = searchQuery . parse ( query ) ;
// parsedQuery is now 'a query with "just text"'
var options = { keywords : [ 'unused' ] } ;
var parsedQueryWithOptions = searchQuery . parse ( query , options ) ;
// parsedQueryWithOptions is now 'a query with "just text"'
var options2 = { tokenize : true } ;
var parsedQueryWithTokens = searchQuery . parse ( query , options2 ) ;
// parsedQueryWithTokens is now: ['a', 'query', 'with', 'just text']
Вы также можете использовать синтаксис исключения, например -from:[email protected] name:hello,world
. Это также работает с текстовыми терминами, не являющимися ключевыми словами, если для tokenize
установлено значение true
.
{
name : [ 'hello' , 'world' ] ,
exclude : {
from : [ '[email protected]' ]
}
}
Иногда проверка того, содержит ли ключевое слово строку или нет, может быть чрезмерной и подвержена ошибкам; часто проще просто ожидать, что все представляет собой массив, даже если это означает частое выполнение циклов с 1 итерацией.
var searchQuery = require ( 'search-query-parser' ) ;
var query = 'test:helloworld fun:yay,happy' ;
var options = { keywords : [ 'test' , 'fun' ] } ;
var parsedQueryWithOptions = searchQuery . parse ( query , options ) ;
// parsedQueryWithOptions is now:
// {
// test: 'helloworld',
// fun: ['yay', 'happy']
// }
var optionsAlwaysArray = { keywords : [ 'test' , 'fun' ] , alwaysArray : true } ;
var parsedQueryWithOptions = searchQuery . parse ( query , options ) ;
// parsedQueryWithOptions is now:
// {
// test: ['helloworld'], //No need to check whether test is a string or not!
// fun: ['yay', 'happy']
// }
Объект offsets может стать довольно огромным из-за длинных поисковых запросов, что может привести к ненужному использованию пространства, если от него не зависит никакая функциональность. Его можно просто отключить, используя опцию offsets: false
.
В любой момент вы можете вернуться и преобразовать проанализированный поисковый запрос в строку. Это может быть удобно, если вы хотите манипулировать анализируемым объектом поискового запроса.
var searchQuery = require ( 'search-query-parser' ) ;
var query = 'from:[email protected],[email protected] to:me subject:vacations date:1/10/2013-15/04/2014 photos' ;
var options = { keywords : [ 'from' , 'to' , 'subject' ] , ranges : [ 'date' ] }
var searchQueryObj = searchQuery . parse ( query , options ) ;
searchQueryObj . to = 'you' ;
var newQuery = searchQuery . stringify ( query , options ) ;
// newQuery is now: photos from:[email protected],[email protected] to:you subject:vacations date:1/10/2013-15/04/2014
Типы Typescript доступны для этой библиотеки в каталоге docs
. Просмотрите документацию по типам здесь.
Документация генерируется с использованием node_modules/.bin/typedoc index.d.ts
29 тестов написаны с использованием среды тестирования BDD must.js и запускаются с помощью mocha.
Запустите npm install should
и npm install -g mocha
чтобы установить их оба.
Запустите тесты с помощью make test
.
Лицензия MIT (MIT)
Авторское право (с) 2014 г.
Настоящим бесплатно любому лицу, получившему копию этого программного обеспечения и связанных с ним файлов документации («Программное обеспечение»), предоставляется разрешение на работу с Программным обеспечением без ограничений, включая, помимо прочего, права на использование, копирование, изменение, объединение. публиковать, распространять, сублицензировать и/или продавать копии Программного обеспечения, а также разрешать лицам, которым предоставлено Программное обеспечение, делать это при соблюдении следующих условий:
Вышеупомянутое уведомление об авторских правах и данное уведомление о разрешении должны быть включены во все копии или существенные части Программного обеспечения.
ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИЯМИ ТОВАРНОЙ ЦЕННОСТИ, ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ И НЕНАРУШЕНИЯ ПРАВ. НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ АВТОРЫ ИЛИ ОБЛАДАТЕЛИ АВТОРСКИХ ПРАВ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЕТЕНЗИИ, УБЫТКИ ИЛИ ДРУГУЮ ОТВЕТСТВЕННОСТЬ, БУДЬ В ДЕЙСТВИЯХ ПО КОНТРАКТУ, ПРАВОНАРУШЕНИЮ ИЛИ ДРУГИМ ОБРАЗОМ, ВОЗНИКАЮЩИЕ ОТ, ИЗ ИЛИ В СВЯЗИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ИСПОЛЬЗОВАНИЕМ ИЛИ ДРУГИМИ СДЕЛКАМИ, ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ.