Pembangun permintaan sphinxql untuk node.js menulis dalam naskah. Buat pertanyaan yang mudah menghindari untuk menulis string sphinxql mentah selalu yang Anda bisa. Secara default, ia menggunakan parameter kueri yang melarikan diri, selalu berpikir dalam keamanan.
Ini sangat terinspirasi dalam php sphinxql-query-builder dan juga pembangun permintaan yang fasih (Laravel Framework ORM)
Klien yang digunakan untuk Create Connection adalah MySQL2 yang difokuskan dalam kinerja.
Anda harus menggunakan node.js> = 6.x
Cukup jalankan perintah NPM:
npm install --save sphinxqlUntuk membuat koneksi sederhana (bukan yang paling disarankan, gunakan koneksi kumpulan) dan tulis kueri pertama Anda, lakukan saja:
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 ) ;
} ) ; Ada dua cara yang mungkin untuk membuat koneksi antara aplikasi Anda dan server Manticore/Sphinx. Pertama dan paling sederhana adalah menggunakan metode createConnection .
const { Sphinxql } = require ( 'sphinxql' ) ;
const sphql = Sphinxql . createConnection ( {
host : 'localhost' ,
port : 9306
} ) ; Opsi kedua adalah menggunakan metode createPoolConnection . Metodologi ini memungkinkan Anda untuk memiliki beberapa koneksi terbuka dengan Manticore/Sphinx menggunakan kembali koneksi sebelumnya. Untuk mempelajari lebih lanjut tentang kumpulan koneksi MySQL2 (parameter yang diizinkan untuk pembuatan dan konfigurasi kumpulan) Baca dokumentasi MySQL2 tentang penggunaan kumpulan koneksi. Teknik ini menggunakan lebih banyak memori jadi berhati -hatilah.
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
} ) ;Bagian ini dipisahkan dalam banyak bagian tetapi jika Anda telah menggunakan sphinxql sebelum atau SQL Anda dapat melihat bagian ini juga sangat mendasar untuk Anda. Ngomong -ngomong, saya sangat merekomendasikan untuk membaca Dokumentasi Pencarian Manticore atau Sphinx untuk membuat ide bagus tentang cara menggunakan API ini.
Contoh di sini:
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 ) ;
} ) ; Anda dapat rantai beberapa opsi menggunakan metode "opsi". Metode kepala adalah:
Contoh dengan opsi:
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
Pernyataan insert dibuat seperti ini:
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 ) ;
} ) ;Atau menggunakan array pasangan nilai kunci untuk memasukkan beberapa nilai dalam kueri yang sama
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 ) ;
} ) ;Menggantikan dokumen menggunakan ID DOC atau Sisipkan. Mirip dengan pernyataan insert hanya mengubah insert untuk diganti.
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 ) ;
} ) ;Paket ini juga dilengkapi dengan dukungan untuk transaksi. Ingatlah bahwa transaksi hanya tersedia untuk indeks RT. Untuk informasi lebih lanjut, kunjungi dokumentasi transaksi untuk pencarian Manticore.
API Transaksi sederhana dan daftar metode ada di bawah ini:
Semua metode ini mengembalikan objek janji.
Contoh sederhana yang bekerja dengan transaksi:
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 ) ;Pertama -tama Anda perlu mengetahui keterbatasan multi kueri di Manticore/Sphinx. Seperti yang dicari Manticore dan dokumentasi Sphinx mengatakan hanya ada dukungan untuk pernyataan berikut yang digunakan dalam batch:
Mengatakan ini, sekarang adalah momen untuk menulis kode. Ada kelas, antrian , yang menerapkan hanya metode yang diperlukan, adalah berguna untuk menjalankan multi kueri. Untuk mengaktifkan multi pernyataan, Anda harus menentukan dalam objek konfigurasi Anda untuk pembuatan koneksi Multiplestatements: Benar sebagai berikut:
const { Sphinxql } = require ( 'sphinxql' ) ;
const sphql = Sphinxql . createConnection ( {
host : 'localhost' ,
port : 9306 ,
multipleStatements : true
} ) ;Sekarang mari kita buat antrian dan prosesnya:
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 ) ) ;Baca Tentang Lampirkan Indeks di Manticore Documantation untuk menggunakan pernyataan ini lihat contoh di bawah ini:
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 ) ;
} ) ; Baca tentang flush rtindex untuk menggunakan pernyataan ini lihat contoh di bawah):
connection . getQueryBuilder ( )
. flushRTIndex ( 'my_rt_index' )
. execute ( )
. then ( ( result , fields ) => {
console . log ( result ) ;
} )
. catch ( err => {
console . log ( err ) ;
} ) ; Baca tentang truncate rtindex di Manticore documantation untuk menggunakan pernyataan ini lihat contoh di bawah ini:
connection . getQueryBuilder ( )
. truncate ( 'my_rt_index' )
. withReconfigure ( ) // this method is optional
. execute ( )
. then ( ( result , fields ) => {
console . log ( result ) ;
} )
. catch ( err => {
console . log ( err ) ;
} ) ; Baca tentang Reload Index di Manticore Documantation untuk menggunakan pernyataan ini lihat contoh di bawah ini:
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 ) ;
} ) ;Jalankan kueri mentah menggunakan metode kueri yang tersedia setelah metode call getQueryBuilder. Metode ini memungkinkan pernyataan yang disiapkan menggunakan A? (tanda tanya) Di mana Anda ingin lepas dari nilainya.
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 ) ;
} ) ; Semua pernyataan memiliki metode akhir yang digunakan secara internal untuk menjalankan kueri. Metode ini tersedia di luar menggunakan generate () dan mengembalikan string dengan kueri akhir.
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