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