';建议';ElasticSearch索引的映射;t返回结果


'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。

我让它与以下设置一起工作。

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);

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

$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'
            )
        )
    )
);

请注意,已添加"建议";你可以用你想要的任何东西来代替它。