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