Skip to content

Commit 85e9cf9

Browse files
committed
[ML] Partition-wise maximum scores (#32748)
Added infrastructure to push through the 'person name field value' to the normalizer process. This is required by the normalizer to retrieve the maximum scores for individual partitions.
1 parent 6f3a3e1 commit 85e9cf9

13 files changed

+74
-5
lines changed

x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/job/process/normalizer/BucketInfluencerNormalizable.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,11 @@ public String getPersonFieldName() {
4646
return bucketInfluencer.getInfluencerFieldName();
4747
}
4848

49+
@Override
50+
public String getPersonFieldValue() {
51+
return null;
52+
}
53+
4954
@Override
5055
public String getFunctionName() {
5156
return null;

x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/job/process/normalizer/BucketNormalizable.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,11 @@ public String getPersonFieldName() {
6464
return null;
6565
}
6666

67+
@Override
68+
public String getPersonFieldValue() {
69+
return null;
70+
}
71+
6772
@Override
6873
public String getFunctionName() {
6974
return null;

x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/job/process/normalizer/InfluencerNormalizable.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,11 @@ public String getPersonFieldName() {
4444
return influencer.getInfluencerFieldName();
4545
}
4646

47+
@Override
48+
public String getPersonFieldValue() {
49+
return influencer.getInfluencerFieldValue();
50+
}
51+
4752
@Override
4853
public String getFunctionName() {
4954
return null;

x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/job/process/normalizer/MultiplyingNormalizerProcess.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,11 @@ public void writeRecord(String[] record) throws IOException {
6363
result.setPartitionFieldName(record[1]);
6464
result.setPartitionFieldValue(record[2]);
6565
result.setPersonFieldName(record[3]);
66-
result.setFunctionName(record[4]);
67-
result.setValueFieldName(record[5]);
68-
result.setProbability(Double.parseDouble(record[6]));
69-
result.setNormalizedScore(factor * Double.parseDouble(record[7]));
66+
result.setPersonFieldValue(record[4]);
67+
result.setFunctionName(record[5]);
68+
result.setValueFieldName(record[6]);
69+
result.setProbability(Double.parseDouble(record[7]));
70+
result.setNormalizedScore(factor * Double.parseDouble(record[8]));
7071
} catch (NumberFormatException | ArrayIndexOutOfBoundsException e) {
7172
throw new IOException("Unable to write to no-op normalizer", e);
7273
}

x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/job/process/normalizer/Normalizable.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ public Normalizable(String indexName) {
4444

4545
abstract String getPersonFieldName();
4646

47+
abstract String getPersonFieldValue();
48+
4749
abstract String getFunctionName();
4850

4951
abstract String getValueFieldName();

x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/job/process/normalizer/Normalizer.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ public void normalize(Integer bucketSpan, boolean perPartitionNormalization,
7070
NormalizerResult.PARTITION_FIELD_NAME_FIELD.getPreferredName(),
7171
NormalizerResult.PARTITION_FIELD_VALUE_FIELD.getPreferredName(),
7272
NormalizerResult.PERSON_FIELD_NAME_FIELD.getPreferredName(),
73+
NormalizerResult.PERSON_FIELD_VALUE_FIELD.getPreferredName(),
7374
NormalizerResult.FUNCTION_NAME_FIELD.getPreferredName(),
7475
NormalizerResult.VALUE_FIELD_NAME_FIELD.getPreferredName(),
7576
NormalizerResult.PROBABILITY_FIELD.getPreferredName(),
@@ -108,6 +109,7 @@ private static void writeNormalizableAndChildrenRecursively(Normalizable normali
108109
Strings.coalesceToEmpty(normalizable.getPartitionFieldName()),
109110
Strings.coalesceToEmpty(normalizable.getPartitionFieldValue()),
110111
Strings.coalesceToEmpty(normalizable.getPersonFieldName()),
112+
Strings.coalesceToEmpty(normalizable.getPersonFieldValue()),
111113
Strings.coalesceToEmpty(normalizable.getFunctionName()),
112114
Strings.coalesceToEmpty(normalizable.getValueFieldName()),
113115
Double.toString(normalizable.getProbability()),

x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/job/process/normalizer/NormalizerResult.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
*/
66
package org.elasticsearch.xpack.ml.job.process.normalizer;
77

8+
import org.elasticsearch.Version;
89
import org.elasticsearch.common.ParseField;
910
import org.elasticsearch.common.io.stream.StreamInput;
1011
import org.elasticsearch.common.io.stream.StreamOutput;
@@ -26,6 +27,7 @@ public class NormalizerResult implements ToXContentObject, Writeable {
2627
static final ParseField PARTITION_FIELD_NAME_FIELD = new ParseField("partition_field_name");
2728
static final ParseField PARTITION_FIELD_VALUE_FIELD = new ParseField("partition_field_value");
2829
static final ParseField PERSON_FIELD_NAME_FIELD = new ParseField("person_field_name");
30+
static final ParseField PERSON_FIELD_VALUE_FIELD = new ParseField("person_field_value");
2931
static final ParseField FUNCTION_NAME_FIELD = new ParseField("function_name");
3032
static final ParseField VALUE_FIELD_NAME_FIELD = new ParseField("value_field_name");
3133
static final ParseField PROBABILITY_FIELD = new ParseField("probability");
@@ -39,6 +41,7 @@ public class NormalizerResult implements ToXContentObject, Writeable {
3941
PARSER.declareString(NormalizerResult::setPartitionFieldName, PARTITION_FIELD_NAME_FIELD);
4042
PARSER.declareString(NormalizerResult::setPartitionFieldValue, PARTITION_FIELD_VALUE_FIELD);
4143
PARSER.declareString(NormalizerResult::setPersonFieldName, PERSON_FIELD_NAME_FIELD);
44+
PARSER.declareString(NormalizerResult::setPersonFieldValue, PERSON_FIELD_VALUE_FIELD);
4245
PARSER.declareString(NormalizerResult::setFunctionName, FUNCTION_NAME_FIELD);
4346
PARSER.declareString(NormalizerResult::setValueFieldName, VALUE_FIELD_NAME_FIELD);
4447
PARSER.declareDouble(NormalizerResult::setProbability, PROBABILITY_FIELD);
@@ -49,6 +52,7 @@ public class NormalizerResult implements ToXContentObject, Writeable {
4952
private String partitionFieldName;
5053
private String partitionFieldValue;
5154
private String personFieldName;
55+
private String personFieldValue;
5256
private String functionName;
5357
private String valueFieldName;
5458
private double probability;
@@ -62,6 +66,9 @@ public NormalizerResult(StreamInput in) throws IOException {
6266
partitionFieldName = in.readOptionalString();
6367
partitionFieldValue = in.readOptionalString();
6468
personFieldName = in.readOptionalString();
69+
if (in.getVersion().onOrAfter(Version.V_6_5_0)) {
70+
personFieldValue = in.readOptionalString();
71+
}
6572
functionName = in.readOptionalString();
6673
valueFieldName = in.readOptionalString();
6774
probability = in.readDouble();
@@ -74,6 +81,9 @@ public void writeTo(StreamOutput out) throws IOException {
7481
out.writeOptionalString(partitionFieldName);
7582
out.writeOptionalString(partitionFieldValue);
7683
out.writeOptionalString(personFieldName);
84+
if (out.getVersion().onOrAfter(Version.V_6_5_0)) {
85+
out.writeOptionalString(personFieldValue);
86+
}
7787
out.writeOptionalString(functionName);
7888
out.writeOptionalString(valueFieldName);
7989
out.writeDouble(probability);
@@ -87,6 +97,7 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
8797
builder.field(PARTITION_FIELD_NAME_FIELD.getPreferredName(), partitionFieldName);
8898
builder.field(PARTITION_FIELD_VALUE_FIELD.getPreferredName(), partitionFieldValue);
8999
builder.field(PERSON_FIELD_NAME_FIELD.getPreferredName(), personFieldName);
100+
builder.field(PERSON_FIELD_VALUE_FIELD.getPreferredName(), personFieldValue);
90101
builder.field(FUNCTION_NAME_FIELD.getPreferredName(), functionName);
91102
builder.field(VALUE_FIELD_NAME_FIELD.getPreferredName(), valueFieldName);
92103
builder.field(PROBABILITY_FIELD.getPreferredName(), probability);
@@ -127,6 +138,14 @@ public void setPersonFieldName(String personFieldName) {
127138
this.personFieldName = personFieldName;
128139
}
129140

141+
public String getPersonFieldValue() {
142+
return personFieldValue;
143+
}
144+
145+
public void setPersonFieldValue(String personFieldValue) {
146+
this.personFieldValue = personFieldValue;
147+
}
148+
130149
public String getFunctionName() {
131150
return functionName;
132151
}
@@ -161,7 +180,7 @@ public void setNormalizedScore(double normalizedScore) {
161180

162181
@Override
163182
public int hashCode() {
164-
return Objects.hash(level, partitionFieldName, partitionFieldValue, personFieldName,
183+
return Objects.hash(level, partitionFieldName, partitionFieldValue, personFieldName, personFieldValue,
165184
functionName, valueFieldName, probability, normalizedScore);
166185
}
167186

@@ -184,6 +203,7 @@ public boolean equals(Object other) {
184203
&& Objects.equals(this.partitionFieldName, that.partitionFieldName)
185204
&& Objects.equals(this.partitionFieldValue, that.partitionFieldValue)
186205
&& Objects.equals(this.personFieldName, that.personFieldName)
206+
&& Objects.equals(this.personFieldValue, that.personFieldValue)
187207
&& Objects.equals(this.functionName, that.functionName)
188208
&& Objects.equals(this.valueFieldName, that.valueFieldName)
189209
&& this.probability == that.probability

x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/job/process/normalizer/PartitionScoreNormalizable.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@ public String getPersonFieldName() {
4545
return null;
4646
}
4747

48+
@Override
49+
public String getPersonFieldValue() {
50+
return null;
51+
}
52+
4853
@Override
4954
public String getFunctionName() {
5055
return null;

x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/job/process/normalizer/RecordNormalizable.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,12 @@ public String getPersonFieldName() {
4646
return over != null ? over : record.getByFieldName();
4747
}
4848

49+
@Override
50+
public String getPersonFieldValue() {
51+
String over = record.getOverFieldValue();
52+
return over != null ? over : record.getByFieldValue();
53+
}
54+
4955
@Override
5056
public String getFunctionName() {
5157
return record.getFunction();

x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/job/process/normalizer/BucketInfluencerNormalizableTests.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,18 @@ public void testGetPartitionFieldName() {
4343
assertNull(new BucketInfluencerNormalizable(bucketInfluencer, INDEX_NAME).getPartitionFieldName());
4444
}
4545

46+
public void testGetPartitionFieldValue() {
47+
assertNull(new BucketInfluencerNormalizable(bucketInfluencer, INDEX_NAME).getPartitionFieldValue());
48+
}
49+
4650
public void testGetPersonFieldName() {
4751
assertEquals("airline", new BucketInfluencerNormalizable(bucketInfluencer, INDEX_NAME).getPersonFieldName());
4852
}
4953

54+
public void testGetPersonFieldValue() {
55+
assertNull(new BucketInfluencerNormalizable(bucketInfluencer, INDEX_NAME).getPersonFieldValue());
56+
}
57+
5058
public void testGetFunctionName() {
5159
assertNull(new BucketInfluencerNormalizable(bucketInfluencer, INDEX_NAME).getFunctionName());
5260
}

x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/job/process/normalizer/BucketNormalizableTests.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,10 @@ public void testGetPersonFieldName() {
7373
assertNull(new BucketNormalizable(bucket, INDEX_NAME).getPersonFieldName());
7474
}
7575

76+
public void testGetPersonFieldValue() {
77+
assertNull(new BucketNormalizable(bucket, INDEX_NAME).getPersonFieldValue());
78+
}
79+
7680
public void testGetFunctionName() {
7781
assertNull(new BucketNormalizable(bucket, INDEX_NAME).getFunctionName());
7882
}

x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/job/process/normalizer/InfluencerNormalizableTests.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@ public void testGetPersonFieldName() {
4444
assertEquals("airline", new InfluencerNormalizable(influencer, INDEX_NAME).getPersonFieldName());
4545
}
4646

47+
public void testGetPersonFieldValue() {
48+
assertEquals("AAL", new InfluencerNormalizable(influencer, INDEX_NAME).getPersonFieldValue());
49+
}
50+
4751
public void testGetFunctionName() {
4852
assertNull(new InfluencerNormalizable(influencer, INDEX_NAME).getFunctionName());
4953
}

x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/job/process/normalizer/NormalizerResultTests.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ public void testDefaultConstructor() {
1919
assertNull(msg.getPartitionFieldName());
2020
assertNull(msg.getPartitionFieldValue());
2121
assertNull(msg.getPersonFieldName());
22+
assertNull(msg.getPersonFieldValue());
2223
assertNull(msg.getFunctionName());
2324
assertNull(msg.getValueFieldName());
2425
assertEquals(0.0, msg.getProbability(), EPSILON);
@@ -32,6 +33,7 @@ protected NormalizerResult createTestInstance() {
3233
msg.setPartitionFieldName("part");
3334
msg.setPartitionFieldValue("something");
3435
msg.setPersonFieldName("person");
36+
msg.setPersonFieldValue("fred");
3537
msg.setFunctionName("mean");
3638
msg.setValueFieldName("value");
3739
msg.setProbability(0.005);

0 commit comments

Comments
 (0)