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

2021-03-02 09:02:13 +08:00
 kisshere

目前我用 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. 目前处于生产环境中,那么该如何补救?
2214 次点击
所在节点    程序员
12 条回复
zhuzhibin
2021-03-02 09:09:48 +08:00
首先 create 的时候能否 catch 到异常呢?生产环境你们是如何发布以及部署的呢?
dilu
2021-03-02 09:10:10 +08:00
你写 sql 的时候,没有加索引,mysql 会报错吗?
daxin945
2021-03-02 09:12:56 +08:00
最笨的方法 再搭一个没问题的 es 然后找个可以维护的时间节点 倒下数据
wakzz
2021-03-02 09:16:13 +08:00
es 不支持修改索引,所以建议新建一个索引,然后把旧索引数据迁移过去后,再通过别名直接指向新索引
Rache1
2021-03-02 09:17:36 +08:00
es 最骚的就是创建后,没有办法修改。

你就只能新建一个索引,把数据导进去后,删掉原来的,再把新建的索引给个 alias,或者修改代码中连接的索引。
sadfQED2
2021-03-02 09:23:45 +08:00
1.为啥没报错,你应该直接看 es 里面建出来是啥样的

2.咋解决,先创建一个新的索引,然后双写两个索引,再起一个进程同步老数据,两边数据一致以后切到新索引,删除老索引
SjwNo1
2021-03-02 09:36:57 +08:00
rebuild
sss495088732
2021-03-02 09:45:21 +08:00
楼上 rebuild 正解~,可以先写好 template(mapping),index name regular 就可以了 0.0
index 不大(不过亿)的话是非常快的
20 分钟以内
vindurriel
2021-03-02 10:56:15 +08:00
上生产环境之前还得先测一测的
创建新的 index 确认 mapping 无误之后 用 reindex 或者 clone 接口导数据 名字用 alias 保持一致
qq1340691923
2021-03-02 14:07:30 +08:00
为啥要用 es 呢
Jackeriss
2021-03-02 14:31:44 +08:00
给索引加个别名,搜索的时候用别名,写入用真名,reindex 修改 mapping,完了之后替换别名
yuancoder
2021-03-02 15:57:05 +08:00
没有报错是因为 mapping 不是必须的,es 会根据你的值自动识别。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/757494

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX