Skip to content

Commit

Permalink
initial commit.
Browse files Browse the repository at this point in the history
  • Loading branch information
marevol committed Aug 26, 2014
1 parent cc5c4cd commit c3c7d7f
Show file tree
Hide file tree
Showing 10 changed files with 837 additions and 3 deletions.
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
.settings
.classpath
.project
.idea
/target
73 changes: 70 additions & 3 deletions README.md
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.
113 changes: 113 additions & 0 deletions pom.xml
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>
18 changes: 18 additions & 0 deletions src/main/assemblies/plugin.xml
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 src/main/java/org/codelibs/dynarank/DynamicRankingException.java
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 src/main/java/org/codelibs/dynarank/DynamicRankingPlugin.java
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;
}

}
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();
}
}
Loading

0 comments on commit c3c7d7f

Please sign in to comment.