Elasticsearch (es) 官方文档后期会移除 type 属性,scout 如何适应这个操作呢?

问答 Mr_lan ⋅ 于 1周前 ⋅ 最后回复由 Jourdon 1周前 ⋅ 25 阅读

根据社区的elasticsearch文档(主要是笑来搜Elasticsearch 的配置与使用,为了全文搜索...),以及scout的文档,首先artisan创建了个初始化的问题由于不太了解直接copy了笑来搜的动态设置属性的代码如下

'mappings' => [
                    '_default_' => [
                        '_all' => [
                            'enabled' => true
                        ],
                        'dynamic_templates' => [
                            [
                                'strings' => [
                                    'match_mapping_type' => 'string',
                                    'mapping' => [
                                        'type' => 'text',
                                        'analyzer' => 'ik_smart',
                                        'ignore_above' => 256,
                                        'fields' => [
                                            'keyword' => [
                                                'type' => 'keyword'
                                            ]
                                        ]
                                    ]
                                ]
                            ]
                        ]
                    ]
                ]

这样的话 很多都是ik分析了,想对指定的字段设置不使用ik

问题2

就是我要对多个model生成es数据,根据scout里面的配置,发现只有首个模型才能导入到index里面,后面的模型数据导入不了

本文章首发在 Laravel China 社区
成为第一个点赞的人吧 :bowtie:
回复数量: 12
  • Mr_lan
    1周前
  • Jourdon 努力向前!
    1周前

    第一个问题
    创建索引时可以设置,看注释

    'title' => [
        'type' => 'text', // 字段类型为全文检索,如果需要关键字,则修改为keyword,注意keyword字段为整体查询,不能作为模糊搜索
        "analyzer"=> "ik_max_word", //分词插件,
        "search_analyzer"=> "ik_max_word", //搜索时使用的插件 ,可调置为其它插件,或不设置
    ],
  • Jourdon 努力向前!
    1周前

    第2个问题没有遇到过,所以不太清楚什么情况,检查下是配置问题还是代码的错误。

  • Mr_lan
    1周前

    @Jourdon 这种情况不同的model有不同的字段,如果定义了个title的话 如果第二个model没有这个字段 是不是也不冲突?
    eg:

    * 比如我post表有 (title,summary,content), author表(name,desc等) 看你的文章artisan创建初始化的时候(scout貌似整个项目就一个index吧)是不是都得把可能的字段进行配置
  • Jourdon 努力向前!
    1周前

    @Mr_lan 一看你就没仔细看文章,,创建索引那一段,

       $params = [
                'index' => $index,//索引名(相当于mysql的数据库)
                'body' => [
                    'settings' => [
                        'number_of_shards' => 1, //一个索引中含有的主分片的数量
                        'number_of_replicas' => 0 //每一个主分片关联的副本分片的数量
                    ],
                    'mappings' => [
                        'type' => [  //类型名(相当于mysql的表)
                            '_all'=>[   //  是否开启所有字段的检索
                                'enabled' => 'false'
                            ],
                            '_source' => [ //  存储原始文档
                                'enabled' => true
                            ],
                            'properties' => [   //文档类型设置(相当于mysql的数据类型)
                                'id' => [  //字段名,
                                    'type' => 'integer', // //类型 string、integer、float、double、boolean、date,text,keyword
                                    //'index'=> 'not_analyzed',//索引是否精确值  analyzed not_analyzed
    
                                ],
                                .....
                            ]
                        ]
                    ]
                ]
            ];
            return $this->client->indices()->create($params);

    重点的地方

    'index' => $index,//索引名(相当于mysql的数据库)
    ‘type’ => [  //类型名(相当于mysql的表 )  
    'properties' => [   //文档类型设置(相当于mysql的数据类型)
    'id' => [  //  字段名,

    如果有多个表,那就在下面加类型名

  • Jourdon 努力向前!
    1周前

    不管你是用laravel scout ,还是用其它的composer包,,如果底层是Elasticsearch,都是可以实现这些的功能,

    另外建议你找一下别人封装好的composer包,使用起来方便,

  • Mr_lan
    1周前

    @Jourdon 你说的这个是原始的吧, 如果用scout的话 他的index是在model里面用

     public function searchableAs()
        {
            return 'article_index';
        }

    这个动态设置的,如果用原始的话 在创建index的时候确实不存在疑问,可是构建一个Eloquent的自动修改es的暂时驾驭不来,只能用观察者模式在对应的model都写一遍增删改,这样的代码量会比较大

  • Mr_lan
    1周前

    @Jourdon 说错了 index是配置里面固定一个 type才是上面那个方法动态设置

  • Jourdon 努力向前!
    1周前

    @Mr_lan 可能我理解错了你的意思,laravel scout 我并没有使用过,但是看了下文档,scout并不涉及到type,我理解的是,在导入生成索引时使用 php artisan scout:import "App\Post" ,每个模型都会根据model生成对应的索引
    那在查询数据时,使用哪个Model,就会直接从相应的索引中查数据,

  • Jourdon 努力向前!
    1周前

    在更新数据的时候scout会更新数据到对应的索引中,这个应该不用手动去更新。

  • Mr_lan
    1周前

    @Jourdon 测试了下 发现貌似是不能同时支持多个model的 就scout目前测试 只能对一个model取到效果, 我是这样测试的

    • 第一步是按照scout的文档来 在对应的多个model 都用了 2个方法 来定义自己的type类型 以及存入的值

    //post表:

    public function searchableAs(){
        return 'post_index';
    }
    
    public function toSearchableArray()
    {
        return [
            'id'    =>  $this->id,
            'title' =>  $this->title,
            'picture'   =>  $this->cover_picture,
            'summary'   =>  $this->summar,
            'body'  =>  $this->body,
        ];
    }

    //article表:

    public function searchableAs() {
        return 'article_index';
    }
    
    public function toSearchableArray()
    {
       return $this->toArray();
    }

    //最终结果是 我先执行哪一个导入(php artisan scout:import "App\Post")那么对应的就能够生产,后续的导入不能够生效

    • 第二步 我修改了article表的searchableAs方法 return “post_index” 这种情况就可以导入了 不过是对ID重复的进行修改, ID不重复的新增
    
    
    ![file](https://lccdn.phphub.org/uploads/images/201806/14/25143/Zmb5hGL8fI.png?imageView2/2/w/1240/h/0)
  • Jourdon 努力向前!
    1周前

    有时间去研究下吧,应该不会有这种BUG吧?

暂无评论~~
您需要登陆以后才能留下评论!

Composer 中国全量镜像

Top 100 扩展包

Lumen 中文文档

Laravel 速查表

Laravel 中文文档

Laravel 项目开发规范

Laravel 开发环境部署

GraphQL PHP 中文文档

社区文档撰写指南

TDD 构建 Laravel 论坛笔记

PHP PSR 标准规范

PHP 设计模式全集

Dingo API 中文文档