Un analizador sencillo para la sintaxis de consultas de búsqueda avanzada.
Analiza una cadena como esta:
from:[email protected],[email protected] to:me subject:vacations date:1/10/2013-15/04/2014 photos
Y lo convierte en un objeto como este:
{
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'
Puede configurar qué palabras clave y rangos debe aceptar el analizador con el argumento de opciones. Acepta 5 valores:
keywords
, que pueden estar separadas por comas (,). Acepta una serie de cadenas.ranges
, que pueden estar separados por un guión (-). Acepta una serie de cadenas.tokenize
, que controla el comportamiento de los términos de búsqueda de texto. Si se establece en true
, los términos de texto que no son palabras clave se devuelven como una matriz de cadenas donde cada término de la matriz es una palabra separada por espacios en blanco o un término de varias palabras entre comillas simples o dobles.alwaysArray
, un booleano que controla el comportamiento de la consulta devuelta. Si se establece en true
, todas las palabras clave coincidentes siempre serán matrices en lugar de cadenas. Si se establece en false
serán cadenas si coinciden con un solo valor. El valor predeterminado es false
.offsets
, un booleano que controla el comportamiento de la consulta devuelta. Si se establece en true
, la consulta contendrá el objeto de compensaciones. Si se establece en false
, la consulta no contendrá el objeto de compensaciones. El valor predeterminado es true
. Si no se especifican palabras clave o rangos, o si no hay ninguno presente en la consulta de búsqueda dada, searchQuery.parse
devolverá una cadena si tokenize
es falso, o una matriz de cadenas debajo del text
de la clave si tokenize
es verdadero.
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']
También puedes usar la sintaxis de exclusión, como -from:[email protected] name:hello,world
. Esto también funciona con términos de texto que no son palabras clave cuando tokenize
se establece en true
.
{
name : [ 'hello' , 'world' ] ,
exclude : {
from : [ '[email protected]' ]
}
}
A veces, comprobar si una palabra clave contiene una cadena o no puede ser excesivo y propenso a errores; A menudo es más fácil esperar que todo sea una matriz, incluso si eso significa hacer bucles de 1 iteración con frecuencia.
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']
// }
El objeto de compensaciones podría volverse bastante grande con consultas de búsqueda largas, lo que podría suponer un uso innecesario de espacio si ninguna funcionalidad depende de ello. Simplemente se puede desactivar usando la opción offsets: false
.
En cualquier momento, puede regresar y cadenar la consulta de búsqueda analizada. Esto podría resultar útil si desea manipular el objeto de consulta de búsqueda analizado.
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
Los tipos de mecanografiado están disponibles para esta biblioteca en el directorio docs
. Explore la documentación de tipo aquí.
La documentación se genera usando node_modules/.bin/typedoc index.d.ts
Las 29 pruebas se escriben utilizando el marco de pruebas BDD debería.js y se ejecutan con mocha.
Ejecute npm install should
y npm install -g mocha
para instalar ambos.
Ejecute pruebas con make test
.
La licencia MIT (MIT)
Derechos de autor (c) 2014
Por el presente se otorga permiso, sin cargo, a cualquier persona que obtenga una copia de este software y los archivos de documentación asociados (el "Software"), para operar con el Software sin restricciones, incluidos, entre otros, los derechos de uso, copia, modificación, fusión. , publicar, distribuir, sublicenciar y/o vender copias del Software, y permitir que las personas a quienes se les proporciona el Software lo hagan, sujeto a las siguientes condiciones:
El aviso de derechos de autor anterior y este aviso de permiso se incluirán en todas las copias o partes sustanciales del Software.
EL SOFTWARE SE PROPORCIONA "TAL CUAL", SIN GARANTÍA DE NINGÚN TIPO, EXPRESA O IMPLÍCITA, INCLUYENDO PERO NO LIMITADO A LAS GARANTÍAS DE COMERCIABILIDAD, IDONEIDAD PARA UN PROPÓSITO PARTICULAR Y NO INFRACCIÓN. EN NINGÚN CASO LOS AUTORES O TITULARES DE DERECHOS DE AUTOR SERÁN RESPONSABLES DE NINGÚN RECLAMO, DAÑO U OTRA RESPONSABILIDAD, YA SEA EN UNA ACCIÓN CONTRACTUAL, AGRAVIO O DE OTRA MANERA, QUE SURJA DE, FUERA DE O EN RELACIÓN CON EL SOFTWARE O EL USO U OTRAS NEGOCIOS EN EL SOFTWARE.