You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Elasticsearch-PHP 6.0报错及产品名称短语建议器实现求助

解决Elasticsearch PHP 6.0的短语建议器报错:在[text]中发现未知的VALUE_STRING类型键

嘿,我来帮你搞定这个ES PHP的短语建议器问题!这个报错通常是因为你构建的suggest查询格式不符合Elasticsearch 6.x的要求,大概率是把completion suggester的参数写错了——比如直接传了字符串而不是正确的嵌套结构,或者字段引用有误。

先梳理核心问题

你已经正确配置了suggest字段为completion类型(适合做短语自动补全),但查询阶段的语法出了问题。ES 6.x对completion suggester的请求格式有严格要求,不能直接在suggest节点下传字符串值。

正确的PHP查询代码示例

针对你的products索引和surat类型,这里给出符合ES 6.x和PHP客户端6.0版本的正确查询写法:

// 假设你已经初始化了Elasticsearch Client实例$client
$searchPrefix = "用户输入的关键词前缀"; // 比如"苹果"

$params = [
    'index' => 'products',
    'type' => 'surat', // ES 6.x中一个索引只能有一个类型,这里匹配你的映射配置
    'body' => [
        'suggest' => [
            'product_title_suggest' => [ // 自定义的建议器名称,可随意命名
                'prefix' => $searchPrefix, // 用户输入的前缀
                'completion' => [
                    'field' => 'suggest', // 对应索引中配置的completion类型字段
                    'size' => 10, // 返回最多10条建议结果
                    'skip_duplicates' => true // 自动去重重复的建议
                ]
            ]
        ]
    ]
];

// 执行查询并获取结果
$response = $client->search($params);

// 解析建议结果
$suggestions = $response['suggest']['product_title_suggest'][0]['options'];
foreach ($suggestions as $option) {
    echo "建议产品名称:" . $option['text'] . "\n";
}

关键注意事项

  • 不要直接在suggest节点下传字符串:必须按照建议器名称 => [prefix => 前缀, completion => [field => 字段名]]的嵌套结构来写,这是你报错的核心原因。
  • 确保文档入库时正确填充suggest字段:在添加/更新产品文档时,必须把产品名称同步写入suggest字段,比如:
    // 示例入库文档
    $doc = [
        'title' => '苹果手机14',
        'suggest' => '苹果手机14', // 直接传字符串即可,或者用数组支持多输入:['input' => ['苹果手机14', 'iPhone14']]
        // 其他字段...
    ];
    $client->index([
        'index' => 'products',
        'type' => 'surat',
        'body' => $doc
    ]);
    
  • 版本匹配:确保你的Elasticsearch服务器版本也是6.x,PHP客户端6.0和ES服务器版本必须一致,否则会出现兼容性问题。

排查步骤(如果还是报错)

  1. 先用curl直接测试ES的REST API,确认查询格式是否正确:
    curl -X GET "localhost:9200/products/surat/_search" -H 'Content-Type: application/json' -d'
    {
        "suggest": {
            "product_suggest": {
                "prefix": "苹果",
                "completion": {
                    "field": "suggest"
                }
            }
        }
    }
    '
    
    如果curl能正常返回结果,说明问题出在PHP代码的参数构建上;如果curl也报错,那就要检查索引映射或文档数据是否正确。
  2. 用get API查看某个文档,确认suggest字段是否存在且值正确:
    curl -X GET "localhost:9200/products/surat/你的文档ID"
    

内容的提问来源于stack exchange,提问作者user6051114

火山引擎 最新活动