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