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

根据社区的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里面,后面的模型数据导入不了

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 13
Jourdon

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

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

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

5年前 评论

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

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

@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' => [  //  字段名,

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

5年前 评论
Jourdon

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

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

5年前 评论

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

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

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

5年前 评论

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

5年前 评论
Jourdon

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

5年前 评论
Jourdon

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

5年前 评论

@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://cdn.learnku.com/uploads/images/201806/14/25143/Zmb5hGL8fI.png?imageView2/2/w/1240/h/0)
5年前 评论
Jourdon

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

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!