这是我的场景:
我正在开发一个基于Laravel 5.5的应用程序,该应用程序使用Scout和ElasticSearch 驱动程序来执行研究。Laravel 应用程序正在使用内置服务器(php artisan serve)运行。
我的 elasticsearch 集群使用Laradock environment在docker上运行。我有一个包含以下项目的索引:
{
"_index": "artworks",
"_type": "artworks",
"_id": "575",
"_score": 9.206466,
"_source": {
"fields": [
{
"name": "artwork_name",
"value": "Earl Mills",
"language": "it"
},
{
"name": "artwork_category",
"value": "Torp-Towne"
},
{
"name": "technique",
"value": "neque",
"language": "it"
},
{
"name": "subdivision",
"value": "facere",
"language": "it"
},
{
"name": "stamp",
"value": "Manuela Gulgowski"
},
{
"name": "cataloguer",
"value": "Cristal Lesch"
},
{
"name": "alt_dimensioni",
"value": "Sunt molestiae eligendi et sed doloremque dolor. Debitis provident saepe deleniti. Aperiam et sint quo vel repudiandae tempora dicta qui."
},
{
"name": "larg_dimensioni",
"value": "Et odit qui libero. Eaque molestiae itaque et sed enim et. Nihil quod ea odio distinctio. Voluptate tempore sit ad rerum."
},
{
"name": "prof_dimensioni",
"value": "Sed pariatur nihil quia quia dolorum illo. Quaerat est sed dolore et. Ab est possimus hic cum repudiandae vero qui. Quo sunt molestiae fugit perspiciatis dolores fugit."
},
{
"name": "Cartella_Serie",
"value": "Blanditiis incidunt quam dolor sunt. Labore voluptatem vero explicabo at molestiae eaque. Est ut incidunt voluptatibus ea impedit quos. Aspernatur dolorem unde vel ea."
},
{
"name": "Tiratura_Esemplare",
"value": "Omnis quis non sed et non est. Nobis et sit explicabo praesentium. Ut eveniet tempora ratione quae. Odit qui eum facilis odit nihil officiis."
},
{
"name": "Tiratura_Complessiva",
"value": "Fugit occaecati molestiae pariatur repellat mollitia. Eveniet iste quisquam et facilis. Iste accusantium magni quod magni architecto tempore quae. Beatae delectus sequi quibusdam et."
},
{
"name": "Firmato",
"value": "Provident quidem quam ut et quis. Consequuntur unde nesciunt eligendi asperiores. Nulla et voluptate ut dignissimos autem asperiores incidunt."
},
{
"name": "Titolo_per_ordinamento",
"value": "Eligendi consequatur odio reprehenderit quibusdam voluptatem. Veniam commodi necessitatibus dolorum dolorem voluptatum eveniet nobis. Optio dolores aspernatur odio non."
},
{
"name": "Note_Storico_Artistiche",
"value": "Sit a animi expedita dolore quos qui ea. Consectetur dignissimos aut natus nam animi. Aut vitae alias molestias. Cupiditate molestiae dolores dolorem sint dolores.",
"language": "en"
},
{
"name": "Note_Storico_Artistiche",
"value": "Eos optio aut explicabo delectus. Est nihil non id autem. Pariatur ea in eum odio.",
"language": "it"
}
]
}
该索引包含大约 1000 个项目,如上一个。我正在使用这样的查询测试性能:
{
"query":{
"bool":{
"must":[
[
{
"match":{
"fields.value":"Manuela Gulgowski"
}
}
]
]
}
}
}
使用 POST 方法直接调用 elasticsearch 实例的性能结果: http://localhost:9200/artworks/_search?pretty=true --> ~50ms
调用我的应用程序的性能结果: http://localhost:8000/api/v1/artworks/search?query=Manuela Gulgowski --> ~3500ms
两种方法每页返回 10 个元素。
我的方法很简单:
public function search(Request $request)
{
$query = $request->get("query");
$artworks = Artwork::search($query)->paginate(10);
return $this->sendResponse(new ArtworkCollectionResource($artworks));
}
有人知道我是否遗漏了什么或者我可以通过哪种方式提高性能? 我完全理解使用我的应用程序 api 我无法获得 50 毫秒的响应,但我希望它至少会在 600-700 毫秒内响应。
更新 经过大量测试,我发现我的应用程序有时会在 ~900 毫秒内响应,有时在 ~3500 毫秒内响应,这种延迟差异是由 Scout 驱动程序中的分页引起的。
$results = Collection::make($engine->map(
$rawResults = $engine->paginate($this, $perPage, $page), $this->model
));
我要进一步调查。