21/05/2016 - ELASTICSEARCH, SYMFONY
Eğer FOSElasticaBundle ile varsayılan olarak gelen persistence seçeneğini kullanırsanız, $ app/console fos:elastica:populate komutunu çalıştırdığınızda, veritabanından tüm kayıtların seçileceğini bilirsiniz. Eğer bu durumu devre dışı bırakıp sadece istediğiniz kayıtları seçmek isterseniz, aşağıdaki örneği kullanabilirsiniz.
Bu örnekte, yayınlanmayan (unpublished) yazıları (post) seçmek ismemiyoruz.
mysql> SELECT count(*) AS TotalNotPublished
-> FROM post
-> WHERE is_published = false;
+-------------------+
| TotalNotPublished |
+-------------------+
| 486 |
+-------------------+
1 row in set (0.00 sec)
curl -XPOST "http://127.0.0.1:9200/_search?post_dev" -d'
{
"query": {
"bool": {
"must": [
{
"match": {
"is_published": false
}
}
]
}
}
}'
Bunu veritabanındaki tüm verileri seçip elasticsearch indexini dolduracağı için kullanmayacağız.
persistence:
driver: orm
model: Application\SearchBundle\Entity\Post
finder: ~
provider: ~
listener: ~
Maalesef yayınlanmayan (unpublished) tüm yazılar (post) seçilmiş durumda. Toplam 486 kayıt bulundu.
{
"took": 4,
"timed_out": false,
"_shards": {
"total": 15,
"successful": 15,
"failed": 0
},
"hits": {
"total": 486,
"max_score": 1.8724881,
"hits": [
...
...
...
]
}
}
Aşağıda ayarlar "PostRepository" içindeki createPublishedPostQueryBuilder methodunu çalıştırıp, sadece bizim seçtiğimiz kayıtları seçip indexleyecek.
persistence:
driver: orm
model: Application\SearchBundle\Entity\Post
finder: ~
provider:
query_builder_method: 'createPublishedPostQueryBuilder'
listener: ~
Aşağıda görünen $alias değişkeni, post entitisini p olarak temsil eder.
class PostRepository extends EntityRepository
{
public function createPublishedPostQueryBuilder($alias)
{
$qb = $this->createQueryBuilder($alias);
return $qb
->select($alias, 'c')
->join($alias.'.comment', 'c')
->where($qb->expr()->eq($alias.'.isPublished', $qb->expr()->literal(true)));
}
}
Aşağıda da gördüğümüz gibi toplam 0 kayıt bulundu, ki buda görmek istediğimiz birşeydi zaten.
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 15,
"successful": 15,
"failed": 0
},
"hits": {
"total": 0,
"max_score": null,
"hits": [
]
}
}