kisshere
V2EX  ›  程序员

ES 用 PHP 错误的创建了索引,居然没报错,目前处于生产环境中怎么修复?

By kisshere at 2021 年 3 月 2 日 · 3028 次点击

目前我用 php 创建一个 index,ES 版本:6.7.2:

<?php
$client = ClientBuilder::create()->build();
$params = [
    'index' => 'MyIndex',
    'body' => [
        'settings' => [
            'number_of_shards' => 2,
            'number_of_replicas' => 0
        ],
        'MyType' => [
            'properties' => [
                'title' => [
                    'type'=>'text',
                    'analyzer'=>'thai',
                ],
                'createTime' => [
                    'type'=>'integer',
                    'index' => false
                ],
                'uid' => [
                    'type'=>'integer'
                ]
            ]
        ]
    ]
];
$client->indices()->create($params);
?>

目前几乎 query 不出来任何结果,一查 ES 官网,发现居然写错了,少加了一个 mapping,正确的应该是:

<?php
$client = ClientBuilder::create()->build();
$params = [
    'index' => 'MyIndex',
    'body' => [
        'settings' => [
            'number_of_shards' => 2,
            'number_of_replicas' => 0
        ],
        'mappings' => [
            'MyType' => [
                '_source' => [
                    'enabled' => true
                ],
                'properties' => [
                    'title' => [
                        'type'=>'text',
                        'analyzer'=>'thai',
                    ],
                    'createTime' => [
                        'type'=>'integer',
                        'index' => false
                    ],
                    'uid' => [
                        'type'=>'integer'
                    ]
                ]
            ]
        ]

    ]
];
$client->indices()->create($params);
?>

那么问题来了:

  1. 为什么少了一个 mappings,ES 居然不报错???那么它默认是怎样处理该代码的,以怎样的 analyzer 和 tokenizer 来创建的 index ?目前只能搜索出有空格的结果,比如,我想搜“ABC”,那么“ABC DEF WXYZ”能搜出来,但“ABCDEFGHIJK”就搜不出来
  2. 目前处于生产环境中,那么该如何补救?
12 条回复  •  2021-03-02 15:57:05 +08:00
zhuzhibin
   1
zhuzhibin  
   2021 年 3 月 2 日 via iPhone
首先 create 的时候能否 catch 到异常呢?生产环境你们是如何发布以及部署的呢?
dilu
   2
dilu  
   2021 年 3 月 2 日 via Android
你写 sql 的时候,没有加索引,mysql 会报错吗?
haoyunyinglai
   3
haoyunyinglai  
   2021 年 3 月 2 日
最笨的方法 再搭一个没问题的 es 然后找个可以维护的时间节点 倒下数据
wakzz
   4
wakzz  
   2021 年 3 月 2 日
es 不支持修改索引,所以建议新建一个索引,然后把旧索引数据迁移过去后,再通过别名直接指向新索引
Rache1
   5
Rache1  
   2021 年 3 月 2 日
es 最骚的就是创建后,没有办法修改。

你就只能新建一个索引,把数据导进去后,删掉原来的,再把新建的索引给个 alias,或者修改代码中连接的索引。
sadfQED2
   6
sadfQED2  
   2021 年 3 月 2 日 via Android
1.为啥没报错,你应该直接看 es 里面建出来是啥样的

2.咋解决,先创建一个新的索引,然后双写两个索引,再起一个进程同步老数据,两边数据一致以后切到新索引,删除老索引
SjwNo1
   7
SjwNo1  
   2021 年 3 月 2 日
rebuild
cocowind
   8
cocowind  
   2021 年 3 月 2 日
楼上 rebuild 正解~,可以先写好 template(mapping),index name regular 就可以了 0.0
index 不大(不过亿)的话是非常快的
20 分钟以内
vindurriel
   9
vindurriel  
   2021 年 3 月 2 日 via iPhone
上生产环境之前还得先测一测的
创建新的 index 确认 mapping 无误之后 用 reindex 或者 clone 接口导数据 名字用 alias 保持一致
qq1340691923
   10
qq1340691923  
   2021 年 3 月 2 日
为啥要用 es 呢
Jackeriss
   11
Jackeriss  
   2021 年 3 月 2 日
给索引加个别名,搜索的时候用别名,写入用真名,reindex 修改 mapping,完了之后替换别名
yuancoder
   12
yuancoder  
   2021 年 3 月 2 日
没有报错是因为 mapping 不是必须的,es 会根据你的值自动识别。
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
© 2026 V2EX · 50ms · 3.9.8.5