Skip to content
This repository was archived by the owner on Apr 23, 2025. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@ before_script:
- if [[ "$TRAVIS_PHP_VERSION" != hhvm* ]]; then echo 'error_log = syslog' >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini; fi
- if [[ "$TRAVIS_PHP_VERSION" != hhvm* ]]; then echo 'sendmail_path = /bin/true' >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini; fi
- if [[ "$TRAVIS_PHP_VERSION" == hhvm* ]]; then echo -e 'sendmail_path = /bin/true' | sudo tee -a /etc/hhvm/php.ini; fi
- if [[ "$TRAVIS_PHP_VERSION" == 5.6 ]]; then echo 'mbstring.http_input = pass' >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/trvis.ini; fi
- if [[ "$TRAVIS_PHP_VERSION" == 5.6 ]]; then echo 'mbstring.http_output = pass' >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/trvis.ini; fi
- $TRAVIS_BUILD_DIR/vendor/bin/drush --debug --yes make tests/includes/search_api_elasticsearch.make build
- mkdir -p $MODULE_PATH
- git archive $(git rev-parse --abbrev-ref HEAD) | tar -x -C $MODULE_PATH
Expand Down
90 changes: 8 additions & 82 deletions modules/elastica/includes/SearchApiElasticsearchElastica.inc
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,8 @@ class SearchApiElasticsearchElastica extends SearchApiElasticsearchAbstractServi
*/
public function search(SearchApiQueryInterface $query) {

$searcher = new SearchApiElasticsearchElasticaSearcher($query, $this);

// Results.
$search_result = array('result count' => 0);

Expand All @@ -327,19 +329,18 @@ class SearchApiElasticsearchElastica extends SearchApiElasticsearchAbstractServi

// Get query options.
$query_options = $this->getSearchQueryOptions($query);

$query_options = array_merge($query_options, $searcher->getOptions());
// Check elasticsearch index.
if (empty($elastica_type)) {
return $search_result;
}

// Build Elastica query.
$elastica_query = $this->buildSearchQuery($query);
$elastica_query = $searcher->build();

// Add facets.
$this->addSearchFacets($elastica_query, $query);

$response = SearchApiElasticsearchElasticaSearcher::search($elastica_type, $elastica_query, $query_options, $query);
$response = $searcher->search($elastica_type, $elastica_query, $query_options);

// Show Elasticsearch query string from Elastica
// as json output when views debug output is enabled.
Expand Down Expand Up @@ -563,56 +564,6 @@ class SearchApiElasticsearchElastica extends SearchApiElasticsearchAbstractServi
return !empty($elastica_index) ? $elastica_index->getType($index->machine_name) : NULL;
}

/**
* Helper function build search query().
*/
protected function buildSearchQuery(SearchApiQueryInterface $query) {
// Query options.
$query_options = $this->getSearchQueryOptions($query);

// Main query.
$elastica_query = new Elastica\Query();
$elastica_query->setFrom($query_options['query_offset']);
$elastica_query->setSize($query_options['query_limit']);

// Search API Location support.
if (!empty($query_options['spatials'])) {
foreach ($query_options['spatials'] as $i => $spatial) {
if (empty($spatial['field']) || empty($spatial['lat']) || empty($spatial['lon'])) {
continue;
}

$field = $spatial['field'];
$point = array(
'lat' => (float) $spatial['lat'],
'lon' => (float) $spatial['lon'],
);

$radius = isset($spatial['radius']) ? (float) $spatial['radius'] : NULL;

$query_options['query_search_filter'] = new Elastica\Filter\GeoDistance($field, $point, $radius);
}
}

// Build the query.
if (!empty($query_options['query_search_string']) && !empty($query_options['query_search_filter'])) {
$elastica_query->setQuery(new Elastica\Query\Filtered($query_options['query_search_string'], $query_options['query_search_filter']));
}
elseif (!empty($query_options['query_search_string'])) {
$elastica_query->setQuery($query_options['query_search_string']);
}
elseif (!empty($query_options['query_search_filter'])) {
$elastica_query->setFilter($query_options['query_search_filter']);
}

// Sort.
if (!empty($query_options['sort'])) {
$elastica_query->setSort($query_options['sort']);
}

return $elastica_query;
}

