Skip to content

Commit

Permalink
Refactor suggest implementation to more closely resemble query implem…
Browse files Browse the repository at this point in the history
…entation
  • Loading branch information
jlinn committed Dec 5, 2013
1 parent 03de015 commit bbcc90d
Show file tree
Hide file tree
Showing 13 changed files with 674 additions and 165 deletions.
1 change: 1 addition & 0 deletions .gitignore
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
.DS_Store
.idea
*.iml
.vagrant
.*
cache.properties
Expand Down
5 changes: 5 additions & 0 deletions changes.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
CHANGES

2013-12-05
- Add *.iml to .gitignore
- Refactor suggest implementation (\Elastica\Suggest, \Elastica\Suggest\AbstractSuggest, and \Elastica\Suggest\Term) to more closely resemble query implementation
- Add \Elastica\Suggest\Phrase, \Elastica\Suggest\CandidateGenerator\AbstractCandidateGenerator, and \Elastica\Suggest\CandidateGenerator\DirectGenerator

2013-12-04
- Remove boost from FunctionScore::addFunction because this is not supported by elasticsearch

Expand Down
8 changes: 6 additions & 2 deletions lib/Elastica/Query.php
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
use Elastica\Query\MatchAll;
use Elastica\Query\QueryString;
use Elastica\Suggest\AbstractSuggest;
use Elastica\Suggest;

/**
* Elastica query object
Expand Down Expand Up @@ -47,7 +48,7 @@ public function __construct($query = null)
$this->setRawQuery($query);
} elseif ($query instanceof AbstractQuery) {
$this->setQuery($query);
} elseif ($query instanceof AbstractSuggest) {
} elseif ($query instanceof AbstractSuggest || $query instanceof Suggest) {
$this->addSuggest($query);
}
}
Expand Down Expand Up @@ -82,6 +83,9 @@ public static function create($query)
case $query instanceof AbstractSuggest:
return new self($query);

case $query instanceof Suggest:
return new self($query);

}

// TODO: Implement queries without
Expand Down Expand Up @@ -350,7 +354,7 @@ public function setMinScore($minScore)
/**
* Add a suggest term
*
* @param \Elastica\Query Query object
* @param \Elastica\Suggest $query suggestion object
*/
public function addSuggest($query)
{
Expand Down
8 changes: 3 additions & 5 deletions lib/Elastica/ResultSet.php
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -102,11 +102,9 @@ protected function _init(Response $response)
}
}

foreach($result as $key => $value) {
if($key != '_shards') {
if(isset($value[0]['options']) && count($value[0]['options'])>0) {
$this->_suggests[$key] = $value[0];
}
if(isset($result['suggest'])){
foreach($result['suggest'] as $key => $value){
$this->_suggests[$key] = $value[0];
}
}
}
Expand Down
63 changes: 29 additions & 34 deletions lib/Elastica/Search.php
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace Elastica;

use Elastica\Exception\InvalidException;
use Elastica\Suggest;

/**
* Elastica search object
Expand Down Expand Up @@ -81,7 +82,7 @@ public function __construct(Client $client)
/**
* Adds a index to the list
*
* @param \Elastica\Index|string $index Index object or string
* @param \Elastica\Index|string $index Index object or string
* @throws \Elastica\Exception\InvalidException
* @return \Elastica\Search Current object
*/
Expand All @@ -103,7 +104,7 @@ public function addIndex($index)
/**
* Add array of indices at once
*
* @param array $indices
* @param array $indices
* @return \Elastica\Search
*/
public function addIndices(array $indices = array())
Expand All @@ -118,7 +119,7 @@ public function addIndices(array $indices = array())
/**
* Adds a type to the current search
*
* @param \Elastica\Type|string $type Type name or object
* @param \Elastica\Type|string $type Type name or object
* @return \Elastica\Search Search object
* @throws \Elastica\Exception\InvalidException
*/
Expand All @@ -140,7 +141,7 @@ public function addType($type)
/**
* Add array of types
*
* @param array $types
* @param array $types
* @return \Elastica\Search
*/
public function addTypes(array $types = array())
Expand All @@ -153,7 +154,7 @@ public function addTypes(array $types = array())
}

/**
* @param string|array|\Elastica\Query|Elastica\Suggest\Term|\Elastica\Query\AbstractQuery|\Elastica\Filter\AbstractFilter $query|
* @param string|array|\Elastica\Query|\Elastica\Suggest|\Elastica\Query\AbstractQuery|\Elastica\Filter\AbstractFilter $query|
* @return \Elastica\Search
*/
public function setQuery($query)
Expand All @@ -164,8 +165,8 @@ public function setQuery($query)
}

/**
* @param string $key
* @param mixed $value
* @param string $key
* @param mixed $value
* @return \Elastica\Search
*/
public function setOption($key, $value)
Expand All @@ -178,7 +179,7 @@ public function setOption($key, $value)
}

/**
* @param array $options
* @param array $options
* @return \Elastica\Search
*/
public function setOptions(array $options)
Expand All @@ -203,8 +204,8 @@ public function clearOptions()
}

/**
* @param string $key
* @param mixed $value
* @param string $key
* @param mixed $value
* @return \Elastica\Search
*/
public function addOption($key, $value)
Expand All @@ -230,7 +231,7 @@ public function hasOption($key)
}

/**
* @param string $key
* @param string $key
* @return mixed
* @throws \Elastica\Exception\InvalidException
*/
Expand All @@ -252,7 +253,7 @@ public function getOptions()
}

