lucene 4: upgraded FuzzyQueryParser + Builder to use integer edit distance rather
than floats (bw compatible)
This commit is contained in:
parent
b1eaec6c6a
commit
5d47ad4648
|
@ -41,6 +41,9 @@ public class FuzzyQueryBuilder extends BaseQueryBuilder implements BoostableQuer
|
||||||
private Integer prefixLength;
|
private Integer prefixLength;
|
||||||
|
|
||||||
private Integer maxExpansions;
|
private Integer maxExpansions;
|
||||||
|
|
||||||
|
//LUCENE 4 UPGRADE we need a testcase for this + documentation
|
||||||
|
private Boolean transpositions = true;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs a new term query.
|
* Constructs a new term query.
|
||||||
|
@ -81,6 +84,11 @@ public class FuzzyQueryBuilder extends BaseQueryBuilder implements BoostableQuer
|
||||||
this.maxExpansions = maxExpansions;
|
this.maxExpansions = maxExpansions;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public FuzzyQueryBuilder transpositions(boolean transpositions) {
|
||||||
|
this.transpositions = transpositions;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void doXContent(XContentBuilder builder, Params params) throws IOException {
|
public void doXContent(XContentBuilder builder, Params params) throws IOException {
|
||||||
|
@ -93,6 +101,9 @@ public class FuzzyQueryBuilder extends BaseQueryBuilder implements BoostableQuer
|
||||||
if (boost != -1) {
|
if (boost != -1) {
|
||||||
builder.field("boost", boost);
|
builder.field("boost", boost);
|
||||||
}
|
}
|
||||||
|
if (!transpositions) {
|
||||||
|
builder.field("transpositions", transpositions);
|
||||||
|
}
|
||||||
if (minSimilarity != null) {
|
if (minSimilarity != null) {
|
||||||
builder.field("min_similarity", minSimilarity);
|
builder.field("min_similarity", minSimilarity);
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,9 +60,11 @@ public class FuzzyQueryParser implements QueryParser {
|
||||||
|
|
||||||
String value = null;
|
String value = null;
|
||||||
float boost = 1.0f;
|
float boost = 1.0f;
|
||||||
|
//LUCENE 4 UPGRADE we should find a good default here I'd vote for 1.0 -> 1 edit
|
||||||
String minSimilarity = "0.5";
|
String minSimilarity = "0.5";
|
||||||
int prefixLength = FuzzyQuery.defaultPrefixLength;
|
int prefixLength = FuzzyQuery.defaultPrefixLength;
|
||||||
int maxExpansions = FuzzyQuery.defaultMaxExpansions;
|
int maxExpansions = FuzzyQuery.defaultMaxExpansions;
|
||||||
|
boolean transpositions = true;
|
||||||
MultiTermQuery.RewriteMethod rewriteMethod = null;
|
MultiTermQuery.RewriteMethod rewriteMethod = null;
|
||||||
token = parser.nextToken();
|
token = parser.nextToken();
|
||||||
if (token == XContentParser.Token.START_OBJECT) {
|
if (token == XContentParser.Token.START_OBJECT) {
|
||||||
|
@ -83,6 +85,8 @@ public class FuzzyQueryParser implements QueryParser {
|
||||||
prefixLength = parser.intValue();
|
prefixLength = parser.intValue();
|
||||||
} else if ("max_expansions".equals(currentFieldName) || "maxExpansions".equals(currentFieldName)) {
|
} else if ("max_expansions".equals(currentFieldName) || "maxExpansions".equals(currentFieldName)) {
|
||||||
maxExpansions = parser.intValue();
|
maxExpansions = parser.intValue();
|
||||||
|
} else if ("transpositions".equals(currentFieldName)) {
|
||||||
|
transpositions = parser.booleanValue();
|
||||||
} else if ("rewrite".equals(currentFieldName)) {
|
} else if ("rewrite".equals(currentFieldName)) {
|
||||||
rewriteMethod = QueryParsers.parseRewriteMethod(parser.textOrNull(), null);
|
rewriteMethod = QueryParsers.parseRewriteMethod(parser.textOrNull(), null);
|
||||||
} else {
|
} else {
|
||||||
|
@ -109,7 +113,10 @@ public class FuzzyQueryParser implements QueryParser {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (query == null) {
|
if (query == null) {
|
||||||
query = new FuzzyQuery(new Term(fieldName, value), Float.parseFloat(minSimilarity), prefixLength, maxExpansions);
|
//LUCENE 4 UPGRADE we need to document that this should now be an int rather than a float
|
||||||
|
int edits = FuzzyQuery.floatToEdits(Float.parseFloat(minSimilarity),
|
||||||
|
value.codePointCount(0, value.length()));
|
||||||
|
query = new FuzzyQuery(new Term(fieldName, value), edits, prefixLength, maxExpansions, transpositions);
|
||||||
}
|
}
|
||||||
if (query instanceof MultiTermQuery) {
|
if (query instanceof MultiTermQuery) {
|
||||||
QueryParsers.setRewriteMethod((MultiTermQuery) query, rewriteMethod);
|
QueryParsers.setRewriteMethod((MultiTermQuery) query, rewriteMethod);
|
||||||
|
|
Loading…
Reference in New Issue