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.


Veritabanının durumu


mysql> SELECT count(*) AS TotalNotPublished
-> FROM post
-> WHERE is_published = false;
+-------------------+
| TotalNotPublished |
+-------------------+
| 486 |
+-------------------+
1 row in set (0.00 sec)

Kullanılacak sorgu


curl -XPOST "http://127.0.0.1:9200/_search?post_dev" -d'
{
"query": {
"bool": {
"must": [
{
"match": {
"is_published": false
}
}
]
}
}
}'

Varsayılan provider ayarı


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: ~

Sorgu sonucu


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": [
...
...
...
]
}
}

Kendi özel provider ayarlarımız


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: ~

Repository


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)));
}
}

Sorgu sonucu


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": [

]
}
}