/**
* @param string $key
* @param string $key
* @return bool
* @throws \Elastica\Exception\InvalidException
*/
Expand Down Expand Up @@ -362,7 +363,7 @@ public function getQuery()
/**
* Creates new search object
*
* @param \Elastica\SearchableInterface $searchObject
* @param \Elastica\SearchableInterface $searchObject
* @return \Elastica\Search
*/
public static function create(SearchableInterface $searchObject)
Expand All @@ -377,10 +378,10 @@ public static function create(SearchableInterface $searchObject)
*/
public function getPath()
{
if (isset($this->_options[self::OPTION_SCROLL_ID])) {
return '_search/scroll';
}
if (isset($this->_options[self::OPTION_SCROLL_ID])) {
return '_search/scroll';
}

$indices = $this->getIndices();

$path = '';
Expand All @@ -398,19 +399,15 @@ public function getPath()
$path .= '/' . implode(',', $types);
}

if(isset($this->_options[self::OPTION_SEARCH_TYPE_SUGGEST])) {
return '/_suggest';
}

// Add full path based on indices and types -> could be all
return $path . '/_search';
}

/**
* Search in the set indices, types
*
* @param mixed $query
* @param int|array $options OPTIONAL Limit or associative array of options (option=>value)
* @param mixed $query
* @param int|array $options OPTIONAL Limit or associative array of options (option=>value)
* @throws \Elastica\Exception\InvalidException
* @return \Elastica\ResultSet
*/
Expand All @@ -436,7 +433,7 @@ public function search($query = '', $options = null)
/**
*
* @param mixed $query
* @param $fullResult (default = false) By default only the total hit count is returned. If set to true, the full ResultSet including facets is returned.
* @param $fullResult (default = false) By default only the total hit count is returned. If set to true, the full ResultSet including facets is returned.
* @return int|ResultSet
*/
public function count($query = '', $fullResult = false)
Expand All @@ -453,12 +450,12 @@ public function count($query = '', $fullResult = false)
array(self::OPTION_SEARCH_TYPE => self::OPTION_SEARCH_TYPE_COUNT)
);
$resultSet = new ResultSet($response, $query);
return $fullResult?$resultSet:$resultSet->getTotalHits();

return $fullResult ? $resultSet : $resultSet->getTotalHits();
}

/**
* @param array|int $options
* @param array|int $options
* @param string|array|\Elastica\Query $query
* @return \Elastica\Search
*/
Expand All @@ -475,7 +472,7 @@ public function setOptionsAndQuery($options = null, $query = '')
$this->getQuery()->setSize($options['limit']);
unset($options['limit']);
}
if (isset($options['explain'])) {
if (isset($options['explain'])) {
$this->getQuery()->setExplain($options['explain']);
unset($options['explain']);
}
Expand All @@ -486,13 +483,11 @@ public function setOptionsAndQuery($options = null, $query = '')
}

/**
* @param \Elastica\Suggest\Term $term
* @return \Elastica\Search
* @param Suggest $suggest
* @return Search
*/
public function addSuggest($suggest)
public function setSuggest(Suggest $suggest)
{
$this->setOptionsAndQuery(array(self::OPTION_SEARCH_TYPE_SUGGEST => 'suggest'), $suggest);

return $this;
return $this->setOptionsAndQuery(array(self::OPTION_SEARCH_TYPE_SUGGEST => 'suggest'), $suggest);
}
}
30 changes: 30 additions & 0 deletions lib/Elastica/Suggest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?php

namespace Elastica;


use Elastica\Param;
use Elastica\Suggest\AbstractSuggest;

/**
* Class Suggest
* @package Elastica\Suggest
* @link http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-suggesters.html
*/
class Suggest extends Param
{
/**
* Set the global text for this suggester
* @param string $text
* @return \Elastica\Suggest
*/
public function setGlobalText($text)
{
return $this->setParam("text", $text);
}

public function addSuggestion(AbstractSuggest $suggestion)
{
return $this->setParam($suggestion->getName(), $suggestion->toArray());
}
}
85 changes: 79 additions & 6 deletions lib/Elastica/Suggest/AbstractSuggest.php
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,15 +1,88 @@
<?php

namespace Elastica\Suggest;


use Elastica\Param;

/**
* Abstract suggest object. Should be extended by all suggest types.
*
* @category Xodoa
* @package Elastica
* @author Imanol Cea <[email protected]>
* Class AbstractSuggestion
* @package Elastica\Suggest
*/
abstract class AbstractSuggest extends Param
{
}
/**
* @var string the name of this suggestion
*/
protected $_name;

/**
* @var string the text for this suggestion
*/
protected $_text;

public function __construct($name, $field)
{
$this->_name = $name;
$this->setField($field);
}

/**
* Suggest text must be set either globally or per suggestion
* @param string $text
* @return \Elastica\Suggest\AbstractSuggest
*/
public function setText($text)
{
$this->_text = $text;
return $this;
}

/**
* @param string $field
* @return \Elastica\Suggest\AbstractSuggest
*/
public function setField($field)
{
return $this->setParam("field", $field);
}

/**
* @param int $size
* @return \Elastica\Suggest\AbstractSuggest
*/
public function setSize($size)
{
return $this->setParam("size", $size);
}

/**
* @param int $size maximum number of suggestions to be retrieved from each shard
* @return \Elastica\Suggest\AbstractSuggest
*/
public function setShardSize($size)
{
return $this->setParam("shard_size", $size);
}

/**
* Retrieve the name of this suggestion
* @return string
*/
public function getName()
{
return $this->_name;
}

/**
* @return array
*/
public function toArray()
{
$array = parent::toArray();
if (isset($this->_text)) {
$array['text'] = $this->_text;
}
return $array;
}
}
Loading

0 comments on commit bbcc90d

Please sign in to comment.