|
@@ -19,11 +19,11 @@
|
|
|
|
|
|
package org.elasticsearch.index.similarity;
|
|
|
|
|
|
+import org.apache.lucene.search.similarities.ClassicSimilarity;
|
|
|
import org.apache.lucene.search.similarities.AfterEffectL;
|
|
|
import org.apache.lucene.search.similarities.BM25Similarity;
|
|
|
import org.apache.lucene.search.similarities.BasicModelG;
|
|
|
import org.apache.lucene.search.similarities.DFRSimilarity;
|
|
|
-import org.apache.lucene.search.similarities.DefaultSimilarity;
|
|
|
import org.apache.lucene.search.similarities.DistributionSPL;
|
|
|
import org.apache.lucene.search.similarities.IBSimilarity;
|
|
|
import org.apache.lucene.search.similarities.LMDirichletSimilarity;
|
|
@@ -31,11 +31,16 @@ import org.apache.lucene.search.similarities.LMJelinekMercerSimilarity;
|
|
|
import org.apache.lucene.search.similarities.LambdaTTF;
|
|
|
import org.apache.lucene.search.similarities.NormalizationH2;
|
|
|
import org.elasticsearch.common.compress.CompressedXContent;
|
|
|
+import org.elasticsearch.Version;
|
|
|
+import org.elasticsearch.cluster.metadata.IndexMetaData;
|
|
|
import org.elasticsearch.common.settings.Settings;
|
|
|
import org.elasticsearch.common.xcontent.XContentFactory;
|
|
|
import org.elasticsearch.index.IndexService;
|
|
|
import org.elasticsearch.index.mapper.DocumentMapper;
|
|
|
+import org.elasticsearch.index.mapper.DocumentMapperParser;
|
|
|
+import org.elasticsearch.index.mapper.MapperParsingException;
|
|
|
import org.elasticsearch.test.ESSingleNodeTestCase;
|
|
|
+import org.elasticsearch.test.VersionUtils;
|
|
|
|
|
|
import java.io.IOException;
|
|
|
|
|
@@ -45,42 +50,43 @@ import static org.hamcrest.CoreMatchers.instanceOf;
|
|
|
public class SimilarityTests extends ESSingleNodeTestCase {
|
|
|
public void testResolveDefaultSimilarities() {
|
|
|
SimilarityService similarityService = createIndex("foo").similarityService();
|
|
|
- assertThat(similarityService.getSimilarity("default").get(), instanceOf(DefaultSimilarity.class));
|
|
|
+ assertThat(similarityService.getSimilarity("classic").get(), instanceOf(ClassicSimilarity.class));
|
|
|
assertThat(similarityService.getSimilarity("BM25").get(), instanceOf(BM25Similarity.class));
|
|
|
+ assertThat(similarityService.getSimilarity("default"), equalTo(null));
|
|
|
}
|
|
|
|
|
|
- public void testResolveSimilaritiesFromMapping_default() throws IOException {
|
|
|
+ public void testResolveSimilaritiesFromMapping_classic() throws IOException {
|
|
|
String mapping = XContentFactory.jsonBuilder().startObject().startObject("type")
|
|
|
- .startObject("properties")
|
|
|
- .startObject("field1").field("type", "string").field("similarity", "my_similarity").endObject()
|
|
|
- .endObject()
|
|
|
- .endObject().endObject().string();
|
|
|
+ .startObject("properties")
|
|
|
+ .startObject("field1").field("type", "string").field("similarity", "my_similarity").endObject()
|
|
|
+ .endObject()
|
|
|
+ .endObject().endObject().string();
|
|
|
|
|
|
Settings indexSettings = Settings.settingsBuilder()
|
|
|
- .put("index.similarity.my_similarity.type", "default")
|
|
|
- .put("index.similarity.my_similarity.discount_overlaps", false)
|
|
|
- .build();
|
|
|
+ .put("index.similarity.my_similarity.type", "classic")
|
|
|
+ .put("index.similarity.my_similarity.discount_overlaps", false)
|
|
|
+ .build();
|
|
|
IndexService indexService = createIndex("foo", indexSettings);
|
|
|
DocumentMapper documentMapper = indexService.mapperService().documentMapperParser().parse("type", new CompressedXContent(mapping));
|
|
|
- assertThat(documentMapper.mappers().getMapper("field1").fieldType().similarity(), instanceOf(DefaultSimilarityProvider.class));
|
|
|
+ assertThat(documentMapper.mappers().getMapper("field1").fieldType().similarity(), instanceOf(ClassicSimilarityProvider.class));
|
|
|
|
|
|
- DefaultSimilarity similarity = (DefaultSimilarity) documentMapper.mappers().getMapper("field1").fieldType().similarity().get();
|
|
|
+ ClassicSimilarity similarity = (ClassicSimilarity) documentMapper.mappers().getMapper("field1").fieldType().similarity().get();
|
|
|
assertThat(similarity.getDiscountOverlaps(), equalTo(false));
|
|
|
}
|
|
|
|
|
|
public void testResolveSimilaritiesFromMapping_bm25() throws IOException {
|
|
|
String mapping = XContentFactory.jsonBuilder().startObject().startObject("type")
|
|
|
- .startObject("properties")
|
|
|
- .startObject("field1").field("type", "string").field("similarity", "my_similarity").endObject()
|
|
|
- .endObject()
|
|
|
- .endObject().endObject().string();
|
|
|
+ .startObject("properties")
|
|
|
+ .startObject("field1").field("type", "string").field("similarity", "my_similarity").endObject()
|
|
|
+ .endObject()
|
|
|
+ .endObject().endObject().string();
|
|
|
|
|
|
Settings indexSettings = Settings.settingsBuilder()
|
|
|
- .put("index.similarity.my_similarity.type", "BM25")
|
|
|
- .put("index.similarity.my_similarity.k1", 2.0f)
|
|
|
- .put("index.similarity.my_similarity.b", 1.5f)
|
|
|
- .put("index.similarity.my_similarity.discount_overlaps", false)
|
|
|
- .build();
|
|
|
+ .put("index.similarity.my_similarity.type", "BM25")
|
|
|
+ .put("index.similarity.my_similarity.k1", 2.0f)
|
|
|
+ .put("index.similarity.my_similarity.b", 1.5f)
|
|
|
+ .put("index.similarity.my_similarity.discount_overlaps", false)
|
|
|
+ .build();
|
|
|
IndexService indexService = createIndex("foo", indexSettings);
|
|
|
DocumentMapper documentMapper = indexService.mapperService().documentMapperParser().parse("type", new CompressedXContent(mapping));
|
|
|
assertThat(documentMapper.mappers().getMapper("field1").fieldType().similarity(), instanceOf(BM25SimilarityProvider.class));
|
|
@@ -93,18 +99,18 @@ public class SimilarityTests extends ESSingleNodeTestCase {
|
|
|
|
|
|
public void testResolveSimilaritiesFromMapping_DFR() throws IOException {
|
|
|
String mapping = XContentFactory.jsonBuilder().startObject().startObject("type")
|
|
|
- .startObject("properties")
|
|
|
- .startObject("field1").field("type", "string").field("similarity", "my_similarity").endObject()
|
|
|
- .endObject()
|
|
|
- .endObject().endObject().string();
|
|
|
+ .startObject("properties")
|
|
|
+ .startObject("field1").field("type", "string").field("similarity", "my_similarity").endObject()
|
|
|
+ .endObject()
|
|
|
+ .endObject().endObject().string();
|
|
|
|
|
|
Settings indexSettings = Settings.settingsBuilder()
|
|
|
- .put("index.similarity.my_similarity.type", "DFR")
|
|
|
- .put("index.similarity.my_similarity.basic_model", "g")
|
|
|
- .put("index.similarity.my_similarity.after_effect", "l")
|
|
|
- .put("index.similarity.my_similarity.normalization", "h2")
|
|
|
- .put("index.similarity.my_similarity.normalization.h2.c", 3f)
|
|
|
- .build();
|
|
|
+ .put("index.similarity.my_similarity.type", "DFR")
|
|
|
+ .put("index.similarity.my_similarity.basic_model", "g")
|
|
|
+ .put("index.similarity.my_similarity.after_effect", "l")
|
|
|
+ .put("index.similarity.my_similarity.normalization", "h2")
|
|
|
+ .put("index.similarity.my_similarity.normalization.h2.c", 3f)
|
|
|
+ .build();
|
|
|
IndexService indexService = createIndex("foo", indexSettings);
|
|
|
DocumentMapper documentMapper = indexService.mapperService().documentMapperParser().parse("type", new CompressedXContent(mapping));
|
|
|
assertThat(documentMapper.mappers().getMapper("field1").fieldType().similarity(), instanceOf(DFRSimilarityProvider.class));
|
|
@@ -118,18 +124,18 @@ public class SimilarityTests extends ESSingleNodeTestCase {
|
|
|
|
|
|
public void testResolveSimilaritiesFromMapping_IB() throws IOException {
|
|
|
String mapping = XContentFactory.jsonBuilder().startObject().startObject("type")
|
|
|
- .startObject("properties")
|
|
|
- .startObject("field1").field("type", "string").field("similarity", "my_similarity").endObject()
|
|
|
- .endObject()
|
|
|
- .endObject().endObject().string();
|
|
|
+ .startObject("properties")
|
|
|
+ .startObject("field1").field("type", "string").field("similarity", "my_similarity").endObject()
|
|
|
+ .endObject()
|
|
|
+ .endObject().endObject().string();
|
|
|
|
|
|
Settings indexSettings = Settings.settingsBuilder()
|
|
|
- .put("index.similarity.my_similarity.type", "IB")
|
|
|
- .put("index.similarity.my_similarity.distribution", "spl")
|
|
|
- .put("index.similarity.my_similarity.lambda", "ttf")
|
|
|
- .put("index.similarity.my_similarity.normalization", "h2")
|
|
|
- .put("index.similarity.my_similarity.normalization.h2.c", 3f)
|
|
|
- .build();
|
|
|
+ .put("index.similarity.my_similarity.type", "IB")
|
|
|
+ .put("index.similarity.my_similarity.distribution", "spl")
|
|
|
+ .put("index.similarity.my_similarity.lambda", "ttf")
|
|
|
+ .put("index.similarity.my_similarity.normalization", "h2")
|
|
|
+ .put("index.similarity.my_similarity.normalization.h2.c", 3f)
|
|
|
+ .build();
|
|
|
IndexService indexService = createIndex("foo", indexSettings);
|
|
|
DocumentMapper documentMapper = indexService.mapperService().documentMapperParser().parse("type", new CompressedXContent(mapping));
|
|
|
assertThat(documentMapper.mappers().getMapper("field1").fieldType().similarity(), instanceOf(IBSimilarityProvider.class));
|
|
@@ -143,15 +149,15 @@ public class SimilarityTests extends ESSingleNodeTestCase {
|
|
|
|
|
|
public void testResolveSimilaritiesFromMapping_LMDirichlet() throws IOException {
|
|
|
String mapping = XContentFactory.jsonBuilder().startObject().startObject("type")
|
|
|
- .startObject("properties")
|
|
|
- .startObject("field1").field("type", "string").field("similarity", "my_similarity").endObject()
|
|
|
- .endObject()
|
|
|
- .endObject().endObject().string();
|
|
|
+ .startObject("properties")
|
|
|
+ .startObject("field1").field("type", "string").field("similarity", "my_similarity").endObject()
|
|
|
+ .endObject()
|
|
|
+ .endObject().endObject().string();
|
|
|
|
|
|
Settings indexSettings = Settings.settingsBuilder()
|
|
|
- .put("index.similarity.my_similarity.type", "LMDirichlet")
|
|
|
- .put("index.similarity.my_similarity.mu", 3000f)
|
|
|
- .build();
|
|
|
+ .put("index.similarity.my_similarity.type", "LMDirichlet")
|
|
|
+ .put("index.similarity.my_similarity.mu", 3000f)
|
|
|
+ .build();
|
|
|
IndexService indexService = createIndex("foo", indexSettings);
|
|
|
DocumentMapper documentMapper = indexService.mapperService().documentMapperParser().parse("type", new CompressedXContent(mapping));
|
|
|
assertThat(documentMapper.mappers().getMapper("field1").fieldType().similarity(), instanceOf(LMDirichletSimilarityProvider.class));
|
|
@@ -162,15 +168,15 @@ public class SimilarityTests extends ESSingleNodeTestCase {
|
|
|
|
|
|
public void testResolveSimilaritiesFromMapping_LMJelinekMercer() throws IOException {
|
|
|
String mapping = XContentFactory.jsonBuilder().startObject().startObject("type")
|
|
|
- .startObject("properties")
|
|
|
- .startObject("field1").field("type", "string").field("similarity", "my_similarity").endObject()
|
|
|
- .endObject()
|
|
|
- .endObject().endObject().string();
|
|
|
+ .startObject("properties")
|
|
|
+ .startObject("field1").field("type", "string").field("similarity", "my_similarity").endObject()
|
|
|
+ .endObject()
|
|
|
+ .endObject().endObject().string();
|
|
|
|
|
|
Settings indexSettings = Settings.settingsBuilder()
|
|
|
- .put("index.similarity.my_similarity.type", "LMJelinekMercer")
|
|
|
- .put("index.similarity.my_similarity.lambda", 0.7f)
|
|
|
- .build();
|
|
|
+ .put("index.similarity.my_similarity.type", "LMJelinekMercer")
|
|
|
+ .put("index.similarity.my_similarity.lambda", 0.7f)
|
|
|
+ .build();
|
|
|
IndexService indexService = createIndex("foo", indexSettings);
|
|
|
DocumentMapper documentMapper = indexService.mapperService().documentMapperParser().parse("type", new CompressedXContent(mapping));
|
|
|
assertThat(documentMapper.mappers().getMapper("field1").fieldType().similarity(), instanceOf(LMJelinekMercerSimilarityProvider.class));
|
|
@@ -178,4 +184,47 @@ public class SimilarityTests extends ESSingleNodeTestCase {
|
|
|
LMJelinekMercerSimilarity similarity = (LMJelinekMercerSimilarity) documentMapper.mappers().getMapper("field1").fieldType().similarity().get();
|
|
|
assertThat(similarity.getLambda(), equalTo(0.7f));
|
|
|
}
|
|
|
+
|
|
|
+ public void testResolveSimilaritiesFromMapping_Unknown() throws IOException {
|
|
|
+ String mapping = XContentFactory.jsonBuilder().startObject().startObject("type")
|
|
|
+ .startObject("properties")
|
|
|
+ .startObject("field1").field("type", "string").field("similarity", "unknown_similarity").endObject()
|
|
|
+ .endObject()
|
|
|
+ .endObject().endObject().string();
|
|
|
+
|
|
|
+ IndexService indexService = createIndex("foo");
|
|
|
+ try {
|
|
|
+ indexService.mapperService().documentMapperParser().parse("type", new CompressedXContent(mapping));
|
|
|
+ fail("Expected MappingParsingException");
|
|
|
+ } catch (MapperParsingException e) {
|
|
|
+ assertThat(e.getMessage(), equalTo("Unknown Similarity type [unknown_similarity] for [field1]"));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testSimilarityDefaultBackCompat() throws IOException {
|
|
|
+ String mapping = XContentFactory.jsonBuilder().startObject().startObject("type")
|
|
|
+ .startObject("properties")
|
|
|
+ .startObject("field1")
|
|
|
+ .field("similarity", "default")
|
|
|
+ .field("type", "string")
|
|
|
+ .endObject()
|
|
|
+ .endObject()
|
|
|
+ .endObject().string();
|
|
|
+ Settings settings = Settings.builder()
|
|
|
+ .put(IndexMetaData.SETTING_VERSION_CREATED, VersionUtils.randomVersionBetween(random(), Version.V_2_0_0, Version.V_2_2_0))
|
|
|
+ .build();
|
|
|
+
|
|
|
+ DocumentMapperParser parser = createIndex("test_v2.x", settings).mapperService().documentMapperParser();
|
|
|
+ DocumentMapper documentMapper = parser.parse("type", new CompressedXContent(mapping));
|
|
|
+ assertThat(documentMapper.mappers().getMapper("field1").fieldType().similarity(), instanceOf(ClassicSimilarityProvider.class));
|
|
|
+ assertThat(documentMapper.mappers().getMapper("field1").fieldType().similarity().name(), equalTo("classic"));
|
|
|
+
|
|
|
+ parser = createIndex("test_v3.x").mapperService().documentMapperParser();
|
|
|
+ try {
|
|
|
+ parser.parse("type", new CompressedXContent(mapping));
|
|
|
+ fail("Expected MappingParsingException");
|
|
|
+ } catch (MapperParsingException e) {
|
|
|
+ assertThat(e.getMessage(), equalTo("Unknown Similarity type [default] for [field1]"));
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|