Browse Source

Add mapper-extras and the RankFeatureQuery in the hlrc (#43713)

This change adds the support for the RankFeatureQuery in the HLRC by
providing an extra dependency on mapper-extras-client. It also removes
the dependency on lang-painless in mapper-extras which is not needed
anymore since the move of the vector field into a dedicated module.

Closes #43634
Jim Ferenczi 6 years ago
parent
commit
38f9e52c3e

+ 2 - 0
client/rest-high-level/build.gradle

@@ -49,12 +49,14 @@ idea {
 dependencies {
   compile project(':server')
   compile project(':client:rest')
+  compile project(':modules:mapper-extras')
   compile project(':modules:parent-join')
   compile project(':modules:aggs-matrix-stats')
   compile project(':modules:rank-eval')
   compile project(':modules:lang-mustache')
   shadow project(':server')
   shadow project(':client:rest')
+  bundle project(':modules:mapper-extras')
   bundle project(':modules:parent-join')
   bundle project(':modules:aggs-matrix-stats')
   bundle project(':modules:rank-eval')

+ 25 - 0
client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/QueryDSLDocumentationTests.java

@@ -29,6 +29,7 @@ import org.elasticsearch.index.query.GeoShapeQueryBuilder;
 import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder;
 import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder.FilterFunctionBuilder;
 import org.elasticsearch.join.query.JoinQueryBuilders;
+import org.elasticsearch.index.query.RankFeatureQueryBuilders;
 import org.elasticsearch.script.Script;
 import org.elasticsearch.script.ScriptType;
 import org.elasticsearch.test.ESTestCase;
@@ -438,4 +439,28 @@ public class QueryDSLDocumentationTests extends ESTestCase {
         wrapperQuery(query);
         // end::wrapper
     }
+
+    public void testRankFeatureSaturation() {
+        RankFeatureQueryBuilders.saturation(
+            "pagerank"); // <1>
+    }
+
+    public void testRankFeatureSaturationPivot() {
+        RankFeatureQueryBuilders.saturation(
+            "pagerank",     // <1>
+            8);                 // <2>
+    }
+
+    public void testRankFeatureLog() {
+        RankFeatureQueryBuilders.log(
+            "pagerank",     // <1>
+            4f);          // <2>
+    }
+
+    public void testRankFeatureSigmoid() {
+        RankFeatureQueryBuilders.sigmoid(
+            "pagerank",   // <1>
+            7,                // <2>
+            0.6f);             // <3>
+    }
 }

+ 2 - 0
docs/Versions.asciidoc

@@ -40,6 +40,7 @@ ifeval::["{release-state}"=="unreleased"]
 :rest-client-javadoc: https://snapshots.elastic.co/javadoc/org/elasticsearch/client/elasticsearch-rest-client/{version}-SNAPSHOT
 :rest-client-sniffer-javadoc: https://snapshots.elastic.co/javadoc/org/elasticsearch/client/elasticsearch-rest-client-sniffer/{version}-SNAPSHOT
 :rest-high-level-client-javadoc: https://snapshots.elastic.co/javadoc/org/elasticsearch/client/elasticsearch-rest-high-level-client/{version}-SNAPSHOT
+:mapper-extras-javadoc: https://snapshots.elastic.co/javadoc/org/elasticsearch/plugin/mapper-extras/{version}-SNAPSHOT
 :painless-javadoc: https://snapshots.elastic.co/javadoc/org/elasticsearch/painless/lang-painless/{version}-SNAPSHOT
 :parent-join-client-javadoc: https://snapshots.elastic.co/javadoc/org/elasticsearch/plugin/parent-join-client/{version}-SNAPSHOT
 :percolator-client-javadoc: https://snapshots.elastic.co/javadoc/org/elasticsearch/plugin/percolator-client/{version}-SNAPSHOT
@@ -54,6 +55,7 @@ ifeval::["{release-state}"!="unreleased"]
 :rest-client-javadoc: https://artifacts.elastic.co/javadoc/org/elasticsearch/client/elasticsearch-rest-client/{version}
 :rest-client-sniffer-javadoc: https://artifacts.elastic.co/javadoc/org/elasticsearch/client/elasticsearch-rest-client-sniffer/{version}
 :rest-high-level-client-javadoc: https://artifacts.elastic.co/javadoc/org/elasticsearch/client/elasticsearch-rest-high-level-client/{version}
+:mapper-extras-javadoc: https://snapshots.elastic.co/javadoc/org/elasticsearch/plugin/mapper-extras/{version}
 :painless-javadoc: https://artifacts.elastic.co/javadoc/org/elasticsearch/painless/lang-painless/{version}
 :parent-join-client-javadoc: https://artifacts.elastic.co/javadoc/org/elasticsearch/plugin/parent-join-client/{version}
 :percolator-client-javadoc: https://artifacts.elastic.co/javadoc/org/elasticsearch/plugin/percolator-client/{version}

+ 5 - 3
docs/java-rest/high-level/query-builders.asciidoc

@@ -4,9 +4,10 @@
 This page lists all the available search queries with their corresponding `QueryBuilder` class name and helper method name in the
 `QueryBuilders` utility class.
 
-:query-ref:        {elasticsearch-javadoc}/org/elasticsearch/index/query
-:parentjoin-ref:   {parent-join-client-javadoc}/org/elasticsearch/join/query
-:percolate-ref:    {percolator-client-javadoc}/org/elasticsearch/percolator
+:query-ref:             {elasticsearch-javadoc}/org/elasticsearch/index/query
+:mapper-extras-ref:     {mapper-extras-client-javadoc}/org/elasticsearch/index/query
+:parentjoin-ref:        {parent-join-client-javadoc}/org/elasticsearch/join/query
+:percolate-ref:         {percolator-client-javadoc}/org/elasticsearch/percolator
 
 ==== Match All Query
 [options="header"]
@@ -81,6 +82,7 @@ This page lists all the available search queries with their corresponding `Query
 | {ref}/query-dsl-script-query.html[Script]                           | {query-ref}/ScriptQueryBuilder.html[ScriptQueryBuilder]                             | {query-ref}/QueryBuilders.html#scriptQuery-org.elasticsearch.script.Script-[QueryBuilders.scriptQuery()]
 | {ref}/query-dsl-percolate-query.html[Percolate]                     | {percolate-ref}/PercolateQueryBuilder.html[PercolateQueryBuilder]                   |
 | {ref}/query-dsl-wrapper-query.html[Wrapper]                         | {query-ref}/WrapperQueryBuilder.html[WrapperQueryBuilder]                           | {query-ref}/QueryBuilders.html#wrapperQuery-java.lang.String-[QueryBuilders.wrapperQuery()]
+| {ref}/query-dsl-rank-feature-query.html[Rank Feature]               | {mapper-extras-ref}/RankFeatureQuery.html[RankFeatureQueryBuilder]                  |
 |======
 
 ==== Span queries

+ 1 - 6
modules/mapper-extras/build.gradle

@@ -20,9 +20,4 @@
 esplugin {
     description 'Adds advanced field mappers'
     classname 'org.elasticsearch.index.mapper.MapperExtrasPlugin'
-    extendedPlugins = ['lang-painless']
-}
-
-dependencies {
-    compileOnly project(':modules:lang-painless')
-}
+}

+ 5 - 0
modules/mapper-extras/src/main/java/org/elasticsearch/index/query/RankFeatureQueryBuilder.java

@@ -299,6 +299,11 @@ public final class RankFeatureQueryBuilder extends AbstractQueryBuilder<RankFeat
     private final String field;
     private final ScoreFunction scoreFunction;
 
+    /**
+     *
+     * @param field  The field name.
+     * @param scoreFunction Scoring function for the rank_feature field.
+     */
     public RankFeatureQueryBuilder(String field, ScoreFunction scoreFunction) {
         this.field = Objects.requireNonNull(field);
         this.scoreFunction = Objects.requireNonNull(scoreFunction);

+ 67 - 0
modules/mapper-extras/src/main/java/org/elasticsearch/index/query/RankFeatureQueryBuilders.java

@@ -0,0 +1,67 @@
+/*
+ * Licensed to Elasticsearch under one or more contributor
+ * license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright
+ * ownership. Elasticsearch licenses this file to you under
+ * the Apache License, Version 2.0 (the "License"); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.elasticsearch.index.query;
+
+public final class RankFeatureQueryBuilders {
+    private RankFeatureQueryBuilders() {}
+
+    /**
+     * Return a new {@link RankFeatureQueryBuilder} that will score documents as
+     * {@code boost * S / (S + pivot)} where S is the value of the static feature.
+     * @param fieldName   field that stores features
+     * @param pivot       feature value that would give a score contribution equal to weight/2, must be in (0, +Infinity)
+     */
+    public static RankFeatureQueryBuilder saturation(String fieldName, float pivot) {
+        return new RankFeatureQueryBuilder(fieldName, new RankFeatureQueryBuilder.ScoreFunction.Saturation(pivot));
+    }
+
+    /**
+     * Same as {@link #saturation(String, float)} but a reasonably good default pivot value
+     * is computed based on index statistics and is approximately equal to the geometric mean of all
+     * values that exist in the index.
+     * @param fieldName   field that stores features
+     */
+    public static RankFeatureQueryBuilder saturation(String fieldName) {
+        return new RankFeatureQueryBuilder(fieldName, new RankFeatureQueryBuilder.ScoreFunction.Saturation());
+    }
+
+    /**
+     * Return a new {@link RankFeatureQueryBuilder} that will score documents as
+     * {@code boost * Math.log(scalingFactor + S)} where S is the value of the static feature.
+     * @param fieldName     field that stores features
+     * @param scalingFactor scaling factor applied before taking the logarithm, must be in [1, +Infinity)
+     */
+    public static RankFeatureQueryBuilder log(String fieldName, float scalingFactor) {
+        return new RankFeatureQueryBuilder(fieldName, new RankFeatureQueryBuilder.ScoreFunction.Log(scalingFactor));
+    }
+
+    /**
+     * Return a new {@link RankFeatureQueryBuilder} that will score documents as
+     * {@code boost * S^a / (S^a + pivot^a)} where S is the value of the static feature.
+     * @param fieldName   field that stores features
+     * @param pivot       feature value that would give a score contribution equal to weight/2, must be in (0, +Infinity)
+     * @param exp         exponent, higher values make the function grow slower before 'pivot' and faster after 'pivot',
+     *                    must be in (0, +Infinity)
+     */
+    public static RankFeatureQueryBuilder sigmoid(String fieldName, float pivot, float exp) {
+        return new RankFeatureQueryBuilder(fieldName, new RankFeatureQueryBuilder.ScoreFunction.Sigmoid(pivot, exp));
+    }
+
+}