jenkins-bot has submitted this change and it was merged.

Change subject: Boosted all field
......................................................................


Boosted all field

Create an "all" field that is different from elasticsearch's "_all" field
in that it contains multiple copies of the other fields repeated for
weighting.  Why from the docs:

Enable building and using of "all" fields that contain multiple copies of
other fields for weighting.  These all fields exist entirely to speed up the
full_text query type by baking the weights above into a single field.  This
is useful because it drasticly reduces the random io to power the query from
14 term queries per term in the query string to 2.  Each term query is
potentially one or two disk random io actions.  The reduction isn't strictly
7:1 because we skip file_text in non file namespace (now 6:1) and the near
match fields (title and redirect) also kick it, but only once per query.
Also don't forget the io from the phrase rescore - this helps with that, but
its even more muddy how much.

Change-Id: I6158c932d01a8b96e6714f9b31c8561ff8517c34
---
M CirrusSearch.php
M includes/Hooks.php
M includes/MappingConfigBuilder.php
M includes/Searcher.php
A tests/browser/Relevancytestphraseviaopening.txt
A tests/browser/articles/Relevancytestphraseviaauxtext.txt
A tests/browser/articles/Relevancytestphraseviaopening.txt
M tests/browser/articles/Relevancytestviaauxtext.txt
M tests/browser/articles/Relevancytestviaopening.txt
M tests/browser/features/full_text.feature
M tests/browser/features/relevancy.feature
M tests/browser/features/support/hooks.rb
M tests/jenkins/Jenkins.php
13 files changed, 175 insertions(+), 47 deletions(-)

Approvals:
  Chad: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/CirrusSearch.php b/CirrusSearch.php
index 0e91c6b..b7f3700 100644
--- a/CirrusSearch.php
+++ b/CirrusSearch.php
@@ -202,17 +202,33 @@
 // Maximum number of newly unlinked articles to update when an article changes.
 $wgCirrusSearchUnlinkedArticlesToUpdate = 25;
 
-// Weight of fields relative to article text
+// Weight of fields.  Must be integers not decimals.  If 
$wgCirrusSearchAllFields['use']
+// is false this can be changed on the fly.  If it is true then changes to 
this require
+// an in place reindex to take effect.
 $wgCirrusSearchWeights = array(
-       'title' => 20.0,
-       'redirect' => 15.0,
-       'category' => 8.0,
-       'heading' => 5.0,
-       'opening_text' => 4.0,
-       'auxiliary_text' => 0.8,
-       'file_text' => 0.5,
+       'title' => 40,
+       'redirect' => 30,
+       'category' => 16,
+       'heading' => 10,
+       'opening_text' => 8,
+       'text' => 2,
+       'auxiliary_text' => 1,
+       'file_text' => 1,
 );
 
+// Enable building and using of "all" fields that contain multiple copies of 
other fields
+// for weighting.  These all fields exist entirely to speed up the full_text 
query type by
+// baking the weights above into a single field.  This is useful because it 
drasticly
+// reduces the random io to power the query from 14 term queries per term in 
the query
+// string to 2.  Each term query is potentially one or two disk random io 
actions.  The
+// reduction isn't strictly 7:1 because we skip file_text in non file 
namespace (now 6:1)
+// and the near match fields (title and redirect) also kick it, but only once 
per query.
+// Also don't forget the io from the phrase rescore - this helps with that, 
but its even
+// more muddy how much.
+// Note setting 'use' to true without having set 'build' to true and 
performing an in place
+// reindex will cause all searches to find nothing.
+$wgCirrusSearchAllFields = array( 'build' => false, 'use' => false );
+
 // The method Cirrus will use to extract the opening section of the text.  
Valid values are:
 // * first_heading - Wikipedia style.  Grab the text before the first heading 
(h1-h6) tag.
 // * none - Do not extract opening text and do not search it.
diff --git a/includes/Hooks.php b/includes/Hooks.php
index 0c76d0b..1cbf246 100644
--- a/includes/Hooks.php
+++ b/includes/Hooks.php
@@ -69,7 +69,8 @@
                        $wgCirrusSearchPhraseRescoreWindowSize,
                        $wgCirrusSearchFunctionRescoreWindowSize,
                        $wgCirrusSearchFragmentSize,
