mirror of https://github.com/pelias/api.git
Peter Johnson
9 years ago
12 changed files with 213 additions and 27 deletions
@ -0,0 +1,48 @@ |
|||||||
|
|
||||||
|
var peliasQuery = require('pelias-query'); |
||||||
|
|
||||||
|
//------------------------------
|
||||||
|
// autocomplete query
|
||||||
|
//------------------------------
|
||||||
|
var query = new peliasQuery.layout.FilteredBooleanQuery(); |
||||||
|
|
||||||
|
// mandatory matches
|
||||||
|
query.score( peliasQuery.view.ngrams, 'must' ); |
||||||
|
|
||||||
|
// scoring boost
|
||||||
|
query.score( peliasQuery.view.phrase ); |
||||||
|
query.score( peliasQuery.view.focus ); |
||||||
|
|
||||||
|
// --------------------------------
|
||||||
|
|
||||||
|
/** |
||||||
|
map request variables to query variables for all inputs |
||||||
|
provided by this HTTP request. |
||||||
|
**/ |
||||||
|
function generateQuery( clean ){ |
||||||
|
|
||||||
|
var vs = new peliasQuery.Vars( peliasQuery.defaults ); |
||||||
|
|
||||||
|
// input text
|
||||||
|
vs.var( 'input:name', clean.text ); |
||||||
|
|
||||||
|
// always 10 (not user definable due to caching)
|
||||||
|
vs.var( 'size', 10 ); |
||||||
|
|
||||||
|
// focus point
|
||||||
|
if( clean.lat && clean.lon ){ |
||||||
|
vs.set({ |
||||||
|
'focus:point:lat': clean.lat, |
||||||
|
'focus:point:lon': clean.lon |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
var result = query.render( vs ); |
||||||
|
|
||||||
|
console.log( JSON.stringify( result, null, 2 ) ); |
||||||
|
|
||||||
|
// @todo: remove this hack
|
||||||
|
return JSON.parse( JSON.stringify( result ) ); |
||||||
|
} |
||||||
|
|
||||||
|
module.exports = generateQuery; |
@ -0,0 +1,63 @@ |
|||||||
|
|
||||||
|
module.exports = { |
||||||
|
'query': { |
||||||
|
'filtered': { |
||||||
|
'query': { |
||||||
|
'bool': { |
||||||
|
'must': [{ |
||||||
|
'match': { |
||||||
|
'name.default': { |
||||||
|
'query': 'test', |
||||||
|
'boost': 1, |
||||||
|
'analyzer': 'peliasOneEdgeGram' |
||||||
|
} |
||||||
|
} |
||||||
|
}], |
||||||
|
'should': [{ |
||||||
|
'match': { |
||||||
|
'phrase.default': { |
||||||
|
'query': 'test', |
||||||
|
'analyzer': 'peliasPhrase', |
||||||
|
'type': 'phrase', |
||||||
|
'boost': 1, |
||||||
|
'slop': 2 |
||||||
|
} |
||||||
|
} |
||||||
|
}, { |
||||||
|
'function_score': { |
||||||
|
'query': { |
||||||
|
'match': { |
||||||
|
'phrase.default': { |
||||||
|
'analyzer': 'peliasPhrase', |
||||||
|
'type': 'phrase', |
||||||
|
'boost': 1, |
||||||
|
'slop': 2, |
||||||
|
'query': 'test' |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
'functions': [{ |
||||||
|
'linear': { |
||||||
|
'center_point': { |
||||||
|
'origin': { |
||||||
|
'lat': 29.49136, |
||||||
|
'lon': -82.50622 |
||||||
|
}, |
||||||
|
'offset': '1km', |
||||||
|
'scale': '50km', |
||||||
|
'decay': 0.5 |
||||||
|
} |
||||||
|
} |
||||||
|
}], |
||||||
|
'score_mode': 'avg', |
||||||
|
'boost_mode': 'replace' |
||||||
|
} |
||||||
|
}] |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
'sort': [ '_score' ], |
||||||
|
'size': 10, |
||||||
|
'track_scores': true |
||||||
|
}; |
@ -0,0 +1,34 @@ |
|||||||
|
|
||||||
|
module.exports = { |
||||||
|
'query': { |
||||||
|
'filtered': { |
||||||
|
'query': { |
||||||
|
'bool': { |
||||||
|
'must': [{ |
||||||
|
'match': { |
||||||
|
'name.default': { |
||||||
|
'query': 'test', |
||||||
|
'boost': 1, |
||||||
|
'analyzer': 'peliasOneEdgeGram' |
||||||
|
} |
||||||
|
} |
||||||
|
}], |
||||||
|
'should': [{ |
||||||
|
'match': { |
||||||
|
'phrase.default': { |
||||||
|
'query': 'test', |
||||||
|
'analyzer': 'peliasPhrase', |
||||||
|
'type': 'phrase', |
||||||
|
'boost': 1, |
||||||
|
'slop': 2 |
||||||
|
} |
||||||
|
} |
||||||
|
}] |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
'sort': [ '_score' ], |
||||||
|
'size': 10, |
||||||
|
'track_scores': true |
||||||
|
}; |
@ -0,0 +1,56 @@ |
|||||||
|
|
||||||
|
var generate = require('../../../query/autocomplete'); |
||||||
|
var parser = require('../../../helper/query_parser'); |
||||||
|
|
||||||
|
module.exports.tests = {}; |
||||||
|
|
||||||
|
module.exports.tests.interface = function(test, common) { |
||||||
|
test('valid interface', function(t) { |
||||||
|
t.equal(typeof generate, 'function', 'valid function'); |
||||||
|
t.end(); |
||||||
|
}); |
||||||
|
}; |
||||||
|
function foo( a, b ){ |
||||||
|
console.log( '----------------' ); |
||||||
|
console.log( JSON.stringify( a, null, 2 ) ); |
||||||
|
console.log( '----------------' ); |
||||||
|
console.log( JSON.stringify( b, null, 2 ) ); |
||||||
|
console.log( '----------------' ); |
||||||
|
} |
||||||
|
|
||||||
|
module.exports.tests.query = function(test, common) { |
||||||
|
test('valid lingustic-only autocomplete', function(t) { |
||||||
|
var query = generate({ |
||||||
|
text: 'test' |
||||||
|
}); |
||||||
|
|
||||||
|
var expected = require('../fixture/autocomplete_linguistic_only'); |
||||||
|
|
||||||
|
t.deepEqual(query, expected, 'valid autocomplete query'); |
||||||
|
t.end(); |
||||||
|
}); |
||||||
|
|
||||||
|
test('autocomplete + focus', function(t) { |
||||||
|
var query = generate({ |
||||||
|
text: 'test', |
||||||
|
lat: 29.49136, |
||||||
|
lon: -82.50622 |
||||||
|
}); |
||||||
|
|
||||||
|
var expected = require('../fixture/autocomplete_linguistic_focus'); |
||||||
|
|
||||||
|
t.deepEqual(query, expected, 'valid autocomplete query'); |
||||||
|
t.end(); |
||||||
|
}); |
||||||
|
}; |
||||||
|
|
||||||
|
module.exports.all = function (tape, common) { |
||||||
|
|
||||||
|
function test(name, testFunction) { |
||||||
|
return tape('autocomplete query ' + name, testFunction); |
||||||
|
} |
||||||
|
|
||||||
|
for( var testCase in module.exports.tests ){ |
||||||
|
module.exports.tests[testCase](test, common); |
||||||
|
} |
||||||
|
}; |
Loading…
Reference in new issue