'suggest' ElasticSearch 索引的映射没有 return 结果

'suggest' mapping for ElasticSearch index doesn't return results

我有一个如下所示的索引

[question_index] => Array
        (
            [mappings] => Array
                (
                    [QUESTION] => Array
                        (
                            [properties] => Array
                                (
                                    [body] => Array
                                        (
                                            [type] => string
                                        )

                                    [general_suggest] => Array
                                        (
                                            [type] => completion
                                            [analyzer] => simple
                                            [payloads] => 1
                                            [preserve_separators] => 1
                                            [preserve_position_increments] => 1
                                            [max_input_length] => 50
                                        )
                                )

                        )

                )

        )

我使用以下 PHP 代码添加了建议映射。

$param['index']    = 'question_index';
$param['type']      = 'QUESTION';
$param['body']      = array(
    '_source'       => array(
        'enabled' => true
    ),
    'properties'    => array(
        'body'      => array('type' => 'string'),
        'general_suggest'   => array(
            'type'              => 'completion',
            'index_analyzer'    => 'simple',
            'search_analyzer'   => 'simple',
            'payloads'          => true
        )
    )
);
$result     = $client->indices()->putMapping($param);

我尝试使用以下 PHP 代码获得建议的结果

    $param                                  = array();
    $param['index']                     = 'question_index';
    $param['body']['text']                  = 'someth';//should return 'something' as a suggest
    $param['body']['completion']['field']   = 'general_suggest';
    $result     = $client->suggest($param);

每当我 运行 上述代码时,我都会收到以下错误。

Array
(
    [_shards] => Array
        (
            [total] => 5
            [successful] => 0
            [failed] => 5
            [failures] => Array
                (
                    [0] => Array
                        (
                            [index] => question_index
                            [shard] => 0
                            [reason] => BroadcastShardOperationFailedException[[question_index][0] ]; nested: ElasticsearchException[failed to execute suggest]; nested: ElasticsearchIllegalArgumentException[[suggest] does not support [field]]; 
                        )

有人知道这里的问题是什么吗?我使用的索引或参数是否设置不正确?

请注意,我使用的是 PHP 客户端库,而不是直接通过 HTTP 访问 API。

尝试将您的查询包装在另一个数组中,如下所示:

$param                              = array();
$param['index']                     = 'question_index';
$param['body']['suggestions']['text']                  = 'someth';//should return 'something' as a suggest
$param['body']['suggestions']['completion']['field']   = 'general_suggest';
$result     = $client->suggest($param);

$param 变量将如下所示:

$param = array(
    'index' => 'question_index',
    'body'  => array(
        'suggestions' => array(
            'text' => 'someth',
            'completion' => array(
                'field' => 'general_suggest'
            )
        )
    )
);

请注意,已添加 "suggestions";你可以用任何你想要的替换它。

我让它可以使用以下设置。

1。先设置索引

$client      = new Elasticsearch\Client();
$param           = array();
$param['index'] = 'user_index';
$param['type']  = 'user';
$param['body']  = new stdClass();               
$client->create($param);

2。为建议设置映射

$param  = array();
$param['index']                 = 'user_index';
$param['type']                  = 'user';
$param['body']                  = array(
    'properties'    => array(
        'body'          => array(
            'type'  => 'string'
        ),
        'autosuggest'   => array(
            'type'              => 'completion',
            'index_analyzer'    => 'simple',
            'search_analyzer'   => 'simple',
            'payloads'          => true
        )
    )
);
$client->indices()->putMapping($param);

3。将文档添加到索引

//assume $user is an object available to you
$params = array();
$params['body']  = array(
    'autosuggest'   => array(
        'input'     => [$user->full_name, $user->username],
        'output'    => $user->full_name,
        'payload'   => array(
            'id'        => $user->id,
            'full_name' => $user->full_name,
            'username'  => $user->username,
            'type'      => 'user'
        )
    ),
    'body'          => $user->full_name . "(@{$user->username})",
);
$params['index'] = 'user_index';
$params['type']  = 'user';
$params['id']    = $user->id;
$client->index($params);

4。最后,获取建议的方式

$client             = new Elasticsearch\Client();
$param              = array();
$param['index']     = 'user_index';
$param['body']['search_suggest']['text']                    = 'search_query_here';
$param['body']['search_suggest']['completion']['field']    = 'autosuggest';
$results        = $client->suggest($param);