Limestone, a Node.js connector to Sphinx search server, is a quite handy library written by Serge Shirokov.

In using Limestone for some of my work recently, though, I found that it was missing proper support for geosearch, i.e., searching by distance given latitude-longitude pairs. I’ve augmented the library to support a geo-search only application that I recently built.

Clone my fork of Limestone from: https://github.com/gc20/limestone.

Sample code:

var filter_floatrange = {  
    'type':2, //FLOATRANGE  
    'min':0,  
    'max': mymiles * 1.161 * 1000, // converted to km  
    'attr':'@geodist'  
}

var ganchor = {  
    'attrlat':'latitude',  
    'attrlong':'longitude',  
    'lat': mylat * (3.14159265/180),
    'long': mylon *(3.14159265/180)  
}

var sort = 4; // Extended search  
var sortby = '@geodist ASC';

limestone.connect(9312, function(err) {  
    if (!err) {  
        limestone.query({'query':'Robbery',
          sort: sort, sortby: sortby,
          indices:'geo', anchor:[ganchor],
          filters:[filter_floatrange]},
          function(err, answer){  
            if (!err) {  
                console.log("Extended search yielded " +
                  answer.match_count + " results: " + 
                  JSON.stringify(answer));  
            } else {  
                console.log('Request error: ' + err);  
            }  
        });  
    } else {  
        console.log('Error on search: ' + err);  
    }  
});