diff options
Diffstat (limited to 'src/phinde/Elasticsearch.php')
| -rw-r--r-- | src/phinde/Elasticsearch.php | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/src/phinde/Elasticsearch.php b/src/phinde/Elasticsearch.php new file mode 100644 index 0000000..4bc4637 --- /dev/null +++ b/src/phinde/Elasticsearch.php @@ -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()); + } +} +?> |
