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'); |
||||
|
||||
function generate( params ){ |
||||
//------------------------------
|
||||
// reverse geocode query
|
||||
//------------------------------
|
||||
var query = new peliasQuery.layout.FilteredBooleanQuery(); |
||||
|
||||
var centroid = { |
||||
lat: params.lat, |
||||
lon: params.lon |
||||
}; |
||||
// scoring boost
|
||||
query.sort( peliasQuery.view.sort_distance ); |
||||
|
||||
var query = queries.distance( centroid, { |
||||
size: params.size || 1, |
||||
sort: true, |
||||
distance: '500km' |
||||
}); |
||||
// non-scoring hard filters
|
||||
query.filter( peliasQuery.view.boundary_circle ); |
||||
|
||||
query.sort = query.sort.concat( sort( params ) ); |
||||
// --------------------------------
|
||||
|
||||
if ( params.categories && params.categories.length > 0 ) { |
||||
addCategoriesFilter( query, params.categories ); |
||||
} |
||||
function generateQuery( clean ){ |
||||
|
||||
var vs = new peliasQuery.Vars( peliasQuery.defaults ); |
||||
|
||||
// set defaults
|
||||
vs.set({ |
||||
'size': 1, |
||||
'boundary:circle:radius': '500km' |
||||
}); |
||||
|
||||
return query; |
||||
// set size
|
||||
if( clean.size ){ |
||||
vs.var( 'size', clean.size ); |
||||
} |
||||
|
||||
function addCategoriesFilter( query, categories ) { |
||||
query.query.filtered.filter.bool.must.push({ |
||||
terms: { category: categories } |
||||
// focus point centroid
|
||||
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, |
||||
}); |
||||
} |
||||
|
||||
module.exports = generate; |
||||
var result = query.render( vs ); |
||||
|
||||
// @todo: remove this hack
|
||||
return JSON.parse( JSON.stringify( result ) ); |
||||
} |
||||
|
||||
module.exports = generateQuery; |
||||
|
@ -1,188 +1,161 @@
|
||||
|
||||
var queries = require('geopipes-elasticsearch-backend').queries, |
||||
var peliasQuery = require('pelias-query'), |
||||
sort = require('../query/sort'), |
||||
adminFields = require('../helper/adminFields')(), |
||||
addressWeights = require('../helper/address_weights'); |
||||
adminFields = require('../helper/adminFields')(); |
||||
|
||||
//------------------------------
|
||||
// general-purpose search query
|
||||
//------------------------------
|
||||
var query = new peliasQuery.layout.FilteredBooleanQuery(); |
||||
|
||||
function generate( params ){ |
||||
var centroid = null; |
||||
// mandatory matches
|
||||
query.score( peliasQuery.view.boundary_country, 'must' ); |
||||
query.score( peliasQuery.view.ngrams, 'must' ); |
||||
|
||||
if ( params.lat && params.lon ){ |
||||
centroid = { |
||||
lat: params.lat, |
||||
lon: params.lon |
||||
}; |
||||
}
|
||||
// scoring boost
|
||||
query.score( peliasQuery.view.phrase ); |
||||
query.score( peliasQuery.view.focus ); |
||||
|
||||
var query = queries.distance( centroid, { size: params.size } ); |
||||
var text = params.text; |
||||
// address components
|
||||
query.score( peliasQuery.view.address('housenumber') ); |
||||
query.score( peliasQuery.view.address('street') ); |
||||
query.score( peliasQuery.view.address('postcode') ); |
||||
|
||||
if (params.bbox) { |
||||
query = queries.bbox ( centroid, { size: params.size, bbox: params.bbox } ); |
||||
} |
||||
// 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') ); |
||||
|
||||
query.query.filtered.query = { |
||||
'bool': { |
||||
'must': [], |
||||
'should': [] |
||||
} |
||||
}; |
||||
// non-scoring hard filters
|
||||
query.filter( peliasQuery.view.boundary_circle ); |
||||
query.filter( peliasQuery.view.boundary_rect ); |
||||
|
||||
// --------------------------------
|
||||
|
||||
function generateQuery( clean ){ |
||||
|
||||
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; |
||||
var vs = new peliasQuery.Vars( peliasQuery.defaults ); |
||||
|
||||
// set input text
|
||||
vs.var( 'input:name', clean.text ); |
||||
|
||||
// set size
|
||||
if( clean.size ){ |
||||
vs.var( 'size', clean.size ); |
||||
} |
||||
|
||||
addParsedMatch(query, text, params.parsed_text); |
||||
// focus point
|
||||
if( clean.lat && clean.lon ){ |
||||
vs.set({ |
||||
'focus:point:lat': clean.lat, |
||||
'focus:point:lon': clean.lon |
||||
}); |
||||
} |
||||
|
||||
// add search condition to distance query
|
||||
query.query.filtered.query.bool.must.push({
|
||||
'match': { |
||||
'name.default': { |
||||
'query': text, |
||||
'analyzer': 'peliasOneEdgeGram' |
||||
// 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 |
||||
}); |
||||
} |
||||
|
||||
// address parsing
|
||||
if( clean.parsed_text ){ |
||||
|
||||
// is it a street address?
|
||||
var isStreetAddress = clean.parsed_text.hasOwnProperty('number') && clean.parsed_text.hasOwnProperty('street'); |
||||
if( isStreetAddress ){ |
||||
vs.var( 'input:name', clean.parsed_text.number + ' ' + clean.parsed_text.street ); |
||||
} |
||||
}); |
||||
|
||||
// add phrase matching query
|
||||
// note: this is required for shingle/phrase matching
|
||||
query.query.filtered.query.bool.should.push({ |
||||
'match': { |
||||
'phrase.default': { |
||||
'query': text, |
||||
'analyzer': 'peliasPhrase', |
||||
'type': 'phrase', |
||||
'slop': 2 |
||||
// I don't understand this
|
||||
else if( clean.parsed_text.admin_parts ) { |
||||
vs.var( 'input:name', clean.parsed_text.name ); |
||||
} |
||||
|
||||
// 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
|
||||
} |
||||
}); |
||||
|
||||
query.sort = query.sort.concat( sort( params ) ); |
||||
// ==== add parsed matches [address components] ====
|
||||
|
||||
return query; |
||||
// house number
|
||||
if( clean.parsed_text.hasOwnProperty('number') ){ |
||||
vs.var( 'input:housenumber', clean.parsed_text.number ); |
||||
} |
||||
|
||||
/** |
||||
* Traverse the parsed text object, containing all the address parts detected in query string. |
||||
* Add matches to query for each identifiable component. |
||||
* |
||||
* @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 || []; |
||||
// street name
|
||||
if( clean.parsed_text.hasOwnProperty('street') ){ |
||||
vs.var( 'input:street', clean.parsed_text.street ); |
||||
} |
||||
|
||||
// copy expected admin fields so we can remove them as we parse the address
|
||||
var unmatchedAdminFields = adminFields.slice(); |
||||
// postal code
|
||||
if( clean.parsed_text.hasOwnProperty('postalcode') ){ |
||||
vs.var( 'input:postcode', clean.parsed_text.postalcode ); |
||||
} |
||||
|
||||
// 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); |
||||
// ==== add parsed matches [admin components] ====
|
||||
|
||||
// city
|
||||
// admin2, locality, local_admin, neighborhood
|
||||
addMatch(query, unmatchedAdminFields, 'admin2', parsedText.city, addressWeights.admin2); |
||||
if( clean.parsed_text.hasOwnProperty('city') ){ |
||||
vs.var( 'input:admin2', clean.parsed_text.city ); |
||||
} |
||||
|
||||
// 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); |
||||
if( clean.parsed_text.hasOwnProperty('state') ){ |
||||
vs.var( 'input:admin1_abbr', clean.parsed_text.state ); |
||||
} |
||||
|
||||
/** |
||||
* Check for additional admin fields in the parsed input, and if any was found |
||||
* combine into single string and match against all unmatched admin fields. |
||||
* |
||||
* @param {Object} query |
||||
* @param {Array} unmatchedAdminFields |
||||
* @param {Object} parsedInput |
||||
* @param {string} defaultInput |
||||
*/ |
||||
function addUnmatchedAdminFieldsToQuery(query, unmatchedAdminFields, parsedInput, defaultInput) { |
||||
if (unmatchedAdminFields.length === 0 ) { |
||||
return; |
||||
// country
|
||||
if( clean.parsed_text.hasOwnProperty('country') ){ |
||||
vs.var( 'input:alpha3', clean.parsed_text.country ); |
||||
} |
||||
|
||||
var leftovers = []; |
||||
// ==== deal with the 'leftover' components ====
|
||||
// @todo: clean up this code
|
||||
|
||||
if (parsedInput.admin_parts) { |
||||
leftovers.push(parsedInput.admin_parts); |
||||
// 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 (parsedInput.regions) { |
||||
leftovers.push(parsedInput.regions); |
||||
else if( clean.parsed_text.hasOwnProperty('regions') ){ |
||||
leftoversString = clean.parsed_text.regions.join(' '); |
||||
} |
||||
|
||||
if (leftovers.length === 0) { |
||||
return; |
||||
} |
||||
|
||||
leftovers = leftovers.join(' '); |
||||
// if we have 'leftovers' then assign them to any fields which
|
||||
// currently don't have a value assigned.
|
||||
if( leftoversString.length ){ |
||||
var unmatchedAdminFields = adminFields.slice(); |
||||
|
||||
// if there are additional regions/admin_parts found
|
||||
if (leftovers !== defaultInput) { |
||||
// cycle through fields and set fields which
|
||||
// are still currently unset
|
||||
unmatchedAdminFields.forEach( function( key ){ |
||||
// combine all the leftover parts into one string
|
||||
addMatch(query, [], key, leftovers); |
||||
}); |
||||
if( !vs.isset( 'input:' + key ) ){ |
||||
vs.var( 'input:' + key, leftoversString ); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
/** |
||||
* Add key:value match to query. Apply boost if specified. |
||||
* |
||||
* @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 = {}; |
||||
|
||||
if (boost) { |
||||
match[key] = { |
||||
query: value, |
||||
boost: boost |
||||
}; |
||||
} |
||||
else { |
||||
match[key] = value; |
||||
} |
||||
|
||||
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 ) ); |
||||
|
||||
/** |
||||
* If key is found in unmatched list, remove it from the array |
||||
* |
||||
* @param {Array} unmatched |
||||
* @param {string} key |
||||
*/ |
||||
function removeFromUnmatched(unmatched, key) { |
||||
var index = unmatched.indexOf(key); |
||||
if (index !== -1) { |
||||
unmatched.splice(index, 1); |
||||
} |
||||
// @todo: remove this hack
|
||||
return JSON.parse( JSON.stringify( result ) ); |
||||
} |
||||
|
||||
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