-                       $wgCirrusSearchBoostLinks;
+                       $wgCirrusSearchBoostLinks,
+                       $wgCirrusSearchAllFields;
 
                // If the user has the BetaFeature enabled, use Cirrus as 
default.
                if ( $wgCirrusSearchEnablePref && $user->isLoggedIn() && 
class_exists( 'BetaFeatures' )
@@ -115,6 +116,14 @@
                                        $wgCirrusSearchBoostLinks = false;
                                }
                        }
+                       $useAllFields = $request->getVal( 'cirrusUseAllFields' 
);
+                       if ( $useAllFields !== null ) {
+                               if ( $useAllFields === 'yes' ) {
+                                       $wgCirrusSearchAllFields[ 'use' ] = 
true;
+                               } elseif( $useAllFields = 'no' ) {
+                                       $wgCirrusSearchAllFields[ 'use' ] = 
false;
+                               }
+                       }
                }
        }
 
diff --git a/includes/MappingConfigBuilder.php 
b/includes/MappingConfigBuilder.php
index 12a6081..909aaa0 100644
--- a/includes/MappingConfigBuilder.php
+++ b/includes/MappingConfigBuilder.php
@@ -33,12 +33,18 @@
        const KEYWORD_IGNORE_ABOVE = 5000;
 
        /**
+        * Distance that lucene places between multiple values of the same 
field.
+        * Set pretty high to prevent accidental phrase queries between those 
values.
+        */
+       const POSITION_OFFSET_GAP = 10;
+
+       /**
         * Version number for the core analysis. Increment the major
         * version when the analysis changes in an incompatible way,
         * and change the minor version when it changes but isn't
         * incompatible
         */
-       const VERSION = '1.4';
+       const VERSION = '1.5';
 
        /**
         * Whether to allow prefix searches to match on any word
@@ -74,6 +80,9 @@
         * @return array the mapping config
         */
        public function buildConfig() {
+               global $wgCirrusSearchAllFields,
+                       $wgCirrusSearchWeights;
+
                $suggestExtra = array( 'analyzer' => 'suggest' );
                // Note never to set something as type='object' here because 
that isn't returned by elasticsearch
                // and is infered anyway.
@@ -155,6 +164,30 @@
                                'language' => $this->buildKeywordField(),
                        ),
                );
+
+               if ( $wgCirrusSearchAllFields[ 'build' ] ) {
+                       $config[ 'properties' ][ 'all' ] = 
$this->buildStringField( MappingConfigBuilder::ENABLE_NORMS );
+                       // Now layer all the fields into the all field once per 
weight.  Querying it isn't strictly the
+                       // same as querying each field - in some ways it is 
better!  In others it is worse....
+
+                       // Better because theoretically tf/idf based scoring 
works better this way.
+                       // Worse because we have to analyze each field multiple 
times....  Bleh!
+                       // This field can't be used for the fvh/experimental 
highlighter for several reasons:
+                       //  1. It is built with copy_to and not stored.
+                       //  2. The term frequency information is all whoppy 
compared to the "real" source text.
+                       foreach ( $wgCirrusSearchWeights as $field => $weight ) 
{
+                               for ( $r = 0; $r < $weight; $r++ ) {
+                                       if ( $field === 'redirect' ) {
+                                               // Redirect is in a funky place
+                                               $config[ 'properties' ][ 
'redirect' ][ 'properties' ][ 'title' ][ 'copy_to' ][] = 'all';
+                                       } else {
+                                               $config[ 'properties' ][ $field 
][ 'copy_to' ][] = 'all';
+                                       }
+                               }
+                       }
+                       // TODO would it help to do the all field for 
near_match?
+               }
+
                wfRunHooks( 'CirrusSearchMappingConfig', array( &$config, $this 
) );
                return $config;
        }
@@ -176,11 +209,13 @@
                        'type' => 'string',
                        'index_analyzer' => 'text',
                        'search_analyzer' => 'text_search',
