【问题标题】:Convert Elastic Search Results to Laravel 5 Collection将弹性搜索结果转换为 Laravel 5 集合
【发布时间】:2015-05-08 08:31:07
【问题描述】:

我刚刚开始使用 Elastic Search (link) 来处理我在 Laravel 5 中的所有搜索功能。我正在将 Laravel 5 与 MySQL 一起用于数据存储,并在我的作曲家中使用 "elasticsearch/elasticsearch": "~1.0" .json 文件,然后模型观察者在每次模型发生更改时更新 Elastic Search 索引 (this article was very helpful for setting up Laravel observers)。

我可以成功查询我的数据并获得我想要的结果,但我想将结果转换回 Laravel 模型集合,以便我可以使用 Laravel 的关系在搜索结果视图中显示更多数据。

例如:我在 Elastic Search 中查询包含单词“cat”的文章列表,并收到带有一系列命中的典型响应。我想将此数组转换回 Laravel 的文章集合,这样我就可以使用文章的关系来获取并显示所有相关的评论。

我知道存在几个 Laravel 包,它们可能声称可以让这更容易,但我需要做一些非常复杂的搜索/过滤,如果可能的话,我想坚持使用官方的 elasticsearch/elasticsearch 包。

有什么建议吗?

【问题讨论】:

  • 我对elasticsearch一点也不熟悉,但我想如果我能帮助您进行头脑风暴,您可能会找到答案。如果弹性搜索返回一个 ID 数组,您可以使用弹性搜索结果 Article::whereIn('id', $elasticsearch_ids)->with('comments')->get() 来检索正常的 eloquent 模型。当然这也会导致运行两个额外的查询,所以可能不太理想。
  • @Azeame,这将是一个很好的解决方案,只是它会丢失集合的顺序/排名。

标签: elasticsearch laravel-5


【解决方案1】:

到那时,使用像 ElasticSearch 这样的 NoSQL 数据库的优势就消失了。

也许您可以在 ES 中为每篇文章存储最新更新的 cmets,但如果您只想显示一篇文章,则选择 MySQL 版本。

文章模型可能看起来像 tis。

{
"id": 1,
"title": "Lorem"
"comments" {
    {
        "id": 1
        "message": "First comment"
    },
    {
        "id": 2
        "message": "Second comment"
    }
}
}

仅从 ES 中检索 id 以便稍后从 SQL 中获取元素对我来说没有意义

【讨论】:

  • 我想知道是否可能是这种情况......我可能会走这条路。我只是喜欢更好地使用内置的 Laravel 关系(以及后续的内置 Laravel 函数):-)
  • 没错,做一个观察者,在创建或更新后用相关模型填充弹性搜索,然后你可以通过 1 个调用获取所有数据。
  • 我也建议走这条路。对于列表 - 使用 ElasticSearch。对于显示单个项目 - 选择具有所有关系的雄辩版本。就我而言 - 我存储在 ES 索引中也计算了一些关系(cmets 的数量、子项的数量等......)。这在评分中也很有用;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-11
  • 1970-01-01
  • 2018-02-16
  • 1970-01-01
  • 2017-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多