Sphinxql Query Builder für node.js schrieb in TypeScript. Machen Sie einfache Abfragen, um zu vermeiden, dass Sie immer rohe Sphinxql -Saiten schreiben können. Standardmäßig verwendet es entkommene Abfrageparameter und denken immer in Sicherheit.
Es ist stark in den PHP Sphinxql-Query-Builder und den eloquenten Querybauer (Laravel Framework ORM) inspiriert.
Der für das Erstellen von Connection verwendete Client ist MySQL2, der sich auf Leistung konzentriert.
Sie müssen node.js> = 6.x verwenden
Führen Sie einfach den Befehl npm aus:
npm install --save sphinxqlUm eine einfache Verbindung zu erstellen (nicht die am meisten empfohlene, verwenden Sie eine Poolverbindung) und schreiben Sie Ihre erste Abfrage, tun Sie dies einfach:
const { Sphinxql , Expression } = require ( 'sphinxql' ) ;
const sphql = Sphinxql . createConnection ( {
host : 'localhost' ,
port : 9306
} ) ;
sphql . getQueryBuilder ( )
. select ( '*' )
. from ( 'books' )
. match ( 'title' , 'harry potter' )
. where ( 'created_at' , '<' , Expression . raw ( 'YEAR()' ) )
. between ( Expression . raw ( `YEAR(created_at)` ) , 2014 , 2019 )
. orderBy ( { 'date_published' : 'ASC' , 'price' : 'DESC' } )
. limit ( 10 )
. execute ( )
. then ( ( result , fields ) => {
console . log ( result ) ;
} )
. catch ( err => {
console . log ( err ) ;
} ) ; Es gibt zwei mögliche Möglichkeiten, eine Verbindung zwischen Ihrer Anwendung und dem Manticore/Sphinx -Server zu erstellen. Erstens und einfachste verwendet die createConnection -Methode.
const { Sphinxql } = require ( 'sphinxql' ) ;
const sphql = Sphinxql . createConnection ( {
host : 'localhost' ,
port : 9306
} ) ; Die zweite Option besteht darin, createPoolConnection -Methode zu verwenden. Mit dieser Methodik können Sie mehrere offene Verbindungen mit Manticore/Sphinx haben, die frühere Verbindungen wiederverwenden. Weitere Informationen zu MySQL2 -Verbindungspools (zulässige Parameter für die Erstellung und Konfiguration des Pools) lesen Sie die MySQL2 -Dokumentation zur Verwendung von Verbindungspools. Diese Technik verwendet mehr Speicher, also seien Sie sich bewusst.
const { Sphinxql } = require ( 'sphinxql' ) ;
// Create the connection pool. The pool-specific settings are the defaults
const sphql = Sphinxql . createPoolConnection ( {
host : 'localhost' ,
port : 9306 ,
waitForConnections : true ,
connectionLimit : 10 ,
queueLimit : 0
} ) ;Dieser Abschnitt ist in vielen Teilen getrennt, aber wenn Sie Sphinxql zuvor oder SQL verwendet haben, können Sie diesen Abschnitt auch für Sie sehr einfach sehen. Wie auch immer, ich empfehle dringend, die Manticore -Suche oder die Sphinx -Dokumentation zu lesen, um eine gute Vorstellung davon zu machen, wie diese API verwendet werden kann.
Beispiel hier:
sphql . getQueryBuilder ( )
. select ( 'id' , 'author_id' , 'publication_date' )
. from ( 'books' )
. match ( '*' , '"harry potter"' , false )
. whereIn ( 'lang' , [ 'en' , 'sp' , 'fr' ] )
. between ( Expression . raw ( `YEAR(publication_date)` ) , 2008 , 2015 )
. execute ( )
. then ( ( result , fields ) => {
console . log ( result ) ;
} )
. catch ( err => {
console . log ( err ) ;
} ) ; Sie können mehrere Optionen mithilfe der Methode "Option" ketten. Der Methodenkopf ist:
Beispiel mit Option:
sphql . getQueryBuilder ( )
. select ( 'id' , 'author_id' , 'publication_date' )
. from ( 'books' )
. match ( '*' , '"harry potter"' , false )
. between ( Expression . raw ( `YEAR(publication_date)` ) , 2008 , 2015 )
. orderBy ( { 'publication_date' : 'ASC' , 'price' : 'DESC' } )
. limit ( 10 )
. option ( 'rank_fields' , 'title content' )
. option ( 'field_weights' , { title : 100 , content : 1 } )
. execute ( )
. then ( ( result , fields ) => {
console . log ( result ) ;
} )
. catch ( err => {
console . log ( err ) ;
} ) ; // todo
Eine Einfügungsanweisung wird so erstellt:
const document = {
id : 1 ,
content : 'this is the first post for the blog...' ,
title : 'First post'
} ;
connection . getQueryBuilder ( )
. insert ( 'my_rtindex' , document )
. execute ( )
. then ( ( result , fields ) => {
console . log ( result ) ;
} )
. catch ( err => {
console . log ( err ) ;
} ) ;Oder verwenden Sie ein Array von Schlüsselwertpaaren, um mehrere Werte in dieselbe Abfrage einzulegen
const document = [ {
id : 1 ,
content : 'this is the first post for the blog...' ,
title : 'First post'
} , {
id : 2 ,
content : 'this is the second post for the blog...' ,
title : 'Second post'
} ] ;
connection . getQueryBuilder ( )
. insert ( 'my_rtindex' , document )
. execute ( )
. then ( ( result ) => {
console . log ( result ) ;
} )
. catch ( err => {
console . log ( err ) ;
} ) ;Ersetzt ein Dokument mit der DOC -ID oder dem Einfügen. Ähnlich wie bei der Einfügung Anweisung nur Ändern des Einsatzes für Ersatz.
const document = {
id : 1 ,
content : 'this is the first post for the blog...' ,
title : 'UPDATE! First post'
} ;
connection . getQueryBuilder ( )
. replace ( 'my_rtindex' , document )
. execute ( )
. then ( ( result ) => {
console . log ( result ) ;
} )
. catch ( err => {
console . log ( err ) ;
} ) ; const document = {
content : 'UPDATE! it's an old post. this is the first post for the blog...' ,
title : 'First post (edit)'
} ;
connection . getQueryBuilder ( )
. update ( 'my_rtindex' )
. set ( document )
. match ( 'fullname' , 'John' )
. where ( 'salary' , '<' , 3000 )
. execute ( )
. then ( ( result , fields ) => {
console . log ( result ) ;
} )
. catch ( err => {
console . log ( err ) ;
} ) ;Dieses Paket wird auch mit Unterstützung von Transaktionen unterstützt. Denken Sie daran, dass Transaktionen nur für RT -Indizes verfügbar sind. Weitere Informationen finden Sie unter Dokumentation der Transaktionen für die Manticore -Suche.
Die Transaktionen -API ist einfach und die Liste der Methoden ist hier unten:
Alle diese Methoden geben ein Versprechensobjekt zurück.
Ein einfaches Beispiel, das mit Transaktionen arbeitet:
const document = {
id : 1 ,
content : 'this is the first post for the blog...' ,
title : 'First post'
} ;
const insertDocumentAndCommit = async ( doc ) => {
await connection . getQueryBuilder ( ) . transaction . begin ( ) ;
connection . getQueryBuilder ( )
. insert ( 'my_rtindex' , doc )
. execute ( )
. then ( ( result , fields ) => {
console . log ( result ) ;
} )
. catch ( err => {
console . log ( err ) ;
} ) ;
await connection . getQueryBuilder ( ) . transaction . commit ( ) ;
return true ;
}
insertDocumentAndCommit ( document ) ;Zunächst müssen Sie die Grenzen von Multi -Fragen in Manticore/Sphinx kennen. Wie in Manticore Search und Sphinx Dokumentation feststellte, gibt es nur Unterstützung für die folgenden Aussagen, die in einer Stapel verwendet werden:
Dies sagte, jetzt ist der Moment, um Code zu schreiben. Es gibt eine Klasse, die Warteschlange , die nur die erforderlichen Methoden implementiert. Es ist nützlich, Multi -Abfragen auszuführen. Um Multi -Anweisungen zu aktivieren, müssen Sie in Ihrem Konfigurationsobjekt für die Verbindungserstellung die Multiplestatements angeben: Richtig wie folgt:
const { Sphinxql } = require ( 'sphinxql' ) ;
const sphql = Sphinxql . createConnection ( {
host : 'localhost' ,
port : 9306 ,
multipleStatements : true
} ) ;Erstellen wir nun eine Warteschlange und verarbeiten sie:
const { Queue , Sphinxql } = require ( 'sphinxql' ) ;
const sphql = Sphinxql . createConnection ( {
host : 'localhost' ,
port : 9306 ,
multipleStatements : true
} ) ;
const queue = new Queue ( sphql . getConnection ( ) ) ;
queue
. push ( sphql . getQueryBuilder ( ) . select ( '*' ) . from ( 'rt' ) . where ( 'id' , '=' , 1 ) )
. push (
sphql . getQueryBuilder ( )
. select ( 'id' , 'author_id' , 'publication_date' )
. from ( 'books' )
. match ( '*' , '"harry potter"' , false )
) ;
queue . process ( )
. then ( results => {
console . log ( results . results . length ) // 2
} )
. catch ( err => console . log ( err ) ) ;Lesen Sie mehr über den Anhangsindex in Manticore Documantation, um diese Anweisung zu verwenden. Siehe Beispiel unten:
connection . getQueryBuilder ( )
. attachIndex ( 'my_disk_index' )
. to ( 'my_rt_index' )
. withTruncate ( ) // this method is optional
. execute ( )
. then ( ( result , fields ) => {
console . log ( result ) ;
} )
. catch ( err => {
console . log ( err ) ;
} ) ; Lesen Sie mehr über Flush Rtindex, um diese Anweisung zu verwenden, siehe Beispiel unten):
connection . getQueryBuilder ( )
. flushRTIndex ( 'my_rt_index' )
. execute ( )
. then ( ( result , fields ) => {
console . log ( result ) ;
} )
. catch ( err => {
console . log ( err ) ;
} ) ; Lesen Sie mehr über Tricate RTIndex in Manticore Documantation, um diese Anweisung zu verwenden, siehe Beispiel unten:
connection . getQueryBuilder ( )
. truncate ( 'my_rt_index' )
. withReconfigure ( ) // this method is optional
. execute ( )
. then ( ( result , fields ) => {
console . log ( result ) ;
} )
. catch ( err => {
console . log ( err ) ;
} ) ; Lesen Sie den Reload -Index in Manticore Documantation, um diese Anweisung zu verwenden. Siehe Beispiel unten:
connection . getQueryBuilder ( )
. reloadIndex ( 'my_index' )
. from ( '/home/mighty/new_index_files' ) // this method is optional
. then ( ( result , fields ) => {
console . log ( result ) ;
} )
. catch ( err => {
console . log ( err ) ;
} ) ;Führen Sie RAW -Abfragen mit der Abfragethode aus, die nach dem Call -GetQueryBuilder -Methode verfügbar ist. Diese Methode ermöglicht eine vorbereitete Anweisung mit einem? (Fragezeichen) wo Sie dem Wert entkommen möchten.
connection . getQueryBuilder ( )
. query ( `SELECT * FROM sales WHERE MATCH(@title "italian lamp") AND tags IN (?, ?)` , [ 'home' , 'italian style' ] )
. then ( ( result , fields ) => {
console . log ( result ) ;
} )
. catch ( err => {
console . log ( err ) ;
} ) ; Alle Aussagen haben eine endgültige Methode, die intern zur Ausführung von Abfragen verwendet wird. Diese Methode ist außerhalb von generate () erhältlich und gibt eine Zeichenfolge mit der endgültigen Abfrage zurück.
const sphinxqlQuery = connection . getQueryBuilder ( )
. select ( 'user_id' , 'product_id' , Expression . raw ( 'SUM(product_price) as total' ) . getExpression ( ) )
. from ( 'rt_sales' )
. facet ( ( f ) => {
return f
. fields ( [ 'category_id' ] )
. by ( [ 'category_id' ] )
} )
. facet ( ( f ) => {
return f
. field ( 'brand_id' )
. orderBy ( Expression . raw ( 'facet()' ) )
. limit ( 5 )
} )
. generate ( ) ;
console . log ( sphinxqlQuery ) ; // SELECT user_id, product_id, SUM(product_price) as total FROM rt_sales FACET category_id BY category_id FACET brand_id ORDER BY facet() DESC LIMIT 5