first frontend
[phinde.git] / src / phinde / Elasticsearch.php
diff --git a/src/phinde/Elasticsearch.php b/src/phinde/Elasticsearch.php
new file mode 100644 (file)
index 0000000..4bc4637
--- /dev/null
@@ -0,0 +1,146 @@
+<?php
+namespace phinde;
+
+class Elasticsearch
+{
+    protected $baseUrl;
+
+    public function __construct($baseUrl)
+    {
+        $this->baseUrl = $baseUrl;
+    }
+
+    /**
+     * @link https://www.elastic.co/guide/en/elasticsearch/guide/current/_finding_exact_values.html
+     */
+    public function isKnown($url)
+    {
+        $r = new Elasticsearch_Request(
+            $this->baseUrl . 'document/_search/exists',
+            \HTTP_Request2::METHOD_GET
+        );
+        $r->allow404 = true;
+        $r->setBody(
+            json_encode(
+                array(
+                    'query' => array(
+                        'filtered' => array(
+                            'filter' => array(
+                                'term' => array(
+                                    'url' => $url
+                                )
+                            )
+                        )
+                    )
+                )
+            )
+        );
+        $res = json_decode($r->send()->getBody());
+        return $res->exists;
+    }
+
+    public function get($url)
+    {
+        $r = new Elasticsearch_Request(
+            $this->baseUrl . 'document/' . rawurlencode($url),
+            \HTTP_Request2::METHOD_GET
+        );
+        $r->allow404 = true;
+        $res = $r->send();
+        if ($res->getStatus() != 200) {
+            return null;
+        }
+        $d = json_decode($res->getBody());
+        return $d->_source;
+    }
+
+    public function markQueued($url)
+    {
+        $r = new Elasticsearch_Request(
+            $this->baseUrl . 'document/' . rawurlencode($url),
+            \HTTP_Request2::METHOD_PUT
+        );
+        $doc = array(
+            'status' => 'queued',
+            'url' => $url
+        );
+        $r->setBody(json_encode($doc));
+        $r->send();
+    }
+
+    public function search($query, $filters, $page, $perPage)
+    {
+        $r = new Elasticsearch_Request(
+            $this->baseUrl . 'document/_search',
+            \HTTP_Request2::METHOD_GET
+        );
+        $doc = array(
+            '_source' => array(
+                'url',
+                'title',
+                'author',
+                'modate',
+            ),
+            'query' => array(
+                'bool' => array(
+                    'must' => array(
+                        array(
+                            'query_string' => array(
+                                'default_field' => '_all',
+                                'query' => $query
+                            )
+                        ),
+                        array(
+                            'term' => array(
+                                'status' => 'indexed'
+                            )
+                        ),
+                    )
+                )
+            ),
+            'aggregations' => array(
+                'tags' => array(
+                    'terms' => array(
+                        'field' => 'tags'
+                    )
+                ),
+                'language' => array(
+                    'terms' => array(
+                        'field' => 'language'
+                    )
+                ),
+                'domain' => array(
+                    'terms' => array(
+                        'field' => 'domain'
+                    )
+                ),
+                'type' => array(
+                    'terms' => array(
+                        'field' => 'type'
+                    )
+                )
+            ),
+            'from' => $page * $perPage,
+            'size' => $perPage,
+            'sort' => array(
+                //array('modate' => array('order' => 'desc'))
+            )
+        );
+        foreach ($filters as $type => $value) {
+            $doc['query']['bool']['must'][] = array(
+                'term' => array(
+                    $type => $value
+                )
+            );
+        }
+
+        //unset($doc['_source']);
+
+        //ini_set('xdebug.var_display_max_depth', 10);
+        //return json_decode(json_encode($doc));
+        $r->setBody(json_encode($doc));
+        $res = $r->send();
+        return json_decode($res->getBody());
+    }
+}
+?>