mirror of https://github.com/pelias/api.git
Peter Johnson a.k.a. insertcoffee
9 years ago
18 changed files with 1052 additions and 1066 deletions
@ -1,33 +1,52 @@ |
|||||||
|
|
||||||
var queries = require('geopipes-elasticsearch-backend').queries, |
var peliasQuery = require('pelias-query'), |
||||||
sort = require('./sort'); |
sort = require('./sort'); |
||||||
|
|
||||||
function generate( params ){ |
//------------------------------
|
||||||
|
// reverse geocode query
|
||||||
|
//------------------------------
|
||||||
|
var query = new peliasQuery.layout.FilteredBooleanQuery(); |
||||||
|
|
||||||
var centroid = { |
// scoring boost
|
||||||
lat: params.lat, |
query.sort( peliasQuery.view.sort_distance ); |
||||||
lon: params.lon |
|
||||||
}; |
|
||||||
|
|
||||||
var query = queries.distance( centroid, { |
// non-scoring hard filters
|
||||||
size: params.size || 1, |
query.filter( peliasQuery.view.boundary_circle ); |
||||||
sort: true, |
|
||||||
distance: '500km' |
// --------------------------------
|
||||||
|
|
||||||
|
function generateQuery( clean ){ |
||||||
|
|
||||||
|
var vs = new peliasQuery.Vars( peliasQuery.defaults ); |
||||||
|
|
||||||
|
// set defaults
|
||||||
|
vs.set({ |
||||||
|
'size': 1, |
||||||
|
'boundary:circle:radius': '500km' |
||||||
}); |
}); |
||||||
|
|
||||||
query.sort = query.sort.concat( sort( params ) ); |
// set size
|
||||||
|
if( clean.size ){ |
||||||
|
vs.var( 'size', clean.size ); |
||||||
|
} |
||||||
|
|
||||||
if ( params.categories && params.categories.length > 0 ) { |
// focus point centroid
|
||||||
addCategoriesFilter( query, params.categories ); |
if( clean.lat && clean.lon ){ |
||||||
|
vs.set({ |
||||||
|
// focus point to score by distance
|
||||||
|
'focus:point:lat': clean.lat, |
||||||
|
'focus:point:lon': clean.lon, |
||||||
|
|
||||||
|
// bounding circle
|
||||||
|
'boundary:circle:lat': clean.lat, |
||||||
|
'boundary:circle:lon': clean.lon, |
||||||
|
}); |
||||||
} |
} |
||||||
|
|
||||||
return query; |
var result = query.render( vs ); |
||||||
} |
|
||||||
|
|
||||||
function addCategoriesFilter( query, categories ) { |
// @todo: remove this hack
|
||||||
query.query.filtered.filter.bool.must.push({ |
return JSON.parse( JSON.stringify( result ) ); |
||||||
terms: { category: categories } |
|
||||||
}); |
|
||||||
} |
} |
||||||
|
|
||||||
module.exports = generate; |
module.exports = generateQuery; |
||||||
|
@ -1,188 +1,161 @@ |
|||||||
|
|
||||||
var queries = require('geopipes-elasticsearch-backend').queries, |
var peliasQuery = require('pelias-query'), |
||||||
sort = require('../query/sort'), |
sort = require('../query/sort'), |
||||||
adminFields = require('../helper/adminFields')(), |
adminFields = require('../helper/adminFields')(); |
||||||
addressWeights = require('../helper/address_weights'); |
|
||||||
|
|
||||||
|
//------------------------------
|
||||||
|
// general-purpose search query
|
||||||
|
//------------------------------
|
||||||
|
var query = new peliasQuery.layout.FilteredBooleanQuery(); |
||||||
|
|
||||||
function generate( params ){ |
// mandatory matches
|
||||||
var centroid = null; |
query.score( peliasQuery.view.boundary_country, 'must' ); |
||||||
|
query.score( peliasQuery.view.ngrams, 'must' ); |
||||||
|
|
||||||
if ( params.lat && params.lon ){ |
// scoring boost
|
||||||
centroid = { |
query.score( peliasQuery.view.phrase ); |
||||||
lat: params.lat, |
query.score( peliasQuery.view.focus ); |
||||||
lon: params.lon |
|
||||||
}; |
// address components
|
||||||
}
|
query.score( peliasQuery.view.address('housenumber') ); |
||||||
|
query.score( peliasQuery.view.address('street') ); |
||||||
|
query.score( peliasQuery.view.address('postcode') ); |
||||||
|
|
||||||
|
// admin components
|
||||||
|
query.score( peliasQuery.view.admin('alpha3') ); |
||||||
|
query.score( peliasQuery.view.admin('admin0') ); |
||||||
|
query.score( peliasQuery.view.admin('admin1') ); |
||||||
|
query.score( peliasQuery.view.admin('admin1_abbr') ); |
||||||
|
query.score( peliasQuery.view.admin('admin2') ); |
||||||
|
query.score( peliasQuery.view.admin('local_admin') ); |
||||||
|
query.score( peliasQuery.view.admin('locality') ); |
||||||
|
query.score( peliasQuery.view.admin('neighborhood') ); |
||||||
|
|
||||||
|
// non-scoring hard filters
|
||||||
|
query.filter( peliasQuery.view.boundary_circle ); |
||||||
|
query.filter( peliasQuery.view.boundary_rect ); |
||||||
|
|
||||||
|
// --------------------------------
|
||||||
|
|
||||||
var query = queries.distance( centroid, { size: params.size } ); |
function generateQuery( clean ){ |
||||||
var text = params.text; |
|
||||||
|
|
||||||
if (params.bbox) { |
var vs = new peliasQuery.Vars( peliasQuery.defaults ); |
||||||
query = queries.bbox ( centroid, { size: params.size, bbox: params.bbox } ); |
|
||||||
|
// set input text
|
||||||
|
vs.var( 'input:name', clean.text ); |
||||||
|
|
||||||
|
// set size
|
||||||
|
if( clean.size ){ |
||||||
|
vs.var( 'size', clean.size ); |
||||||
} |
} |
||||||
|
|
||||||
query.query.filtered.query = { |
// focus point
|
||||||
'bool': { |
if( clean.lat && clean.lon ){ |
||||||
'must': [], |
vs.set({ |
||||||
'should': [] |
'focus:point:lat': clean.lat, |
||||||
} |
'focus:point:lon': clean.lon |
||||||
}; |
}); |
||||||
|
} |
||||||
if (params.parsed_text) { |
|
||||||
// update text
|
|
||||||
if (params.parsed_text.number && params.parsed_text.street) { |
|
||||||
text = params.parsed_text.number + ' ' + params.parsed_text.street; |
|
||||||
} else if (params.parsed_text.admin_parts) { |
|
||||||
text = params.parsed_text.name; |
|
||||||
} |
|
||||||
|
|
||||||
addParsedMatch(query, text, params.parsed_text); |
// bbox
|
||||||
|
if( clean.bbox ){ |
||||||
|
vs.set({ |
||||||
|
'boundary:rect:top': clean.bbox.top, |
||||||
|
'boundary:rect:right': clean.bbox.right, |
||||||
|
'boundary:rect:bottom': clean.bbox.bottom, |
||||||
|
'boundary:rect:left': clean.bbox.left |
||||||
|
}); |
||||||
} |
} |
||||||
|
|
||||||
// add search condition to distance query
|
// address parsing
|
||||||
query.query.filtered.query.bool.must.push({
|
if( clean.parsed_text ){ |
||||||
'match': { |
|
||||||
'name.default': { |
// is it a street address?
|
||||||
'query': text, |
var isStreetAddress = clean.parsed_text.hasOwnProperty('number') && clean.parsed_text.hasOwnProperty('street'); |
||||||
'analyzer': 'peliasOneEdgeGram' |
if( isStreetAddress ){ |
||||||
} |
vs.var( 'input:name', clean.parsed_text.number + ' ' + clean.parsed_text.street ); |
||||||
} |
} |
||||||
}); |
|
||||||
|
// I don't understand this
|
||||||
// add phrase matching query
|
else if( clean.parsed_text.admin_parts ) { |
||||||
// note: this is required for shingle/phrase matching
|
vs.var( 'input:name', clean.parsed_text.name ); |
||||||
query.query.filtered.query.bool.should.push({ |
|
||||||
'match': { |
|
||||||
'phrase.default': { |
|
||||||
'query': text, |
|
||||||
'analyzer': 'peliasPhrase', |
|
||||||
'type': 'phrase', |
|
||||||
'slop': 2 |
|
||||||
} |
|
||||||
} |
} |
||||||
}); |
|
||||||
|
|
||||||
query.sort = query.sort.concat( sort( params ) ); |
// or this..
|
||||||
|
else { |
||||||
|
console.warn( 'chaos monkey asks: what happens now?' ); |
||||||
|
console.log( clean ); |
||||||
|
try{ throw new Error(); } catch(e){ console.error( e.stack ); } // print a stack trace
|
||||||
|
} |
||||||
|
|
||||||
return query; |
// ==== add parsed matches [address components] ====
|
||||||
} |
|
||||||
|
|
||||||
/** |
// house number
|
||||||
* Traverse the parsed text object, containing all the address parts detected in query string. |
if( clean.parsed_text.hasOwnProperty('number') ){ |
||||||
* Add matches to query for each identifiable component. |
vs.var( 'input:housenumber', clean.parsed_text.number ); |
||||||
* |
} |
||||||
* @param {Object} query |
|
||||||
* @param {string} defaultText |
|
||||||
* @param {Object} parsedText |
|
||||||
*/ |
|
||||||
function addParsedMatch(query, defaultText, parsedText) { |
|
||||||
query.query.filtered.query.bool.should = query.query.filtered.query.bool.should || []; |
|
||||||
|
|
||||||
// copy expected admin fields so we can remove them as we parse the address
|
|
||||||
var unmatchedAdminFields = adminFields.slice(); |
|
||||||
|
|
||||||
// address
|
|
||||||
// number, street, postalcode
|
|
||||||
addMatch(query, unmatchedAdminFields, 'address.number', parsedText.number, addressWeights.number); |
|
||||||
addMatch(query, unmatchedAdminFields, 'address.street', parsedText.street, addressWeights.street); |
|
||||||
addMatch(query, unmatchedAdminFields, 'address.zip', parsedText.postalcode, addressWeights.zip); |
|
||||||
|
|
||||||
// city
|
|
||||||
// admin2, locality, local_admin, neighborhood
|
|
||||||
addMatch(query, unmatchedAdminFields, 'admin2', parsedText.city, addressWeights.admin2); |
|
||||||
|
|
||||||
// state
|
|
||||||
// admin1, admin1_abbr
|
|
||||||
addMatch(query, unmatchedAdminFields, 'admin1_abbr', parsedText.state, addressWeights.admin1_abbr); |
|
||||||
|
|
||||||
// country
|
|
||||||
// admin0, alpha3
|
|
||||||
addMatch(query, unmatchedAdminFields, 'alpha3', parsedText.country, addressWeights.alpha3); |
|
||||||
|
|
||||||
addUnmatchedAdminFieldsToQuery(query, unmatchedAdminFields, parsedText, defaultText); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
// street name
|
||||||
* Check for additional admin fields in the parsed input, and if any was found |
if( clean.parsed_text.hasOwnProperty('street') ){ |
||||||
* combine into single string and match against all unmatched admin fields. |
vs.var( 'input:street', clean.parsed_text.street ); |
||||||
* |
} |
||||||
* @param {Object} query |
|
||||||
* @param {Array} unmatchedAdminFields |
|
||||||
* @param {Object} parsedInput |
|
||||||
* @param {string} defaultInput |
|
||||||
*/ |
|
||||||
function addUnmatchedAdminFieldsToQuery(query, unmatchedAdminFields, parsedInput, defaultInput) { |
|
||||||
if (unmatchedAdminFields.length === 0 ) { |
|
||||||
return; |
|
||||||
} |
|
||||||
|
|
||||||
var leftovers = []; |
// postal code
|
||||||
|
if( clean.parsed_text.hasOwnProperty('postalcode') ){ |
||||||
|
vs.var( 'input:postcode', clean.parsed_text.postalcode ); |
||||||
|
} |
||||||
|
|
||||||
if (parsedInput.admin_parts) { |
// ==== add parsed matches [admin components] ====
|
||||||
leftovers.push(parsedInput.admin_parts); |
|
||||||
} |
|
||||||
else if (parsedInput.regions) { |
|
||||||
leftovers.push(parsedInput.regions); |
|
||||||
} |
|
||||||
|
|
||||||
if (leftovers.length === 0) { |
// city
|
||||||
return; |
if( clean.parsed_text.hasOwnProperty('city') ){ |
||||||
} |
vs.var( 'input:admin2', clean.parsed_text.city ); |
||||||
|
} |
||||||
|
|
||||||
leftovers = leftovers.join(' '); |
// state
|
||||||
|
if( clean.parsed_text.hasOwnProperty('state') ){ |
||||||
|
vs.var( 'input:admin1_abbr', clean.parsed_text.state ); |
||||||
|
} |
||||||
|
|
||||||
// if there are additional regions/admin_parts found
|
// country
|
||||||
if (leftovers !== defaultInput) { |
if( clean.parsed_text.hasOwnProperty('country') ){ |
||||||
unmatchedAdminFields.forEach(function (key) { |
vs.var( 'input:alpha3', clean.parsed_text.country ); |
||||||
// combine all the leftover parts into one string
|
} |
||||||
addMatch(query, [], key, leftovers); |
|
||||||
}); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/** |
// ==== deal with the 'leftover' components ====
|
||||||
* Add key:value match to query. Apply boost if specified. |
// @todo: clean up this code
|
||||||
* |
|
||||||
* @param {Object} query |
|
||||||
* @param {Array} unmatched |
|
||||||
* @param {string} key |
|
||||||
* @param {string|number|undefined} value |
|
||||||
* @param {number|undefined} [boost] optional |
|
||||||
*/ |
|
||||||
function addMatch(query, unmatched, key, value, boost) { // jshint ignore:line
|
|
||||||
if (typeof value === 'undefined') { |
|
||||||
return; |
|
||||||
} |
|
||||||
|
|
||||||
var match = {}; |
// a concept called 'leftovers' which is just 'admin_parts' /or 'regions'.
|
||||||
|
var leftoversString = ''; |
||||||
|
if( clean.parsed_text.hasOwnProperty('admin_parts') ){ |
||||||
|
leftoversString = clean.parsed_text.admin_parts; |
||||||
|
} |
||||||
|
else if( clean.parsed_text.hasOwnProperty('regions') ){ |
||||||
|
leftoversString = clean.parsed_text.regions.join(' '); |
||||||
|
} |
||||||
|
|
||||||
if (boost) { |
// if we have 'leftovers' then assign them to any fields which
|
||||||
match[key] = { |
// currently don't have a value assigned.
|
||||||
query: value, |
if( leftoversString.length ){ |
||||||
boost: boost |
var unmatchedAdminFields = adminFields.slice(); |
||||||
}; |
|
||||||
} |
// cycle through fields and set fields which
|
||||||
else { |
// are still currently unset
|
||||||
match[key] = value; |
unmatchedAdminFields.forEach( function( key ){ |
||||||
|
if( !vs.isset( 'input:' + key ) ){ |
||||||
|
vs.var( 'input:' + key, leftoversString ); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
} |
} |
||||||
|
|
||||||
query.query.filtered.query.bool.should.push({ 'match': match }); |
var result = query.render( vs ); |
||||||
|
|
||||||
removeFromUnmatched(unmatched, key); |
// @todo: remove unnessesary sort conditions
|
||||||
} |
result.sort = result.sort.concat( sort( clean ) ); |
||||||
|
|
||||||
/** |
// @todo: remove this hack
|
||||||
* If key is found in unmatched list, remove it from the array |
return JSON.parse( JSON.stringify( result ) ); |
||||||
* |
|
||||||
* @param {Array} unmatched |
|
||||||
* @param {string} key |
|
||||||
*/ |
|
||||||
function removeFromUnmatched(unmatched, key) { |
|
||||||
var index = unmatched.indexOf(key); |
|
||||||
if (index !== -1) { |
|
||||||
unmatched.splice(index, 1); |
|
||||||
} |
|
||||||
} |
} |
||||||
|
|
||||||
module.exports = generate; |
module.exports = generateQuery; |
||||||
|
@ -0,0 +1,43 @@ |
|||||||
|
|
||||||
|
module.exports = { |
||||||
|
'query': { |
||||||
|
'filtered': { |
||||||
|
'query': { |
||||||
|
'bool': {} |
||||||
|
}, |
||||||
|
'filter': { |
||||||
|
'bool': { |
||||||
|
'must': [ |
||||||
|
{ |
||||||
|
'geo_distance': { |
||||||
|
'distance': '500km', |
||||||
|
'distance_type': 'plane', |
||||||
|
'optimize_bbox': 'indexed', |
||||||
|
'_cache': true, |
||||||
|
'center_point': { |
||||||
|
'lat': 29.49136, |
||||||
|
'lon': -82.50622 |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
] |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
'sort': [ |
||||||
|
'_score', |
||||||
|
{ |
||||||
|
'_geo_distance': { |
||||||
|
'center_point': { |
||||||
|
'lat': 29.49136, |
||||||
|
'lon': -82.50622 |
||||||
|
}, |
||||||
|
'order': 'asc', |
||||||
|
'distance_type': 'plane' |
||||||
|
} |
||||||
|
} |
||||||
|
], |
||||||
|
'size': 1, |
||||||
|
'track_scores': true |
||||||
|
}; |
@ -0,0 +1,206 @@ |
|||||||
|
|
||||||
|
var peliasQuery = require('pelias-query'), |
||||||
|
vs = new peliasQuery.Vars( peliasQuery.defaults ); |
||||||
|
|
||||||
|
module.exports = { |
||||||
|
'query': { |
||||||
|
'filtered': { |
||||||
|
'query': { |
||||||
|
'bool': { |
||||||
|
'must': [{ |
||||||
|
'match': { |
||||||
|
'name.default': { |
||||||
|
'query': '123 main st', |
||||||
|
'analyzer': 'peliasOneEdgeGram', |
||||||
|
'boost': 1 |
||||||
|
} |
||||||
|
} |
||||||
|
}], |
||||||
|
'should': [{ |
||||||
|
'match': { |
||||||
|
'phrase.default': { |
||||||
|
'query': '123 main st', |
||||||
|
'analyzer': 'peliasPhrase', |
||||||
|
'type': 'phrase', |
||||||
|
'slop': 2, |
||||||
|
'boost': 1 |
||||||
|
} |
||||||
|
} |
||||||
|
},{ |
||||||
|
'match': { |
||||||
|
'address.number': { |
||||||
|
'query': 123, |
||||||
|
'boost': vs.var('address:housenumber:boost').get(), |
||||||
|
'analyzer': vs.var('address:housenumber:analyzer').get() |
||||||
|
} |
||||||
|
} |
||||||
|
}, { |
||||||
|
'match': { |
||||||
|
'address.street': { |
||||||
|
'query': 'main st', |
||||||
|
'boost': vs.var('address:street:boost').get(), |
||||||
|
'analyzer': vs.var('address:street:analyzer').get() |
||||||
|
} |
||||||
|
} |
||||||
|
}, { |
||||||
|
'match': { |
||||||
|
'address.zip': { |
||||||
|
'query': 10010, |
||||||
|
'boost': vs.var('address:postcode:boost').get(), |
||||||
|
'analyzer': vs.var('address:postcode:analyzer').get() |
||||||
|
} |
||||||
|
} |
||||||
|
}, { |
||||||
|
'match': { |
||||||
|
'alpha3': { |
||||||
|
'query': 'USA', |
||||||
|
'boost': vs.var('admin:alpha3:boost').get(), |
||||||
|
'analyzer': vs.var('admin:alpha3:analyzer').get() |
||||||
|
} |
||||||
|
} |
||||||
|
}, { |
||||||
|
'match': { |
||||||
|
'admin0': { |
||||||
|
'query': 'new york', |
||||||
|
'boost': vs.var('admin:admin0:boost').get(), |
||||||
|
'analyzer': vs.var('admin:admin0:analyzer').get() |
||||||
|
} |
||||||
|
} |
||||||
|
}, { |
||||||
|
'match': { |
||||||
|
'admin1': { |
||||||
|
'query': 'new york', |
||||||
|
'boost': vs.var('admin:admin1:boost').get(), |
||||||
|
'analyzer': vs.var('admin:admin1:analyzer').get() |
||||||
|
} |
||||||
|
} |
||||||
|
}, { |
||||||
|
'match': { |
||||||
|
'admin1_abbr': { |
||||||
|
'query': 'NY', |
||||||
|
'boost': vs.var('admin:admin1_abbr:boost').get(), |
||||||
|
'analyzer': vs.var('admin:admin1_abbr:analyzer').get() |
||||||
|
} |
||||||
|
} |
||||||
|
}, { |
||||||
|
'match': { |
||||||
|
'admin2': { |
||||||
|
'query': 'new york', |
||||||
|
'boost': vs.var('admin:admin2:boost').get(), |
||||||
|
'analyzer': vs.var('admin:admin2:analyzer').get() |
||||||
|
} |
||||||
|
} |
||||||
|
}, { |
||||||
|
'match': { |
||||||
|
'local_admin': { |
||||||
|
'query': 'new york', |
||||||
|
'boost': vs.var('admin:local_admin:boost').get(), |
||||||
|
'analyzer': vs.var('admin:local_admin:analyzer').get() |
||||||
|
} |
||||||
|
} |
||||||
|
}, { |
||||||
|
'match': { |
||||||
|
'locality': { |
||||||
|
'query': 'new york', |
||||||
|
'boost': vs.var('admin:locality:boost').get(), |
||||||
|
'analyzer': vs.var('admin:locality:analyzer').get() |
||||||
|
} |
||||||
|
} |
||||||
|
}, { |
||||||
|
'match': { |
||||||
|
'neighborhood': { |
||||||
|
'query': 'new york', |
||||||
|
'boost': vs.var('admin:neighborhood:boost').get(), |
||||||
|
'analyzer': vs.var('admin:neighborhood:analyzer').get() |
||||||
|
} |
||||||
|
} |
||||||
|
}] |
||||||
|
} |
||||||
|
}, |
||||||
|
'filter': { |
||||||
|
'bool': { |
||||||
|
'must': [] |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
'size': 10, |
||||||
|
'sort': [ |
||||||
|
'_score', |
||||||
|
{ |
||||||
|
'_script': { |
||||||
|
'file': 'admin_boost', |
||||||
|
'type': 'number', |
||||||
|
'order': 'desc' |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
'_script': { |
||||||
|
'file': 'popularity', |
||||||
|
'type': 'number', |
||||||
|
'order': 'desc' |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
'_script': { |
||||||
|
'file': 'population', |
||||||
|
'type': 'number', |
||||||
|
'order': 'desc' |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
'_script': { |
||||||
|
'params': { |
||||||
|
'weights': { |
||||||
|
'admin0': 4, |
||||||
|
'admin1': 3, |
||||||
|
'admin2': 2, |
||||||
|
'local_admin': 1, |
||||||
|
'locality': 1, |
||||||
|
'neighborhood': 1 |
||||||
|
} |
||||||
|
}, |
||||||
|
'file': 'weights', |
||||||
|
'type': 'number', |
||||||
|
'order': 'desc' |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
'_script': { |
||||||
|
'params': { |
||||||
|
'category_weights': { |
||||||
|
'transport:air': 2, |
||||||
|
'transport:air:aerodrome': 2, |
||||||
|
'transport:air:airport': 2 |
||||||
|
} |
||||||
|
}, |
||||||
|
'file': 'category', |
||||||
|
'type': 'number', |
||||||
|
'order': 'desc' |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
'_script': { |
||||||
|
'params': { |
||||||
|
'weights': { |
||||||
|
'geoname': 0, |
||||||
|
'address': 4, |
||||||
|
'osmnode': 6, |
||||||
|
'osmway': 6, |
||||||
|
'poi-address': 8, |
||||||
|
'neighborhood': 10, |
||||||
|
'local_admin': 12, |
||||||
|
'locality': 12, |
||||||
|
'admin2': 12, |
||||||
|
'admin1': 14, |
||||||
|
'admin0': 2 |
||||||
|
} |
||||||
|
}, |
||||||
|
'file': 'weights', |
||||||
|
'type': 'number', |
||||||
|
'order': 'desc' |
||||||
|
} |
||||||
|
} |
||||||
|
], |
||||||
|
'track_scores': true |
||||||
|
}; |
@ -0,0 +1,50 @@ |
|||||||
|
|
||||||
|
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 |
||||||
|
} |
||||||
|
} |
||||||
|
}] |
||||||
|
} |
||||||
|
}, |
||||||
|
'filter': { |
||||||
|
'bool': { |
||||||
|
'must': [{ |
||||||
|
'geo_bounding_box': { |
||||||
|
'center_point': { |
||||||
|
'top': 47.47, |
||||||
|
'right': -61.84, |
||||||
|
'bottom': 11.51, |
||||||
|
'left': -103.16 |
||||||
|
}, |
||||||
|
'_cache': true, |
||||||
|
'type': 'indexed' |
||||||
|
} |
||||||
|
}] |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
'sort': [ '_sort' ], |
||||||
|
'size': 10, |
||||||
|
'track_scores': true |
||||||
|
}; |
@ -0,0 +1,68 @@ |
|||||||
|
|
||||||
|
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' |
||||||
|
} |
||||||
|
}] |
||||||
|
} |
||||||
|
}, |
||||||
|
'filter': { |
||||||
|
'bool': { |
||||||
|
'must': [] |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
'sort': [ '_sort' ], |
||||||
|
'size': 10, |
||||||
|
'track_scores': true |
||||||
|
}; |
@ -0,0 +1,79 @@ |
|||||||
|
|
||||||
|
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' |
||||||
|
} |
||||||
|
}] |
||||||
|
} |
||||||
|
}, |
||||||
|
'filter': { |
||||||
|
'bool': { |
||||||
|
'must': [{ |
||||||
|
'geo_bounding_box': { |
||||||
|
'center_point': { |
||||||
|
'top': 47.47, |
||||||
|
'right': -61.84, |
||||||
|
'bottom': 11.51, |
||||||
|
'left': -103.16 |
||||||
|
}, |
||||||
|
'_cache': true, |
||||||
|
'type': 'indexed' |
||||||
|
} |
||||||
|
}] |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
'sort': [ '_sort' ], |
||||||
|
'size': 10, |
||||||
|
'track_scores': true |
||||||
|
}; |
@ -0,0 +1,39 @@ |
|||||||
|
|
||||||
|
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 |
||||||
|
} |
||||||
|
} |
||||||
|
}] |
||||||
|
} |
||||||
|
}, |
||||||
|
'filter': { |
||||||
|
'bool': { |
||||||
|
'must': [] |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
'sort': [ '_score' ], |
||||||
|
'size': 10, |
||||||
|
'track_scores': true |
||||||
|
}; |
@ -0,0 +1,98 @@ |
|||||||
|
|
||||||
|
var peliasQuery = require('pelias-query'), |
||||||
|
vs = new peliasQuery.Vars( peliasQuery.defaults ); |
||||||
|
|
||||||
|
module.exports = { |
||||||
|
'query': { |
||||||
|
'filtered': { |
||||||
|
'query': { |
||||||
|
'bool': { |
||||||
|
'must': [{ |
||||||
|
'match': { |
||||||
|
'name.default': { |
||||||
|
'query': 'soho grand', |
||||||
|
'analyzer': 'peliasOneEdgeGram', |
||||||
|
'boost': 1 |
||||||
|
} |
||||||
|
} |
||||||
|
}], |
||||||
|
'should': [{ |
||||||
|
'match': { |
||||||
|
'phrase.default': { |
||||||
|
'query': 'soho grand', |
||||||
|
'analyzer': 'peliasPhrase', |
||||||
|
'type': 'phrase', |
||||||
|
'slop': 2, |
||||||
|
'boost': 1 |
||||||
|
} |
||||||
|
} |
||||||
|
},{ |
||||||
|
'match': { |
||||||
|
'admin0': { |
||||||
|
'query': 'new york', |
||||||
|
'boost': vs.var('admin:admin0:boost').get(), |
||||||
|
'analyzer': vs.var('admin:admin0:analyzer').get() |
||||||
|
} |
||||||
|
} |
||||||
|
}, { |
||||||
|
'match': { |
||||||
|
'admin1': { |
||||||
|
'query': 'new york', |
||||||
|
'boost': vs.var('admin:admin1:boost').get(), |
||||||
|
'analyzer': vs.var('admin:admin1:analyzer').get() |
||||||
|
} |
||||||
|
} |
||||||
|
}, { |
||||||
|
'match': { |
||||||
|
'admin1_abbr': { |
||||||
|
'query': 'new york', |
||||||
|
'boost': vs.var('admin:admin1_abbr:boost').get(), |
||||||
|
'analyzer': vs.var('admin:admin1_abbr:analyzer').get() |
||||||
|
} |
||||||
|
} |
||||||
|
}, { |
||||||
|
'match': { |
||||||
|
'admin2': { |
||||||
|
'query': 'new york', |
||||||
|
'boost': vs.var('admin:admin2:boost').get(), |
||||||
|
'analyzer': vs.var('admin:admin2:analyzer').get() |
||||||
|
} |
||||||
|
} |
||||||
|
}, { |
||||||
|
'match': { |
||||||
|
'local_admin': { |
||||||
|
'query': 'new york', |
||||||
|
'boost': vs.var('admin:local_admin:boost').get(), |
||||||
|
'analyzer': vs.var('admin:local_admin:analyzer').get() |
||||||
|
} |
||||||
|
} |
||||||
|
}, { |
||||||
|
'match': { |
||||||
|
'locality': { |
||||||
|
'query': 'new york', |
||||||
|
'boost': vs.var('admin:locality:boost').get(), |
||||||
|
'analyzer': vs.var('admin:locality:analyzer').get() |
||||||
|
} |
||||||
|
} |
||||||
|
}, { |
||||||
|
'match': { |
||||||
|
'neighborhood': { |
||||||
|
'query': 'new york', |
||||||
|
'boost': vs.var('admin:neighborhood:boost').get(), |
||||||
|
'analyzer': vs.var('admin:neighborhood:analyzer').get() |
||||||
|
} |
||||||
|
} |
||||||
|
}] |
||||||
|
} |
||||||
|
}, |
||||||
|
'filter': { |
||||||
|
'bool': { |
||||||
|
'must': [] |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
'size': 10, |
||||||
|
'sort': [ '_score' ], |
||||||
|
'track_scores': true |
||||||
|
}; |
@ -0,0 +1,190 @@ |
|||||||
|
|
||||||
|
var peliasQuery = require('pelias-query'), |
||||||
|
vs = new peliasQuery.Vars( peliasQuery.defaults ); |
||||||
|
|
||||||
|
module.exports = { |
||||||
|
'query': { |
||||||
|
'filtered': { |
||||||
|
'query': { |
||||||
|
'bool': { |
||||||
|
'must': [{ |
||||||
|
'match': { |
||||||
|
'name.default': { |
||||||
|
'query': '1 water st', |
||||||
|
'analyzer': 'peliasOneEdgeGram', |
||||||
|
'boost': 1 |
||||||
|
} |
||||||
|
} |
||||||
|
}], |
||||||
|
'should': [{ |
||||||
|
'match': { |
||||||
|
'phrase.default': { |
||||||
|
'query': '1 water st', |
||||||
|
'analyzer': 'peliasPhrase', |
||||||
|
'type': 'phrase', |
||||||
|
'slop': 2, |
||||||
|
'boost': 1 |
||||||
|
} |
||||||
|
} |
||||||
|
},{ |
||||||
|
'match': { |
||||||
|
'address.number': { |
||||||
|
'query': 1, |
||||||
|
'boost': vs.var('address:housenumber:boost').get(), |
||||||
|
'analyzer': vs.var('address:housenumber:analyzer').get() |
||||||
|
} |
||||||
|
} |
||||||
|
}, { |
||||||
|
'match': { |
||||||
|
'address.street': { |
||||||
|
'query': 'water st', |
||||||
|
'boost': vs.var('address:street:boost').get(), |
||||||
|
'analyzer': vs.var('address:street:analyzer').get() |
||||||
|
} |
||||||
|
} |
||||||
|
}, { |
||||||
|
'match': { |
||||||
|
'admin0': { |
||||||
|
'query': 'manhattan', |
||||||
|
'boost': vs.var('admin:admin0:boost').get(), |
||||||
|
'analyzer': vs.var('admin:admin0:analyzer').get() |
||||||
|
} |
||||||
|
} |
||||||
|
}, { |
||||||
|
'match': { |
||||||
|
'admin1': { |
||||||
|
'query': 'manhattan', |
||||||
|
'boost': vs.var('admin:admin1:boost').get(), |
||||||
|
'analyzer': vs.var('admin:admin1:analyzer').get() |
||||||
|
} |
||||||
|
} |
||||||
|
}, { |
||||||
|
'match': { |
||||||
|
'admin1_abbr': { |
||||||
|
'query': 'NY', |
||||||
|
'boost': vs.var('admin:admin1_abbr:boost').get(), |
||||||
|
'analyzer': vs.var('admin:admin1_abbr:analyzer').get() |
||||||
|
} |
||||||
|
} |
||||||
|
}, { |
||||||
|
'match': { |
||||||
|
'admin2': { |
||||||
|
'query': 'manhattan', |
||||||
|
'boost': vs.var('admin:admin2:boost').get(), |
||||||
|
'analyzer': vs.var('admin:admin2:analyzer').get() |
||||||
|
} |
||||||
|
} |
||||||
|
}, { |
||||||
|
'match': { |
||||||
|
'local_admin': { |
||||||
|
'query': 'manhattan', |
||||||
|
'boost': vs.var('admin:local_admin:boost').get(), |
||||||
|
'analyzer': vs.var('admin:local_admin:analyzer').get() |
||||||
|
} |
||||||
|
} |
||||||
|
}, { |
||||||
|
'match': { |
||||||
|
'locality': { |
||||||
|
'query': 'manhattan', |
||||||
|
'boost': vs.var('admin:locality:boost').get(), |
||||||
|
'analyzer': vs.var('admin:locality:analyzer').get() |
||||||
|
} |
||||||
|
} |
||||||
|
}, { |
||||||
|
'match': { |
||||||
|
'neighborhood': { |
||||||
|
'query': 'manhattan', |
||||||
|
'boost': vs.var('admin:neighborhood:boost').get(), |
||||||
|
'analyzer': vs.var('admin:neighborhood:analyzer').get() |
||||||
|
} |
||||||
|
} |
||||||
|
}] |
||||||
|
} |
||||||
|
}, |
||||||
|
'filter': { |
||||||
|
'bool': { |
||||||
|
'must': [] |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
'size': 10, |
||||||
|
'sort': [ |
||||||
|
'_score', |
||||||
|
{ |
||||||
|
'_script': { |
||||||
|
'file': 'admin_boost', |
||||||
|
'type': 'number', |
||||||
|
'order': 'desc' |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
'_script': { |
||||||
|
'file': 'popularity', |
||||||
|
'type': 'number', |
||||||
|
'order': 'desc' |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
'_script': { |
||||||
|
'file': 'population', |
||||||
|
'type': 'number', |
||||||
|
'order': 'desc' |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
'_script': { |
||||||
|
'params': { |
||||||
|
'weights': { |
||||||
|
'admin0': 4, |
||||||
|
'admin1': 3, |
||||||
|
'admin2': 2, |
||||||
|
'local_admin': 1, |
||||||
|
'locality': 1, |
||||||
|
'neighborhood': 1 |
||||||
|
} |
||||||
|
}, |
||||||
|
'file': 'weights', |
||||||
|
'type': 'number', |
||||||
|
'order': 'desc' |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
'_script': { |
||||||
|
'params': { |
||||||
|
'category_weights': { |
||||||
|
'transport:air': 2, |
||||||
|
'transport:air:aerodrome': 2, |
||||||
|
'transport:air:airport': 2 |
||||||
|
} |
||||||
|
}, |
||||||
|
'file': 'category', |
||||||
|
'type': 'number', |
||||||
|
'order': 'desc' |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
'_script': { |
||||||
|
'params': { |
||||||
|
'weights': { |
||||||
|
'geoname': 0, |
||||||
|
'address': 4, |
||||||
|
'osmnode': 6, |
||||||
|
'osmway': 6, |
||||||
|
'poi-address': 8, |
||||||
|
'neighborhood': 10, |
||||||
|
'local_admin': 12, |
||||||
|
'locality': 12, |
||||||
|
'admin2': 12, |
||||||
|
'admin1': 14, |
||||||
|
'admin0': 2 |
||||||
|
} |
||||||
|
}, |
||||||
|
'file': 'weights', |
||||||
|
'type': 'number', |
||||||
|
'order': 'desc' |
||||||
|
} |
||||||
|
} |
||||||
|
], |
||||||
|
'track_scores': true |
||||||
|
}; |
@ -0,0 +1,59 @@ |
|||||||
|
|
||||||
|
var category_weights = require('../../../helper/category_weights'); |
||||||
|
var admin_weights = require('../../../helper/admin_weights'); |
||||||
|
var weights = require('pelias-suggester-pipeline').weights; |
||||||
|
|
||||||
|
module.exports = [ |
||||||
|
'_score', |
||||||
|
{ |
||||||
|
'_script': { |
||||||
|
'file': 'admin_boost', |
||||||
|
'type': 'number', |
||||||
|
'order': 'desc' |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
'_script': { |
||||||
|
'file': 'popularity', |
||||||
|
'type': 'number', |
||||||
|
'order': 'desc' |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
'_script': { |
||||||
|
'file': 'population', |
||||||
|
'type': 'number', |
||||||
|
'order': 'desc' |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
'_script': { |
||||||
|
'params': { |
||||||
|
'weights': admin_weights |
||||||
|
}, |
||||||
|
'file': 'weights', |
||||||
|
'type': 'number', |
||||||
|
'order': 'desc' |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
'_script': { |
||||||
|
'params': { |
||||||
|
'category_weights': category_weights.default |
||||||
|
}, |
||||||
|
'file': 'category', |
||||||
|
'type': 'number', |
||||||
|
'order': 'desc' |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
'_script': { |
||||||
|
'params': { |
||||||
|
'weights': weights |
||||||
|
}, |
||||||
|
'file': 'weights', |
||||||
|
'type': 'number', |
||||||
|
'order': 'desc' |
||||||
|
} |
||||||
|
} |
||||||
|
]; |
Loading…
Reference in new issue