+                       'position_offset_gap' => self::POSITION_OFFSET_GAP,
                        'fields' => array(
                                'plain' => array(
                                        'type' => 'string',
                                        'index_analyzer' => 'plain',
                                        'search_analyzer' => 'plain_search',
+                                       'position_offset_gap' => 
self::POSITION_OFFSET_GAP,
                                ),
                        )
                );
@@ -211,6 +246,7 @@
                        }
                        $field[ 'fields' ][ $extraName ] = array_merge( array(
                                'type' => 'string',
+                               'position_offset_gap' => 
self::POSITION_OFFSET_GAP,
                        ), $extraField );
                        if ( $disableNorms ) {
                                $field[ 'fields' ][ $extraName ] = array_merge(
diff --git a/includes/Searcher.php b/includes/Searcher.php
index b91f1f1..2086d38 100644
--- a/includes/Searcher.php
+++ b/includes/Searcher.php
@@ -307,7 +307,8 @@
                        $wgCirrusSearchNearMatchWeight,
                        $wgCirrusSearchStemmedWeight,
                        $wgCirrusSearchPhraseSlop,
-                       $wgCirrusSearchBoostLinks;
+                       $wgCirrusSearchBoostLinks,
+                       $wgCirrusSearchAllFields;
 
                $profiler = new ProfileSection( __METHOD__ );
 
@@ -528,14 +529,20 @@
                // That can optionally be followed by a ~ (this matches stemmed 
words in phrases)
                // The following all match: "a", "a boat", "a\"boat", "a 
boat"~, "a boat"~9, "a boat"~9~
                $query = self::replacePartsOfQuery( $this->term, 
'/(?<![\]])(?<main>"((?:[^"]|(?:\"))+)"(?<slop>~[0-9]+)?)(?<fuzzy>~)?/',
-                       function ( $matches ) use ( $searcher ) {
+                       function ( $matches ) use ( $searcher, &$phrases ) {
                                global $wgCirrusSearchPhraseSlop;
                                $main = $searcher->fixupQueryStringPart( 
$matches[ 'main' ][ 0 ] );
                                if ( !isset( $matches[ 'fuzzy' ] ) ) {
                                        if ( !isset( $matches[ 'slop' ] ) ) {
                                                $main = $main . '~' . 
$wgCirrusSearchPhraseSlop[ 'precise' ];
                                        }
-                                       $main = $searcher->switchSearchToExact( 
$main );
+                                       // Got to collect phrases that don't 
use the all field so we can highlight them.
+                                       // The highlighter locks phrases to the 
fields that specify them.  It doesn't do
+                                       // that with terms.
+                                       return array(
+                                               'escaped' => 
$searcher->switchSearchToExact( $main, true ),
+                                               'nonAll' => 
$searcher->switchSearchToExact( $main, false ),
+                                       );
                                }
                                return array( 'escaped' => $main );
                        } );
@@ -547,19 +554,30 @@
                $query = self::replaceAllPartsOfQuery( $query, 
'/\w+\*(?:\w*\*?)*/',
                        function ( $matches ) use ( $searcher ) {
                                $term = $searcher->fixupQueryStringPart( 
$matches[ 0 ][ 0 ] );
-                               return array( 'escaped' => 
$searcher->switchSearchToExact( $term ) );
+                               return array(
+                                       'escaped' => 
$searcher->switchSearchToExact( $term, true ),
+                                       'nonAll' => 
$searcher->switchSearchToExact( $term, false ),
+                               );
                        } );
                wfProfileOut( __METHOD__ . '-switch-prefix-to-plain' );
 
                wfProfileIn( __METHOD__ . '-escape' );
                $escapedQuery = array();
+               $nonAllQuery = array();
                foreach ( $query as $queryPart ) {
                        if ( isset( $queryPart[ 'escaped' ] ) ) {
                                $escapedQuery[] = $queryPart[ 'escaped' ];
+                               if ( isset( $queryPart[ 'nonAll' ] ) ) {
+                                       $nonAllQuery[] = $queryPart[ 'nonAll' ];
+                               } else {
+                                       $nonAllQuery[] = $queryPart[ 'escaped' 
];
+                               }
                                continue;
                        }
                        if ( isset( $queryPart[ 'raw' ] ) ) {
-                               $escapedQuery[] = $this->fixupQueryStringPart( 
$queryPart[ 'raw' ] );
+                               $fixed = $this->fixupQueryStringPart( 
$queryPart[ 'raw' ] );
+                               $escapedQuery[] = $fixed;
+                               $nonAllQuery[] = $fixed;
                                continue;
                        }
                        wfLogWarning( 'Unknown query part:  ' . serialize( 
$queryPart ) );
@@ -576,10 +594,20 @@
                        }
                        wfProfileIn( __METHOD__ . '-build-query' );
                        $fields = array_merge(
-                               $this->buildFullTextSearchFields( 1, '.plain' ),
-                               $this->buildFullTextSearchFields( 
$wgCirrusSearchStemmedWeight, '' ) );
-                       $nearMatchFields = $this->buildFullTextSearchFields( 
$wgCirrusSearchNearMatchWeight, '.near_match' );
+                               $this->buildFullTextSearchFields( 1, '.plain', 
true ),
+                               $this->buildFullTextSearchFields( 
$wgCirrusSearchStemmedWeight, '', true ) );
+                       $nearMatchFields = $this->buildFullTextSearchFields( 
$wgCirrusSearchNearMatchWeight, '.near_match', true );
                        $this->query = $this->buildSearchTextQuery( $fields, 
$nearMatchFields, $queryStringQueryString );
+
+                       // The highlighter doesn't know about the weightinging 
from the all fields so we have to send
+                       // it a query without the all fields.  This swaps one 
in. 
+                       if ( $wgCirrusSearchAllFields[ 'use' ] ) {
+                               $nonAllFields = array_merge(
+                                       $this->buildFullTextSearchFields( 1, 
'.plain', false ),
+                                       $this->buildFullTextSearchFields( 
$wgCirrusSearchStemmedWeight, '', false ) );
+                               $nonAllQueryString = 
$this->fixupWholeQueryString( implode( ' ', $nonAllQuery ) );
+                               $this->highlightQuery = 
$this->buildSearchTextQueryForFields( $nonAllFields, $nonAllQueryString, 1 );
+                       }
 
                        // Only do a phrase match rescore if the query doesn't 
include any quotes and has a space
                        // TODO allow phrases without spaces to support things 
like words with dashes and languages
@@ -1037,8 +1065,8 @@
                );
        }
 
