V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
kisshere
V2EX  ›  程序员

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

  •  
  •   kisshere · 2021-03-02 09:02:13 +08:00 · 2296 次点击
    这是一个创建于 1387 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    2.咋解决,先创建一个新的索引,然后双写两个索引,再起一个进程同步老数据,两边数据一致以后切到新索引,删除老索引
    SjwNo1
        7
    SjwNo1  
       2021-03-02 09:36:57 +08:00
    rebuild
    sss495088732
        8
    sss495088732  
       2021-03-02 09:45:21 +08:00
    楼上 rebuild 正解~,可以先写好 template(mapping),index name regular 就可以了 0.0
    index 不大(不过亿)的话是非常快的
    20 分钟以内
    vindurriel
        9
    vindurriel  
       2021-03-02 10:56:15 +08:00 via iPhone
    上生产环境之前还得先测一测的
    创建新的 index 确认 mapping 无误之后 用 reindex 或者 clone 接口导数据 名字用 alias 保持一致
    qq1340691923
        10
    qq1340691923  
       2021-03-02 14:07:30 +08:00
    为啥要用 es 呢
    Jackeriss
        11
    Jackeriss  
       2021-03-02 14:31:44 +08:00
    给索引加个别名,搜索的时候用别名,写入用真名,reindex 修改 mapping,完了之后替换别名
    yuancoder
        12
    yuancoder  
       2021-03-02 15:57:05 +08:00
    没有报错是因为 mapping 不是必须的,es 会根据你的值自动识别。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1308 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 17:40 · PVG 01:40 · LAX 09:40 · JFK 12:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.