I would like to use "Phrase Suggester". I've got a problem. When typing "johni depp", it returns several results in this order:
- john depp
- johnny depp
- joann depp
- johnn depp
How can I sort the suggestions using json so that the first result is "johnny depp"? I've tried doing this with a phonetic indexer, but without success.
This is my configuration:
Query :
{
"query": {
"multi_match": {
"query": "johni depp",
"fields": [
"fullName.word"
],
"operator": "and"
}
},
"suggest": {
"text": "johni depp",
"film": {
"phrase": {
"analyzer": "whitespace-fullName",
"field": "fullName.whitespace",
"size": 5,
"real_word_error_likelihood": 0.95,
"max_errors": 0.5,
"gram_size": 2
}
}
},
"from": 0,
"size": 1,
"sort": [],
"facets": []
}
Indexer (I use Elastica, but it's same thing):
$elasticaIndex->create(
array(
'number_of_shards' => 4,
'number_of_replicas' => 1,
'analysis' => array(
'analyzer' => array(
'autocomplete-index-fullName' => array(
'tokenizer' => 'standard',
'filter' => 'asciifolding, lowercase, edgeNGram'
),
'autocomplete-search-fullName' => array(
'tokenizer' => 'standard',
'filter' => 'asciifolding, lowercase'
),
'word-fullName' => array(
'tokenizer' => 'keyword',
'filter' => 'lowercase'
),
'whitespace-fullName' => array(
'tokenizer' => 'whitespace',
'filter' => 'lowercase'
),
),
'filter' => array(
'edgeNGram' => array(
'type' => 'edgeNGram',
'min_gram' => 1,
'max_gram' => 15
)
)
)
),
false
);
Mapping :
$mapping->setProperties(
array(
'fullName' => array('type' => 'string',
'fields' => array(
'autocomplete' => array(
'type' => 'string',
'index_analyzer' => 'autocomplete-index-fullName',
'search_analyzer' => 'autocomplete-search-fullName'
),
'word' => array(
'type' => 'string',
'analyzer' => 'word-fullName'
),
'whitespace' => array(
'type' => 'string',
'analyzer' => 'whitespace-fullName'
),
)),
)
);
Examples of referenced values:
- John Cleese
- John Gemberling
- Johnny Hallyday
- Johnny Depp
- Joann Sfar
- Joanna Rytel
- Samuel Johnson
- Johnson Traoré
Thanks in advance.