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