0
votes

I would like to use "Phrase Suggester". I've got a problem. When typing "johni depp", it returns several results in this order:

  1. john depp
  2. johnny depp
  3. joann depp
  4. 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.

1

1 Answers

0
votes

Look like you want the "completion suggester" instead?

What I can recommend you, it's to use "both":

  1. Search with basic completion suggester w/o fuzzy
  2. Search with phrase suggester
  3. Loop to (1) with fuzzy etc....