Nikerabbit has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/123566

Change subject: WIP: Translation search for elastic search backend
......................................................................

WIP: Translation search for elastic search backend

Paired with Kartik.

Working: basic search and facet display
Not working: filtering, highlighting, browsing more results
Todo: abstract so that Special:SearchTranslations can work with any available 
backend

Change-Id: Ic05156be893bdb66e1d0a81667d8ba1c7408a453
---
M specials/SpecialSearchTranslations.php
M ttmserver/ElasticSearchTTMServer.php
2 files changed, 54 insertions(+), 36 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Translate 
refs/changes/66/123566/1

diff --git a/specials/SpecialSearchTranslations.php 
b/specials/SpecialSearchTranslations.php
index e1ae0bd..7fb563c 100644
--- a/specials/SpecialSearchTranslations.php
+++ b/specials/SpecialSearchTranslations.php
@@ -56,7 +56,7 @@
                $this->checkPermissions();
 
                $server = TTMServer::primary();
-               if ( !$server instanceof SolrTTMServer ) {
+               if ( !$server instanceof ElasticSearchTTMServer ) {
                        throw new ErrorPageError( 'tux-sst-nosolr-title', 
'tux-sst-nosolr-body' );
                }
 
@@ -80,29 +80,30 @@
                }
 
                try {
-                       $resultset = $this->doSearch( $server->getSolarium(), 
$queryString );
-               } catch ( Solarium_Client_HttpException $e ) {
-                       error_log( 'Translate: Solr search server unavailable' 
);
+                       $resultset = $this->doSearch( $server->getType(), 
$queryString );
+               } catch ( \Elastica\Exception\ExceptionInterface $e ) {
+                       error_log( 'Translate: ElasticSearch search server 
unavailable' );
                        throw new ErrorPageError( 'tux-sst-solr-offline-title', 
'tux-sst-solr-offline-body' );
                }
 
                // Part 1: facets
                $facets = '';
 
-               $facet = $resultset->getFacetSet()->getFacet( 'language' );
+               $facetSets = $resultset->getFacets();
 
+               $facetLanguage = $facetSets['language'];
                $facets .= Html::element( 'div',
                        array( 'class' => 'row facet languages',
-                               'data-facets' => FormatJson::encode( 
$this->getLanguages( $facet ) ),
+                               'data-facets' => FormatJson::encode( 
$this->getLanguages( $facetLanguage['terms'] ) ),
                                'data-language' => $opts->getValue( 'language' 
),
                        ),
                        $this->msg( 'tux-sst-facet-language' )
                );
 
-               $facet = $resultset->getFacetSet()->getFacet( 'group' );
+               $facetGroup = $facetSets['group'];
                $facets .= Html::element( 'div',
                        array( 'class' => 'row facet groups',
-                               'data-facets' => FormatJson::encode( 
$this->getGroups( $facet ) ),
+                               'data-facets' => FormatJson::encode( 
$this->getGroups( $facetGroup['terms'] ) ),
                                'data-group' => $opts->getValue( 'group' ), ),
                        $this->msg( 'tux-sst-facet-group' )
                );
@@ -110,10 +111,10 @@
                // Part 2: results
                $results = '';
 
-               $highlighting = $resultset->getHighlighting();
-               foreach ( $resultset as $document ) {
+               //$highlighting = $resultset->getHighlighting();
+               foreach ( $resultset->getResults() as $document ) {
 
-                       $hdoc = $highlighting->getResult( $document->globalid );
+                       /*$hdoc = $highlighting->getResult( $document->globalid 
);
                        $text = $hdoc->getField( 'text' );
                        if ( $text === array() ) {
                                $text = $document->text;
@@ -125,9 +126,11 @@
                                list( $pre, $post ) = $this->hl;
                                $text = str_replace( $pre, '<strong 
class="tux-highlight">', $text );
                                $text = str_replace( $post, '</strong>', $text 
);
-                       }
+                       }*/
+                       $data = $document->getData();
+                       $text = $data['content'];
 
-                       $title = Title::newFromText( $document->messageid . '/' 
. $document->language );
+                       $title = Title::newFromText( $data['localid']. '/' . 
$data['language'] );
                        if ( !$title ) {
                                // Should not ever happen but who knows...
                                continue;
@@ -173,7 +176,7 @@
                }
 
                $prev = $next = '';
-               $total = $resultset->getNumFound();
+               $total = $resultset->getTotalHits();
                $offset = $this->getRequest()->getInt( 'offset' );
                $params = $this->getRequest()->getValues();
 
@@ -197,13 +200,35 @@
                $results .= Html::rawElement( 'div', array(), "$prev $next" );
 
                $search = $this->getSearchInput( $queryString );
-               $count = $this->msg( 'tux-sst-count' )->numParams( 
$resultset->getNumFound() );
+               $count = $this->msg( 'tux-sst-count' )->numParams( 
$resultset->getTotalHits() );
 
                $this->showSearch( $search, $count, $facets, $results );
        }
 
-       protected function doSearch( Solarium_Client $client, $queryString ) {
-               $query = $client->createSelect();
+       protected function doSearch( \Elastica\Type $type, $queryString ) {
+               $query = new \Elastica\Query();
+
+               $queryStringQuery = new \Elastica\Query\QueryString();
+               $queryStringQuery->setQuery( $queryString );
+               $query->setQuery( $queryStringQuery );
+
+               $language = new \Elastica\Facet\Terms( 'language' );
+               $language->setField( 'language' );
+               //$language->setMincount( 1 );
+               //$language->addExclude( 'filter' );
+               $query->addFacet( $language );
+
+               $group = new \Elastica\Facet\Terms( 'group' );
+               $group->setField( 'group' );
+               //$group->setMincount( 1 );
+               //$group->setMissing( true );
+               //$group->addExclude( 'filter' );
+               $query->addFacet( $group );
+
+               $result = $type->getIndex()->search( $query );
+               return $result;
+
+
                $dismax = $query->getDisMax();
                $dismax->setQueryParser( 'edismax' );
                $query->setQuery( $queryString );
@@ -233,29 +258,18 @@
                                ->addTag( 'filter' );
                }
 
-               $facetSet = $query->getFacetSet();
-
-               $language = $facetSet->createFacetField( 'language' );
-               $language->setField( 'language' );
-               $language->setMincount( 1 );
-               $language->addExclude( 'filter' );
-
-               $group = $facetSet->createFacetField( 'group' );
-               $group->setField( 'group' );
-               $group->setMincount( 1 );
-               $group->setMissing( true );
-               $group->addExclude( 'filter' );
-
-               return $client->select( $query );
+               return $client->getType()->getIndex()->search( $query );
        }
 
-       protected function getLanguages( Solarium_Result_Select_Facet_Field 
$facet ) {
+       protected function getLanguages( array $facet ) {
                $output = array();
 
                $nondefaults = $this->opts->getChangedValues();
                $selected = $this->opts->getValue( 'language' );
 
-               foreach ( $facet as $key => $value ) {
+               foreach ( $facet as $item ) {
+                       $key = $item['term'];
+                       $value = $item['count'];
                        if ( $key === $selected ) {
                                unset( $nondefaults['language'] );
                        } else {
@@ -274,9 +288,13 @@
                return $output;
        }
 
-       protected function getGroups( Solarium_Result_Select_Facet_Field $facet 
) {
+       protected function getGroups( array $facet ) {
                $structure = MessageGroups::getGroupStructure();
-               $counts = iterator_to_array( $facet );
+
+               $counts = array();
+               foreach ( $facet as $item ) {
+                       $counts[$item['term']] = $item['count'];
+               }
 
                return $this->makeGroupFacetRows( $structure, $counts );
        }
diff --git a/ttmserver/ElasticSearchTTMServer.php 
b/ttmserver/ElasticSearchTTMServer.php
index cfbbac1..4241f3a 100644
--- a/ttmserver/ElasticSearchTTMServer.php
+++ b/ttmserver/ElasticSearchTTMServer.php
@@ -317,7 +317,7 @@
                return $this->client;
        }
 
-       protected function getType() {
+       public function getType() {
                return $this->getClient()->getIndex( 'ttmserver' )->getType( 
'message' );
        }
 

-- 
To view, visit https://gerrit.wikimedia.org/r/123566
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ic05156be893bdb66e1d0a81667d8ba1c7408a453
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Translate
Gerrit-Branch: master
Gerrit-Owner: Nikerabbit <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to