-
Notifications
You must be signed in to change notification settings - Fork 15
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
10 changed files
with
837 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
.settings | ||
.classpath | ||
.project | ||
.idea | ||
/target |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,71 @@ | ||
elasticsearch-dynarank | ||
====================== | ||
Elasticsearch DynaRank Pugin | ||
======================= | ||
|
||
## Overview | ||
|
||
DynaRank Plugin provides a feature for Dynamic Ranking at a search time. | ||
You can change top N documents in the search result with your re-ordering algorism. | ||
|
||
## Version | ||
|
||
| Taste | Elasticsearch | | ||
|:---------:|:-------------:| | ||
| master | 1.3.X | | ||
|
||
### Issues/Questions | ||
|
||
Please file an [issue](https://github.com/codelibs/elasticsearch-dynarank/issues "issue"). | ||
(Japanese forum is [here](https://github.com/codelibs/codelibs-ja-forum "here").) | ||
|
||
## Installation | ||
|
||
### Install DynaRank Plugin | ||
|
||
(will be released...) | ||
|
||
$ $ES_HOME/bin/plugin --install org.codelibs/elasticsearch-dynarank/1.3.0 | ||
|
||
## Getting Started | ||
|
||
### Create Sample Data | ||
|
||
Create "sample" index: | ||
|
||
$ COUNT=1;while [ $COUNT -le 100 ] ; do curl -XPOST 'localhost:9200/sample/data' -d "{\"message\":\"Hello $COUNT\",\"counter\":$COUNT}";COUNT=`expr $COUNT + 1`; done | ||
|
||
100 documents are inserted. You can see 10 documents by an ascending order of "counter" field: | ||
|
||
$ curl -XPOST "http://127.0.0.1:9200/sample/data/_search" -d' | ||
{ | ||
"query": { | ||
"match_all": {} | ||
}, | ||
"fields": [ | ||
"counter", | ||
"_source" | ||
], | ||
"sort": [ | ||
{ | ||
"counter": { | ||
"order": "asc" | ||
} | ||
} | ||
] | ||
}' | ||
|
||
### Enable DynaRank Plugin | ||
|
||
DynaRank plugin is enabled if your re-order script is set to the target index: | ||
|
||
$ curl -XPOST 'localhost:9200/sample/_close' | ||
$ curl -XPUT 'localhost:9200/sample/_settings?index.dynarank.script=searchHits.sort%20%7Bs1%2C%20s2%20-%3E%20s2.field%28%27counter%27%29.value%28%29%20-%20s1.field%28%27counter%27%29.value%28%29%7D%20as%20org.elasticsearch.search.internal.InternalSearchHit%5B%5D' | ||
$ curl -XPUT 'localhost:9200/sample/_settings?index.dynarank.reorder_size=5' | ||
$ curl -XPOST 'localhost:9200/sample/_open' | ||
|
||
The above script is: | ||
|
||
searchHits.sort {s1, s2 -> s2.field('counter').value() - s1.field('counter').value()} as org.elasticsearch.search.internal.InternalSearchHit[] | ||
|
||
This setting sorts top 5 documents (5 is given by reorder\_size) by a descending order of "counter" field, and others are by an ascending order. | ||
|
||
|
||
This plugin provides a feature to change top N documents in a search result. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,113 @@ | ||
<?xml version="1.0" encoding="UTF-8"?> | ||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||
<name>elasticsearch-dynarank</name> | ||
<modelVersion>4.0.0</modelVersion> | ||
<groupId>org.codelibs</groupId> | ||
<artifactId>elasticsearch-dynarank</artifactId> | ||
<version>1.3.0-SNAPSHOT</version> | ||
<packaging>jar</packaging> | ||
<description>This plugin provides a feature to re-rank a search result at the search time.</description> | ||
<inceptionYear>2011</inceptionYear> | ||
<licenses> | ||
<license> | ||
<name>The Apache Software License, Version 2.0</name> | ||
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url> | ||
<distribution>repo</distribution> | ||
</license> | ||
</licenses> | ||
<scm> | ||
<connection>scm:git:git@github.com:codelibs/elasticsearch-dynarank.git</connection> | ||
<developerConnection>scm:git:git@github.com:codelibs/elasticsearch-dynarank.git</developerConnection> | ||
<url>git@github.com:codelibs/elasticsearch-dynarank.git</url> | ||
</scm> | ||
<parent> | ||
<groupId>org.sonatype.oss</groupId> | ||
<artifactId>oss-parent</artifactId> | ||
<version>7</version> | ||
</parent> | ||
<properties> | ||
<elasticsearch.version>1.3.2</elasticsearch.version> | ||
</properties> | ||
<build> | ||
<plugins> | ||
<plugin> | ||
<groupId>org.apache.maven.plugins</groupId> | ||
<artifactId>maven-compiler-plugin</artifactId> | ||
<configuration> | ||
<source>1.7</source> | ||
<target>1.7</target> | ||
</configuration> | ||
</plugin> | ||
<plugin> | ||
<groupId>org.apache.maven.plugins</groupId> | ||
<artifactId>maven-surefire-plugin</artifactId> | ||
<configuration> | ||
<includes> | ||
<include>**/*Tests.java</include> | ||
</includes> | ||
</configuration> | ||
</plugin> | ||
<plugin> | ||
<groupId>org.apache.maven.plugins</groupId> | ||
<artifactId>maven-source-plugin</artifactId> | ||
<executions> | ||
<execution> | ||
<id>attach-sources</id> | ||
<goals> | ||
<goal>jar</goal> | ||
</goals> | ||
</execution> | ||
</executions> | ||
</plugin> | ||
<plugin> | ||
<artifactId>maven-assembly-plugin</artifactId> | ||
<configuration> | ||
<outputDirectory>${project.build.directory}/releases/</outputDirectory> | ||
<descriptors> | ||
<descriptor>${basedir}/src/main/assemblies/plugin.xml</descriptor> | ||
</descriptors> | ||
</configuration> | ||
<executions> | ||
<execution> | ||
<phase>package</phase> | ||
<goals> | ||
<goal>single</goal> | ||
</goals> | ||
</execution> | ||
</executions> | ||
</plugin> | ||
</plugins> | ||
</build> | ||
<dependencies> | ||
<dependency> | ||
<groupId>org.elasticsearch</groupId> | ||
<artifactId>elasticsearch</artifactId> | ||
<version>${elasticsearch.version}</version> | ||
<scope>provided</scope> | ||
</dependency> | ||
<dependency> | ||
<groupId>org.codelibs</groupId> | ||
<artifactId>elasticsearch-cluster-runner</artifactId> | ||
<version>1.3.2.0</version> | ||
<scope>test</scope> | ||
</dependency> | ||
<dependency> | ||
<groupId>org.javassist</groupId> | ||
<artifactId>javassist</artifactId> | ||
<version>3.18.2-GA</version> | ||
</dependency> | ||
<dependency> | ||
<groupId>junit</groupId> | ||
<artifactId>junit</artifactId> | ||
<version>4.11</version> | ||
<scope>test</scope> | ||
</dependency> | ||
<dependency> | ||
<groupId>org.codehaus.groovy</groupId> | ||
<artifactId>groovy-all</artifactId> | ||
<version>2.3.2</version> | ||
<scope>test</scope> | ||
</dependency> | ||
</dependencies> | ||
</project> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
<?xml version="1.0"?> | ||
<assembly> | ||
<id></id> | ||
<formats> | ||
<format>zip</format> | ||
</formats> | ||
<includeBaseDirectory>false</includeBaseDirectory> | ||
<dependencySets> | ||
<dependencySet> | ||
<outputDirectory>/</outputDirectory> | ||
<useProjectArtifact>true</useProjectArtifact> | ||
<useTransitiveFiltering>true</useTransitiveFiltering> | ||
<excludes> | ||
<exclude>org.elasticsearch:elasticsearch</exclude> | ||
</excludes> | ||
</dependencySet> | ||
</dependencySets> | ||
</assembly> |
15 changes: 15 additions & 0 deletions
15
src/main/java/org/codelibs/dynarank/DynamicRankingException.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
package org.codelibs.dynarank; | ||
|
||
public class DynamicRankingException extends RuntimeException { | ||
|
||
private static final long serialVersionUID = 1L; | ||
|
||
public DynamicRankingException(final String message) { | ||
super(message); | ||
} | ||
|
||
public DynamicRankingException(final String message, final Throwable cause) { | ||
super(message, cause); | ||
} | ||
|
||
} |
57 changes: 57 additions & 0 deletions
57
src/main/java/org/codelibs/dynarank/DynamicRankingPlugin.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
package org.codelibs.dynarank; | ||
|
||
import java.util.Collection; | ||
|
||
import javassist.ClassPool; | ||
import javassist.CtClass; | ||
import javassist.CtMethod; | ||
|
||
import org.codelibs.dynarank.module.DynamicRankingModule; | ||
import org.elasticsearch.common.collect.Lists; | ||
import org.elasticsearch.common.inject.Module; | ||
import org.elasticsearch.plugins.AbstractPlugin; | ||
|
||
public class DynamicRankingPlugin extends AbstractPlugin { | ||
public DynamicRankingPlugin() throws Exception { | ||
final String transportSearchActionClsName = "org.elasticsearch.action.search.TransportSearchAction"; | ||
final String searchRequestClsName = "org.elasticsearch.action.search.SearchRequest"; | ||
final String actionListenerClsName = "org.elasticsearch.action.ActionListener"; | ||
final String dynamicRankerClsName = "org.codelibs.dynarank.ranker.DynamicRanker"; | ||
|
||
final ClassPool classPool = ClassPool.getDefault(); | ||
final CtClass cc = classPool.get(transportSearchActionClsName); | ||
|
||
final CtMethod createAndPutContextMethod = cc.getDeclaredMethod( | ||
"doExecute", | ||
new CtClass[] { classPool.get(searchRequestClsName), | ||
classPool.get(actionListenerClsName) }); | ||
createAndPutContextMethod.insertBefore(// | ||
actionListenerClsName + " newListener=" + dynamicRankerClsName | ||
+ ".get().wrapActionListener($1,$2);"// | ||
+ "if(newListener!=null){$2=newListener;}"// | ||
); | ||
|
||
final ClassLoader classLoader = this.getClass().getClassLoader(); | ||
cc.toClass(classLoader, this.getClass().getProtectionDomain()); | ||
|
||
} | ||
|
||
@Override | ||
public String name() { | ||
return "DynamicRankingPlugin"; | ||
} | ||
|
||
@Override | ||
public String description() { | ||
return "This plugin re-orders top N documents in a search results."; | ||
} | ||
|
||
@Override | ||
public Collection<Class<? extends Module>> modules() { | ||
final Collection<Class<? extends Module>> modules = Lists | ||
.newArrayList(); | ||
modules.add(DynamicRankingModule.class); | ||
return modules; | ||
} | ||
|
||
} |
12 changes: 12 additions & 0 deletions
12
src/main/java/org/codelibs/dynarank/module/DynamicRankingModule.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
package org.codelibs.dynarank.module; | ||
|
||
import org.codelibs.dynarank.ranker.DynamicRanker; | ||
import org.elasticsearch.common.inject.AbstractModule; | ||
|
||
public class DynamicRankingModule extends AbstractModule { | ||
|
||
@Override | ||
protected void configure() { | ||
bind(DynamicRanker.class).asEagerSingleton(); | ||
} | ||
} |
Oops, something went wrong.