-       public function switchSearchToExact( $term ) {
-               $exact = join( ' OR ', $this->buildFullTextSearchFields( 1, 
".plain:$term" ) );
+       public function switchSearchToExact( $term, $allFieldAllowed ) {
+               $exact = join( ' OR ', $this->buildFullTextSearchFields( 1, 
".plain:$term", $allFieldAllowed ) );
                return "($exact)";
        }
 
@@ -1046,33 +1074,43 @@
         * Build fields searched by full text search.
         * @param float $weight weight to multiply by all fields
         * @param string $fieldSuffix suffux to add to field names
+        * @param boolean $allFieldAllowed can we use the all field?  False for
+        *    collecting phrases for the highlighter.
         * @return array(string) of fields to query
         */
-       public function buildFullTextSearchFields( $weight, $fieldSuffix ) {
-               global $wgCirrusSearchWeights;
+       public function buildFullTextSearchFields( $weight, $fieldSuffix, 
$allFieldAllowed ) {
+               global $wgCirrusSearchWeights,
+                       $wgCirrusSearchAllFields;
                $titleWeight = $weight * $wgCirrusSearchWeights[ 'title' ];
                $redirectWeight = $weight * $wgCirrusSearchWeights[ 'redirect' 
];
                $fields = array();
-               $fields[] = "title${fieldSuffix}^${titleWeight}";
-               $fields[] = "redirect.title${fieldSuffix}^${redirectWeight}";
 
                // Only title and redirect support near_match so skip it for 
everything else
-               if ( $fieldSuffix !== '.near_match' ) {
-                       $categoryWeight = $weight * $wgCirrusSearchWeights[ 
'category' ];
-                       $headingWeight = $weight * $wgCirrusSearchWeights[ 
'heading' ];
-                       $openingTextWeight = $weight * $wgCirrusSearchWeights[ 
'opening_text' ];
-                       $auxiliaryTextWeight = $weight * 
$wgCirrusSearchWeights[ 'auxiliary_text' ];
-                       $fileTextWeight = $weight * $wgCirrusSearchWeights[ 
'file_text' ];
-                       $fields[] = "category${fieldSuffix}^${categoryWeight}";
-                       $fields[] = "heading${fieldSuffix}^${headingWeight}";
-                       $fields[] = 
"opening_text${fieldSuffix}^${openingTextWeight}";
-                       $fields[] = "text${fieldSuffix}^${weight}";
-                       $fields[] = 
"auxiliary_text${fieldSuffix}^${auxiliaryTextWeight}";
-                       if ( !$this->namespaces || in_array( NS_FILE, 
$this->namespaces ) ) {
-                               $fields[] = 
"file_text${fieldSuffix}^${fileTextWeight}";
-                       }
+               if ( $fieldSuffix === '.near_match' ) {
+                       $fields[] = "title${fieldSuffix}^${titleWeight}";
+                       $fields[] = 
"redirect.title${fieldSuffix}^${redirectWeight}";
+                       return $fields;
                }
-
+               if ( $wgCirrusSearchAllFields[ 'use' ] && $allFieldAllowed ) {
+                       $fields[] = "all${fieldSuffix}^${weight}";
+                       return $fields;
+               }
+               $fields[] = "title${fieldSuffix}^${titleWeight}";
+               $fields[] = "redirect.title${fieldSuffix}^${redirectWeight}";
+               $categoryWeight = $weight * $wgCirrusSearchWeights[ 'category' 
];
+               $headingWeight = $weight * $wgCirrusSearchWeights[ 'heading' ];
+               $openingTextWeight = $weight * $wgCirrusSearchWeights[ 
'opening_text' ];
+               $textWeight = $weight * $wgCirrusSearchWeights[ 'text' ];
+               $auxiliaryTextWeight = $weight * $wgCirrusSearchWeights[ 
'auxiliary_text' ];
+               $fields[] = "category${fieldSuffix}^${categoryWeight}";
+               $fields[] = "heading${fieldSuffix}^${headingWeight}";
+               $fields[] = "opening_text${fieldSuffix}^${openingTextWeight}";
+               $fields[] = "text${fieldSuffix}^${textWeight}";
+               $fields[] = 
"auxiliary_text${fieldSuffix}^${auxiliaryTextWeight}";
+               if ( !$this->namespaces || in_array( NS_FILE, $this->namespaces 
) ) {
+                       $fileTextWeight = $weight * $wgCirrusSearchWeights[ 
'file_text' ];
+                       $fields[] = "file_text${fieldSuffix}^${fileTextWeight}";
+               }
                return $fields;
        }
 
diff --git a/tests/browser/Relevancytestphraseviaopening.txt 
b/tests/browser/Relevancytestphraseviaopening.txt
new file mode 100644
index 0000000..15add03
--- /dev/null
+++ b/tests/browser/Relevancytestphraseviaopening.txt
@@ -0,0 +1,2 @@
+Relevancytestphrase phrase
+==JustAHeading==
diff --git a/tests/browser/articles/Relevancytestphraseviaauxtext.txt 
b/tests/browser/articles/Relevancytestphraseviaauxtext.txt
new file mode 100644
index 0000000..6a8aa07
--- /dev/null
+++ b/tests/browser/articles/Relevancytestphraseviaauxtext.txt
@@ -0,0 +1,3 @@
+{| class="wikitable"
+|Relevancytestphrase phrase aux
+|}
diff --git a/tests/browser/articles/Relevancytestphraseviaopening.txt 
b/tests/browser/articles/Relevancytestphraseviaopening.txt
new file mode 100644
index 0000000..5dd3fd6
--- /dev/null
+++ b/tests/browser/articles/Relevancytestphraseviaopening.txt
@@ -0,0 +1,2 @@
+Relevancytestphrase phrase opening
+==JustAHeading==
diff --git a/tests/browser/articles/Relevancytestviaauxtext.txt 
b/tests/browser/articles/Relevancytestviaauxtext.txt
index afd4c92..cee3f1f 100644
--- a/tests/browser/articles/Relevancytestviaauxtext.txt
+++ b/tests/browser/articles/Relevancytestviaauxtext.txt
@@ -1,3 +1,3 @@
 {| class="wikitable"
-|Relevancytest
+|Relevancytest aux
 |}
diff --git a/tests/browser/articles/Relevancytestviaopening.txt 
b/tests/browser/articles/Relevancytestviaopening.txt
index 7ad9c89..1d23cc4 100644
--- a/tests/browser/articles/Relevancytestviaopening.txt
+++ b/tests/browser/articles/Relevancytestviaopening.txt
@@ -1,2 +1,2 @@
-Relevancytest
+Relevancytest opening
 ==JustAHeading==
diff --git a/tests/browser/features/full_text.feature 
b/tests/browser/features/full_text.feature
index 7d4a905..2a6e7e6 100644
--- a/tests/browser/features/full_text.feature
+++ b/tests/browser/features/full_text.feature
@@ -77,9 +77,9 @@
     Then Rescore Test Words is the first search result
 
   @setup_phrase_rescore
-  Scenario: Searching for an a quoted phrase finds higher scored matches 
before the whole query interpreted as a phrase
+  Scenario: Searching for a quoted phrase finds higher scored matches before 
the whole query interpreted as a phrase
     When I search for Rescore "Test Words"
-    Then Test Words Rescore Rescore is the first search result
+    Then Test Words Rescore Rescore Test Words is the first search result
 
   # Note that other tests will catch this situation as well but this test 
should be pretty specific
   @setup_phrase_rescore
@@ -90,7 +90,7 @@
   @setup_phrase_rescore
   Scenario: Searching with a quoted word just treats the word as though it 
didn't have quotes
     When I search for "Rescore" Words Test
-    Then Test Words Rescore Rescore is the first search result
+    Then Test Words Rescore Rescore Test Words is the first search result
 
   @programmer_friendly
   Scenario Outline: Programmer friendly searches
diff --git a/tests/browser/features/relevancy.feature 
b/tests/browser/features/relevancy.feature
index c114213..29943d3 100644
--- a/tests/browser/features/relevancy.feature
+++ b/tests/browser/features/relevancy.feature
@@ -5,6 +5,7 @@
 
   Scenario: Results are sorted based on what part of the page matches: title, 
redirect, category, etc
     When I search for Relevancytest
+    And I disable incoming links in the weighting
     Then Relevancytest is the first search result
     And Relevancytestviaredirect is the second search result
     And Relevancytestviacategory is the third search result
@@ -13,6 +14,17 @@
     And Relevancytestviatext is the sixth search result
     And Relevancytestviaauxtext is the seventh search result
 
+  Scenario: Results are sorted based on what part of the page matches: title, 
redirect, category, etc
+    When I search for "Relevancytestphrase phrase"
+    And I disable incoming links in the weighting
+    Then Relevancytestphrase phrase is the first search result
+    And Relevancytestphraseviaredirect is the second search result
+    And Relevancytestphraseviacategory is the third search result
+    And Relevancytestphraseviaheading is the fourth search result
+    And Relevancytestphraseviaopening is the fifth search result
+    And Relevancytestphraseviatext is the sixth search result
+    And Relevancytestphraseviaauxtext is the seventh search result
+
   Scenario: Words in order are worth more then words out of order
     When I search for Relevancytwo Wordtest
     Then Relevancytwo Wordtest is the first search result
diff --git a/tests/browser/features/support/hooks.rb 
b/tests/browser/features/support/hooks.rb
index 280fdca..4e13fa6 100644
--- a/tests/browser/features/support/hooks.rb
+++ b/tests/browser/features/support/hooks.rb
@@ -186,7 +186,7 @@
   if !$setup_phrase_rescore
     steps %Q{
       Given a page named Rescore Test Words exists
-      And a page named Test Words Rescore Rescore exists
+      And a page named Test Words Rescore Rescore Test Words exists
       And a page named Rescore Test TextContent exists with contents Chaff
       And a page named Rescore Test HasTextContent exists with contents 
Rescore Test TextContent
     }
@@ -394,6 +394,14 @@
       And a page named Relevancytestviaopening exists with contents 
@Relevancytestviaopening.txt
       And a page named Relevancytestviatext exists with contents Relevancytest
       And a page named Relevancytestviaauxtext exists with contents 
@Relevancytestviaauxtext.txt
+      And a page named Relevancytestphrase phrase exists with contents not 
relevant
+      And a page named Relevancytestphraseviaredirect exists with contents not 
relevant
+      And a page named Relevancytestphrase Phrase Redirect exists with 
contents #REDIRECT [[Relevancytestphraseviaredirect]]
+      And a page named Relevancytestphraseviacategory exists with contents not 
relevant [[Category:Relevancytestphrase phrase category]]
+      And a page named Relevancytestphraseviaheading exists with contents 
==Relevancytestphrase phrase heading==
+      And a page named Relevancytestphraseviaopening exists with contents 
@Relevancytestphraseviaopening.txt
+      And a page named Relevancytestphraseviatext exists with contents 
Relevancytestphrase phrase
+      And a page named Relevancytestphraseviaauxtext exists with contents 
@Relevancytestphraseviaauxtext.txt
       And a page named Relevancytwo Wordtest exists
       And a page named Wordtest Relevancytwo exists
       And a page named Relevancynamespacetest exists
@@ -412,10 +420,10 @@
       And a page named Relevancylinktest Larger/Link B exists with contents 
[[Relevancylinktest Larger Extraword]]
       And a page named Relevancylinktest Larger/Link C exists with contents 
[[Relevancylinktest Larger Extraword]]
       And a page named Relevancylinktest Larger/Link D exists with contents 
[[Relevancylinktest Larger Extraword]]
-      And a page named Relevancyredirecttest Smaller exists with contents 
Relevancyredirecttest
+      And a page named Relevancyredirecttest Smaller exists with contents 
Relevancyredirecttest text text text text text text text text text text text 
text text
       And a page named Relevancyredirecttest Smaller/A exists with contents 
[[Relevancyredirecttest Smaller]]
       And a page named Relevancyredirecttest Smaller/B exists with contents 
[[Relevancyredirecttest Smaller]]
-      And a page named Relevancyredirecttest Larger exists with contents 
Relevancyredirecttest
+      And a page named Relevancyredirecttest Larger exists with contents 
Relevancyredirecttest text text text text text text text text text text text 
text text
       And a page named Relevancyredirecttest Larger/Redirect exists with 
contents #REDIRECT [[Relevancyredirecttest Larger]]
       And a page named Relevancyredirecttest Larger/A exists with contents 
[[Relevancyredirecttest Larger]]
       And a page named Relevancyredirecttest Larger/B exists with contents 
[[Relevancyredirecttest Larger/Redirect]]
diff --git a/tests/jenkins/Jenkins.php b/tests/jenkins/Jenkins.php
index 020c429..00022c1 100644
--- a/tests/jenkins/Jenkins.php
+++ b/tests/jenkins/Jenkins.php
@@ -86,6 +86,8 @@
 $wgCirrusSearchLanguageWeight[ 'user' ] = 10.0;
 $wgCirrusSearchLanguageWeight[ 'wiki' ] = 5.0;
 
+$wgCirrusSearchAllFields = array( 'build' => true, 'use' => false );
+
 class Jenkins {
        /**
         * Installs maintenance scripts that provide a clean Elasticsearch 
index for testing.

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

Gerrit-MessageType: merged
Gerrit-Change-Id: I6158c932d01a8b96e6714f9b31c8561ff8517c34
Gerrit-PatchSet: 7
Gerrit-Project: mediawiki/extensions/CirrusSearch
Gerrit-Branch: master
Gerrit-Owner: Manybubbles <[email protected]>
Gerrit-Reviewer: Chad <[email protected]>
Gerrit-Reviewer: Manybubbles <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

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

Reply via email to