mirror of https://github.com/pelias/api.git
missinglink
9 years ago
7 changed files with 240 additions and 3 deletions
@ -0,0 +1,48 @@
|
||||
|
||||
var peliasQuery = require('pelias-query'), |
||||
searchDefaults = require('../search_defaults'); |
||||
|
||||
/** |
||||
This view (unfortunately) requires autocomplete to use the phrase.* index. |
||||
|
||||
ideally we wouldn't need to use this, but at time of writing we are unable |
||||
to distinguish between 'complete tokens' and 'grams' in the name.* index. |
||||
|
||||
this view was introduced in order to score exact matches higher than partial |
||||
matches, without it we find results such as "Clayton Avenue" appearing first |
||||
in the results list for the query "Clay Av". |
||||
|
||||
the view uses some of the values from the 'search_defaults.js' file to add an |
||||
additional 'SHOULD' condition which scores exact matches slighly higher |
||||
than partial matches. |
||||
**/ |
||||
|
||||
module.exports = function( vs ){ |
||||
|
||||
// make a copy of the variables so we don't interfere with the values
|
||||
// passed to other views.
|
||||
var vsCopy = new peliasQuery.Vars( vs.export() ); |
||||
|
||||
// copy phrase:* values from search defaults
|
||||
vsCopy.var('phrase:analyzer').set(searchDefaults['phrase:analyzer']); |
||||
vsCopy.var('phrase:field').set(searchDefaults['phrase:field']); |
||||
|
||||
// split the 'input:name' on whitespace
|
||||
var name = vs.var('input:name').get(), |
||||
tokens = name.split(' '); |
||||
|
||||
// if the query is incomplete then we need to remove
|
||||
// the final (incomplete) token as it will not match
|
||||
// tokens in the phrase.* index.
|
||||
if( !vs.var('input:name:isComplete').get() ){ |
||||
tokens.pop(); |
||||
} |
||||
|
||||
// no valid tokens to use, fail now, don't render this view.
|
||||
if( tokens.length < 1 ){ return null; } |
||||
|
||||
// set 'input:name' to be only the fully completed characters
|
||||
vsCopy.var('input:name').set( tokens.join(' ') ); |
||||
|
||||
return peliasQuery.view.phrase( vsCopy ); |
||||
}; |
@ -0,0 +1,147 @@
|
||||
|
||||
module.exports = { |
||||
'query': { |
||||
'filtered': { |
||||
'query': { |
||||
'bool': { |
||||
'must': [{ |
||||
'match': { |
||||
'name.default': { |
||||
'analyzer': 'peliasQueryFullToken', |
||||
'type': 'phrase', |
||||
'boost': 1, |
||||
'slop': 3, |
||||
'query': 'k road' |
||||
} |
||||
} |
||||
}], |
||||
'should':[ |
||||
{ |
||||
'match': { |
||||
'address_parts.street': { |
||||
'query': 'k road', |
||||
'boost': 5, |
||||
'analyzer': 'peliasStreet' |
||||
} |
||||
} |
||||
}, { |
||||
'match': { |
||||
'parent.country': { |
||||
'query': 'laird', |
||||
'boost': 800, |
||||
'analyzer': 'peliasAdmin' |
||||
} |
||||
} |
||||
}, { |
||||
'match': { |
||||
'parent.region': { |
||||
'query': 'laird', |
||||
'boost': 600, |
||||
'analyzer': 'peliasAdmin' |
||||
} |
||||
} |
||||
}, { |
||||
'match': { |
||||
'parent.region_a': { |
||||
'query': 'laird', |
||||
'boost': 600, |
||||
'analyzer': 'peliasAdmin' |
||||
} |
||||
} |
||||
}, { |
||||
'match': { |
||||
'parent.county': { |
||||
'query': 'laird', |
||||
'boost': 400, |
||||
'analyzer': 'peliasAdmin' |
||||
} |
||||
} |
||||
}, { |
||||
'match': { |
||||
'parent.localadmin': { |
||||
'query': 'laird', |
||||
'boost': 200, |
||||
'analyzer': 'peliasAdmin' |
||||
} |
||||
} |
||||
}, { |
||||
'match': { |
||||
'parent.locality': { |
||||
'query': 'laird', |
||||
'boost': 200, |
||||
'analyzer': 'peliasAdmin' |
||||
} |
||||
} |
||||
}, { |
||||
'match': { |
||||
'parent.neighbourhood': { |
||||
'query': 'laird', |
||||
'boost': 200, |
||||
'analyzer': 'peliasAdmin' |
||||
} |
||||
} |
||||
}, |
||||
{ |
||||
'match': { |
||||
'phrase.default': { |
||||
'analyzer' : 'peliasPhrase', |
||||
'type' : 'phrase', |
||||
'boost' : 1, |
||||
'slop' : 3, |
||||
'query' : 'k road' |
||||
} |
||||
} |
||||
}, |
||||
{ |
||||
'function_score': { |
||||
'query': { |
||||
'match': { |
||||
'name.default': { |
||||
'analyzer': 'peliasQueryFullToken', |
||||
'query': 'k road', |
||||
} |
||||
} |
||||
}, |
||||
'max_boost': 20, |
||||
'score_mode': 'first', |
||||
'boost_mode': 'replace', |
||||
'functions': [{ |
||||
'field_value_factor': { |
||||
'modifier': 'log1p', |
||||
'field': 'popularity', |
||||
'missing': 1 |
||||
}, |
||||
'weight': 1 |
||||
}] |
||||
} |
||||
},{ |
||||
'function_score': { |
||||
'query': { |
||||
'match': { |
||||
'name.default': { |
||||
'analyzer': 'peliasQueryFullToken', |
||||
'query': 'k road', |
||||
} |
||||
} |
||||
}, |
||||
'max_boost': 20, |
||||
'score_mode': 'first', |
||||
'boost_mode': 'replace', |
||||
'functions': [{ |
||||
'field_value_factor': { |
||||
'modifier': 'log1p', |
||||
'field': 'population', |
||||
'missing': 1 |
||||
}, |
||||
'weight': 3 |
||||
}] |
||||
} |
||||
}] |
||||
} |
||||
} |
||||
} |
||||
}, |
||||
'sort': [ '_score' ], |
||||
'size': 20, |
||||
'track_scores': true |
||||
}; |
Loading…
Reference in new issue