/**
* Helper function build facets in search.
*/
Expand Down Expand Up @@ -796,25 +747,15 @@ class SearchApiElasticsearchElastica extends SearchApiElasticsearchAbstractServi
*/
protected function getSearchQueryOptions(SearchApiQueryInterface $query) {

// Query options.
$query_options = $query->getOptions();

// Index fields.
$index_fields = $this->getIndexFields($query);

// Range.
$query_offset = empty($query_options['offset']) ? 0 : $query_options['offset'];
$query_limit = empty($query_options['limit']) ? 10 : $query_options['limit'];

// Query string.
$query_search_string = NULL;

// Query filter.
$query_search_filter = NULL;

// Query analyzer.
$analyzer = isset($query_options['analyzer']) ? $query_options['analyzer'] : NULL;

// Full text search.
$keys = $query->getKeys();
if (!empty($keys)) {
Expand Down Expand Up @@ -852,28 +793,13 @@ class SearchApiElasticsearchElastica extends SearchApiElasticsearchAbstractServi
$query_search_filter = $parsed_query_filters[0];
}

// More Like This.
$mlt = array();
if (isset($query_options['search_api_mlt'])) {
$mlt = $query_options['search_api_mlt'];
}

// Spatials.
$spatials = array();
if (isset($query_options['search_api_location'])) {
$spatials = $query_options['search_api_location'];
}

return array(
'query_offset' => $query_offset,
'query_limit' => $query_limit,
$query_options = array(
'query_search_string' => $query_search_string,
'query_search_filter' => $query_search_filter,
'sort' => $sort,
'mlt' => $mlt,
'analyzer' => $analyzer,
'spatials' => $spatials,
);

return $query_options;
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,91 @@

class SearchApiElasticsearchElasticaSearcher {

static public function search($type, $query, $options, SearchApiQueryInterface $search_api_query) {
public function __construct(SearchApiQueryInterface $search_api_query, $service) {
$this->search_api_query = $search_api_query;
$this->service = $service;
}

public function build() {
// Query options.
$query_options = $this->service->getSearchQueryOptions($this->search_api_query);

// Main query.
$elastica_query = new Elastica\Query();
$elastica_query->setFrom($query_options['query_offset']);
$elastica_query->setSize($query_options['query_limit']);

// Search API Location support.
if (!empty($query_options['spatials'])) {
foreach ($query_options['spatials'] as $i => $spatial) {
if (empty($spatial['field']) || empty($spatial['lat']) || empty($spatial['lon'])) {
continue;
}

$field = $spatial['field'];
$point = array(
'lat' => (float) $spatial['lat'],
'lon' => (float) $spatial['lon'],
);

$radius = isset($spatial['radius']) ? (float) $spatial['radius'] : NULL;

$query_options['query_search_filter'] = new Elastica\Filter\GeoDistance($field, $point, $radius);
}
}

// Build the query.
if (!empty($query_options['query_search_string']) && !empty($query_options['query_search_filter'])) {
$elastica_query->setQuery(new Elastica\Query\Filtered($query_options['query_search_string'], $query_options['query_search_filter']));
}
elseif (!empty($query_options['query_search_string'])) {
$elastica_query->setQuery($query_options['query_search_string']);
}
elseif (!empty($query_options['query_search_filter'])) {
$elastica_query->setFilter($query_options['query_search_filter']);
}

// Sort.
if (!empty($query_options['sort'])) {
$elastica_query->setSort($query_options['sort']);
}

$this->query = $elastica_query;
return $this->query;
}

public function getOptions() {
$query_options = $this->search_api_query->getOptions();
$this->mapOptions($query_options);

return $query_options;
}

public function search($type, $elastica_query, $options) {
if (!empty($options['mlt'])) {
SearchApiElasticsearchElasticaMLT::build($type, $options, $query);
SearchApiElasticsearchElasticaMLT::build($type, $options, $this->query);
}

drupal_alter('search_api_elasticsearch_elastica_query', $query, $search_api_query);
drupal_alter('search_api_elasticsearch_elastica_query', $this->query, $this->search_api_query);

return $type->search($query);
}

protected function mapOptions(&$options) {
// Key: Search API key.
// Value: Our key.
$options_map = array(
'query_offset' => 'offset',
'query_limit' => 'limit',
'search_api_location' => 'spatials',
'search_api_mlt' => 'mlt',
);

foreach ($options as $key => $value) {
if (in_array($key, array_keys($options_map))) {
$options[$options_map[$key]] = $value;
}
}
}

}
12 changes: 0 additions & 12 deletions search_api_elasticsearch.module
Original file line number Diff line number Diff line change
Expand Up @@ -23,18 +23,6 @@ function search_api_elasticsearch_menu() {
return $items;
}

/**
* Implements hook_search_api_service_info().
*/
function search_api_elasticsearch_search_api_service_info() {
$services['search_api_elasticsearch_service'] = array(
'name' => t('Elasticsearch service (DEPRECATED)'),
'description' => t('DEPRECATED. WILL BE REMOVED BEFORE BETA'),
'class' => 'SearchApiElasticsearchService',
);
return $services;
}

/**
* Implements hook_views_api().
*/
Expand Down
Loading