Я пытаюсь использовать ElasticSearch для индексации своих статей (в настоящее время используется демонстрационный проект Symfony).Я использую "ruflin/elastica": "^6.1"
bundle.
Я проверил индекс на kibana, и он работает, но мой контроллер, кажется, не взаимодействует правильно с ES:
BlogController.php:
use Elastica\Query;
use Elastica\Client;
use Elastica\Query\BoolQuery;
use Elastica\Query\MultiMatch;
/**
* @Route("/search", methods={"GET"}, name="blog_search")
*/
public function search(Request $request, Client $client): Response
{
if (!$request->isXmlHttpRequest()) {
return $this->render('blog/search.html.twig');
}
$query = $request->query->get('q', '');
$limit = $request->query->get('l', 10);
$match = new MultiMatch();
$match->setQuery($query);
$match->setFields(["title"]);
$bool = new BoolQuery();
$bool->addMust($match);
$elasticaQuery = new Query($bool);
$elasticaQuery->setSize($limit);
$foundPosts = $client->getIndex('blog')->search($elasticaQuery);
$results = [];
foreach ($foundPosts as $post) {
$results[] = $post->getSource();
}
return $this->json($results);
}
Это класс, который я использовал для индексации своих статей:
ArticleIndexer.php:
namespace App\Elasticsearch;
use App\Entity\Post;
use App\Repository\PostRepository;
use Elastica\Client;
use Elastica\Document;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
class ArticleIndexer
{
private $client;
private $postRepository;
private $router;
public function __construct(Client $client, PostRepository $postRepository, UrlGeneratorInterface $router)
{
$this->client = $client;
$this->postRepository = $postRepository;
$this->router = $router;
}
public function buildDocument(Post $post)
{
return new Document(
$post->getId(), // Manually defined ID
[
'title' => $post->getTitle(),
'summary' => $post->getSummary(),
'author' => $post->getAuthor()->getFullName(),
'content' => $post->getContent(),
// Not indexed but needed for display
'url' => $this->router->generate('blog_post', ['slug' => $post->getSlug()], UrlGeneratorInterface::ABSOLUTE_PATH),
'date' => $post->getPublishedAt()->format('M d, Y'),
],
"article" // Types are deprecated, to be removed in Elastic 7
);
}
public function indexAllDocuments($indexName)
{
$allPosts = $this->postRepository->findAll();
$index = $this->client->getIndex($indexName);
$documents = [];
foreach ($allPosts as $post) {
$documents[] = $this->buildDocument($post);
}
$index->addDocuments($documents);
$index->refresh();
}
}
Я могурезультаты моего исследования не получены, и у меня нет ошибок, поэтому я не знаю, что я пропустил в своей конфигурации.