Skip to content

Commit 8a5a44c

Browse files
committed
Search API: Set different boost for indices when searching across indices, closes #23.
1 parent ffbc2a9 commit 8a5a44c

File tree

3 files changed

+37
-19
lines changed

3 files changed

+37
-19
lines changed

modules/elasticsearch/src/main/java/org/elasticsearch/action/search/SearchRequest.java

+13-13
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public class SearchRequest implements ActionRequest {
6060

6161
private String[] types = Strings.EMPTY_ARRAY;
6262

63-
private TObjectFloatHashMap<String> queryBoost = EMPTY;
63+
private TObjectFloatHashMap<String> indexBoost = EMPTY;
6464

6565
private TimeValue timeout;
6666

@@ -191,15 +191,15 @@ public void timeout(TimeValue timeout) {
191191
* Allows to set a dynamic query boost on an index level query. Very handy when, for example, each user has
192192
* his own index, and friends matter more than friends of friends.
193193
*/
194-
public TObjectFloatHashMap<String> queryBoost() {
195-
return queryBoost;
194+
public TObjectFloatHashMap<String> indexBoost() {
195+
return indexBoost;
196196
}
197197

198-
public SearchRequest queryBoost(String index, float queryBoost) {
199-
if (this.queryBoost == EMPTY) {
200-
this.queryBoost = new TObjectFloatHashMap<String>();
198+
public SearchRequest indexBoost(String index, float indexBoost) {
199+
if (this.indexBoost == EMPTY) {
200+
this.indexBoost = new TObjectFloatHashMap<String>();
201201
}
202-
this.queryBoost.put(index, queryBoost);
202+
this.indexBoost.put(index, indexBoost);
203203
return this;
204204
}
205205

@@ -237,11 +237,11 @@ public SearchRequest size(int size) {
237237

238238
int size = in.readInt();
239239
if (size == 0) {
240-
queryBoost = EMPTY;
240+
indexBoost = EMPTY;
241241
} else {
242-
queryBoost = new TObjectFloatHashMap<String>(size);
242+
indexBoost = new TObjectFloatHashMap<String>(size);
243243
for (int i = 0; i < size; i++) {
244-
queryBoost.put(in.readUTF(), in.readFloat());
244+
indexBoost.put(in.readUTF(), in.readFloat());
245245
}
246246
}
247247

@@ -285,11 +285,11 @@ public SearchRequest size(int size) {
285285
timeout.writeTo(out);
286286
}
287287
out.writeUTF(source);
288-
if (queryBoost == null) {
288+
if (indexBoost == null) {
289289
out.writeInt(0);
290290
} else {
291-
out.writeInt(queryBoost.size());
292-
for (TObjectFloatIterator<String> it = queryBoost.iterator(); it.hasNext();) {
291+
out.writeInt(indexBoost.size());
292+
for (TObjectFloatIterator<String> it = indexBoost.iterator(); it.hasNext();) {
293293
it.advance();
294294
out.writeUTF(it.key());
295295
out.writeFloat(it.value());

modules/elasticsearch/src/main/java/org/elasticsearch/action/search/type/TransportSearchHelper.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,9 @@ public static InternalSearchRequest internalSearchRequest(ShardRouting shardRout
4747
InternalSearchRequest internalRequest = new InternalSearchRequest(shardRouting, request.source());
4848
internalRequest.from(request.from()).size(request.size());
4949
internalRequest.scroll(request.scroll());
50-
if (request.queryBoost() != null) {
51-
if (request.queryBoost().containsKey(shardRouting.index())) {
52-
internalRequest.queryBoost(request.queryBoost().get(shardRouting.index()));
50+
if (request.indexBoost() != null) {
51+
if (request.indexBoost().containsKey(shardRouting.index())) {
52+
internalRequest.queryBoost(request.indexBoost().get(shardRouting.index()));
5353
}
5454
}
5555
internalRequest.timeout(request.timeout());

modules/elasticsearch/src/main/java/org/elasticsearch/rest/action/search/RestSearchAction.java

+21-3
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,13 @@
5050
*/
5151
public class RestSearchAction extends BaseRestHandler {
5252

53-
public final static Pattern fieldsPattern;
53+
private final static Pattern fieldsPattern;
54+
55+
private final static Pattern indicesBoostPattern;
5456

5557
static {
5658
fieldsPattern = Pattern.compile(",");
59+
indicesBoostPattern = Pattern.compile(",");
5760
}
5861

5962
@Inject public RestSearchAction(Settings settings, Client client, RestController controller) {
@@ -139,8 +142,23 @@ private SearchRequest parseSearchRequest(RestRequest request) {
139142
searchRequest.size(Integer.parseInt(size));
140143
}
141144

142-
// TODO query boost per index
143-
// searchRequest.queryBoost();
145+
String sIndicesBoost = request.param("indicesBoost");
146+
if (sIndicesBoost != null) {
147+
String[] indicesBoost = indicesBoostPattern.split(sIndicesBoost);
148+
for (String indexBoost : indicesBoost) {
149+
int divisor = indexBoost.indexOf(',');
150+
if (divisor == -1) {
151+
throw new ElasticSearchIllegalArgumentException("Illegal index boost [" + indexBoost + "], no ','");
152+
}
153+
String indexName = indexBoost.substring(0, divisor);
154+
String sBoost = indexBoost.substring(divisor + 1);
155+
try {
156+
searchRequest.indexBoost(indexName, Float.parseFloat(sBoost));
157+
} catch (NumberFormatException e) {
158+
throw new ElasticSearchIllegalArgumentException("Illegal index boost [" + indexBoost + "], boost not a float number");
159+
}
160+
}
161+
}
144162

145163
String scroll = request.param("scroll");
146164
if (scroll != null) {

0 commit comments

Comments
 (0)