DCausse has uploaded a new change for review.
https://gerrit.wikimedia.org/r/296935
Change subject: [WIP] Implement new search hooks from core
......................................................................
[WIP] Implement new search hooks from core
Bug: T139021
Change-Id: Iaf5d6280724fe388040c277d067f7a913bf9e29e
Depends-On: I621704e4edafdf39a028d7c8a06cb1829b3a7cb6
Depends-On: I82a82526e2e254edc1fa7d861d7ac23d9cf07d1c
---
M GeoData.php
A includes/CirrusGeoPointIndexField.php
A includes/GeoPointIndexField.php
M includes/Hooks.php
4 files changed, 129 insertions(+), 39 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/GeoData
refs/changes/35/296935/1
diff --git a/GeoData.php b/GeoData.php
index 3b27b16..fa2289c 100644
--- a/GeoData.php
+++ b/GeoData.php
@@ -30,6 +30,7 @@
$wgAutoloadClasses['GeoData\Hooks'] = "$dir/includes/Hooks.php";
$wgAutoloadClasses['GeoData\Math'] = "$dir/includes/Math.php";
$wgAutoloadClasses['GeoData\Searcher'] = "$dir/includes/Searcher.php";
+$wgAutoloadClasses['GeoData\GeoPointIndexField'] =
"$dir/includes/GeoPointIndexField.php";
$wgMessagesDirs['GeoData'] = __DIR__ . '/i18n';
$wgExtensionMessagesFiles['GeoData'] = "$dir/GeoData.i18n.php";
@@ -44,8 +45,8 @@
$wgHooks['LinksUpdate'][] = 'GeoData\Hooks::onLinksUpdate';
$wgHooks['FileUpload'][] = 'GeoData\Hooks::onFileUpload';
$wgHooks['OutputPageParserOutput'][] =
'GeoData\Hooks::onOutputPageParserOutput';
-$wgHooks['CirrusSearchMappingConfig'][] =
'GeoData\Hooks::onCirrusSearchMappingConfig';
-$wgHooks['CirrusSearchBuildDocumentParse'][] =
'GeoData\Hooks::onCirrusSearchBuildDocumentParse';
+$wgHooks['SearchIndexFields'][] = 'GeoData\Hooks::onSearchIndexFields';
+$wgHooks['SearchDataForIndex'][] = 'GeoData\Hooks::onSearchDataForIndex';
$wgHooks['ParserTestTables'][] = 'GeoData\Hooks::onParserTestTables';
// Use the proper search backend
diff --git a/includes/CirrusGeoPointIndexField.php
b/includes/CirrusGeoPointIndexField.php
new file mode 100644
index 0000000..090a4a6
--- /dev/null
+++ b/includes/CirrusGeoPointIndexField.php
@@ -0,0 +1,32 @@
+<?php
+namespace GeoData;
+
+use \CirrusSearch\Search\CirrusIndexField;
+
+class GeoPointIndexField extends CirrusIndexField {
+ protected $typeName = 'geo_point';
+
+ protected $indexLatLon = false;
+ protected $precisionStep = null;
+
+ protected $ignoreMalformed = false;
+
+ protected $geohash = false;
+ protected $geohashPrecision = 6;
+ protected $geohashPrefix = false;
+
+ public GeoPointIndexField( $name, SearchEngine $config ) {
+ parent::_construct( $name, $this->typeName, $config );
+ }
+
+ public function getMapping( SearchEngine $engine ) {
+ $fields = parent::getMapping();
+ if ( $this->indexLatLon ) {
+ $fields['lat_lon'] = true;
+ }
+
+ if ( $this->precisionStep !== null ) {
+ $fields['precision_step'] = $this->precisionStep;
+ }
+ }
+
diff --git a/includes/GeoPointIndexField.php b/includes/GeoPointIndexField.php
new file mode 100644
index 0000000..2dd2220
--- /dev/null
+++ b/includes/GeoPointIndexField.php
@@ -0,0 +1,43 @@
+<?php
+namespace GeoData;
+
+use CirrusSearch\Search\CirrusIndexField;
+use CirrusSearch\SearchConfig;
+use SearchEngine;
+
+/**
+ * GeoPoint type for CirrusSearch mapping
+ */
+class GeoPointIndexField extends CirrusIndexField {
+ /**
+ * @var string
+ */
+ protected $typeName = 'geo_point';
+
+ /**
+ * @var array customize fielddata settings
+ */
+ protected $fieldDataOptions;
+
+ /**
+ * @param string $name name of the field
+ * @param SearchConfig $config CirrusSearch config
+ * @param array $fieldDataOptions
+ */
+ public function __construct( $name, SearchConfig $config, array
$fieldDataOptions = null ) {
+ parent::__construct( $name, $this->typeName, $config );
+ }
+
+ /**
+ * @param SearchConfig $engine
+ * @return array elasticsearch mapping
+ */
+ public function getMapping( SearchEngine $engine ) {
+ $fields = parent::getMapping( $engine );
+ if ( $this->fieldDataOptions !== null ) {
+ $fields['fielddata'] = $this->fieldDataOptions;
+ }
+ return $fields;
+ }
+}
+
diff --git a/includes/Hooks.php b/includes/Hooks.php
index 3fb6f7d..cdf92bd 100644
--- a/includes/Hooks.php
+++ b/includes/Hooks.php
@@ -15,6 +15,9 @@
use Title;
use User;
use WikiPage;
+use SearchEngine;
+use SearchIndexField;
+use ContentHandler;
/**
* Hook handlers
@@ -246,55 +249,66 @@
}
/**
- * CirrusSearchMappingConfig hook handler
+ * Search index fields hook handler
* Adds our stuff to CirrusSearch/Elasticsearch schema
*
* @param array $config
+ * @param SearchEngine $engine
*/
- public static function onCirrusSearchMappingConfig( array &$config ) {
+ public static function onSearchIndexFields( array &$fields,
SearchEngine $engine ) {
global $wgGeoDataUseCirrusSearch, $wgGeoDataBackend,
$wgGeoDataCoordinatesCompression;
- if ( !$wgGeoDataUseCirrusSearch && $wgGeoDataBackend !=
'elastic' ) {
- return;
- }
- $pageConfig = $config['page'];
+ if ( class_exists( '\CirrusSearch' ) && ( $engine instanceof
\CirrusSearch
+ && ( $wgGeoDataUseCirrusSearch ||
$wgGeoDataBackend == 'elastic') )
+ ) {
+ /** @var \CirrusSearch\CirrusSearch */
+ $cirrus = $engine;
- $pageConfig['properties']['coordinates'] = [
- 'type' => 'nested',
- 'properties' => [
- 'coord' => [
- 'type' => 'geo_point',
- 'lat_lon' => true,
- ],
- 'globe' => [ 'type' => 'string', 'index' =>
'not_analyzed' ],
- 'primary' => [ 'type' => 'boolean' ],
- 'dim' => [ 'type' => 'float' ],
- 'type' => [ 'type' => 'string', 'index' =>
'not_analyzed' ],
- 'name' => [ 'type' => 'string', 'index' => 'no'
],
- 'country' => [ 'type' => 'string', 'index' =>
'not_analyzed' ],
- 'region' => [ 'type' => 'string', 'index' =>
'not_analyzed' ],
- ],
- ];
- if ( $wgGeoDataCoordinatesCompression ) {
-
$pageConfig['properties']['coordinates']['properties']['coord']['fielddata'] = [
- 'format' => 'compressed',
- 'precision' => $wgGeoDataCoordinatesCompression,
- ];
+ $nested = $engine->makeSearchFieldMapping(
'coordinates',
+ SearchIndexField::INDEX_TYPE_NESTED );
+ $fieldDataOptions = null;
+ if ( $wgGeoDataCoordinatesCompression ) {
+ $fieldDataOptions = [
+ 'format' => 'compressed',
+ 'precision' =>
$wgGeoDataCoordinatesCompression,
+ ];
+ }
+ $nested->addSubfield( 'coord', new GeoPointIndexField(
'coord', $cirrus->getConfig(),
+ $fieldDataOptions ) );
+ // Setting analyzer to keyword is similar to index =>
not_analyzed
+ $keywords = ['globe', 'type', 'country', 'region'];
+ foreach( $keywords as $keyword ) {
+ $nested->addSubfield( $keyword,
$cirrus->makeSearchFieldMapping( $keyword,
+
SearchIndexField::INDEX_TYPE_KEYWORD ) );
+ }
+ // We need a BOOLEAN type
+ $nested->addSubfield( 'primary',
$cirrus->makeSearchFieldMapping( 'primary',
+ SearchIndexField::INDEX_TYPE_BOOL ) );
+ $nested->addSubfield( 'dim',
$cirrus->makeSearchFieldMapping( 'dim',
+ SearchIndexField::INDEX_TYPE_NUMBER ) );
+ $name = $cirrus->makeSearchFieldMapping( 'name',
+ SearchIndexField::INDEX_TYPE_TEXT );
+ $name->setFlag( SearchIndexField::FLAG_NO_INDEX );
+ $nested->addSubfield( 'name', $name );
+
+ $fields[$nested->getName()] = $nested;
+ } else {
+ // Unsupported SearchEngine or explicitely disabled by
config
}
- $config['page'] = $pageConfig;
}
/**
- * CirrusSearchBuildDocumentParse hook handler
+ * SearchDataForIndex hook handler
*
- * @param \Elastica\Document $doc
- * @param Title $title
- * @param Content $content
+ * @param array[] $fields
+ * @param ContentHandler $contentHandler
+ * @param WikiPage $page
* @param ParserOutput $parserOutput
+ * @param SearchEngine $searchEngine
*/
- public static function onCirrusSearchBuildDocumentParse(
\Elastica\Document $doc,
- Title $title,
- Content $content,
- ParserOutput $parserOutput )
+ public static function onSearchDataForIndex( array &$fields,
ContentHandler $contentHandler,
+ WikiPage $page,
+ ParserOutput $parserOutput,
+ SearchEngine $searchEngine )
{
global $wgGeoDataUseCirrusSearch, $wgGeoDataBackend;
@@ -311,7 +325,7 @@
}
$coords[] = self::coordToElastic( $coord );
}
- $doc->set( 'coordinates', $coords );
+ $fields['coordinates'] = $coords;
}
}
--
To view, visit https://gerrit.wikimedia.org/r/296935
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Iaf5d6280724fe388040c277d067f7a913bf9e29e
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/GeoData
Gerrit-Branch: master
Gerrit-Owner: DCausse <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits