[mb-commits] r13611 - in search_server/trunk/servlet/src: main/java/org/musicbrainz/search/servlet test/java/org/musicbrainz/search/servlet

[email protected]
Newsgroups gmane.comp.audio.musicbrainz.cvs
Message-ID <E1TV8hZ-0003vX-4m@wiley>
Author: murdos
Date: 2012-11-04 22:29:56 +0000 (Sun, 04 Nov 2012)
New Revision: 13611

Added:
   search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/AbstractDismaxSearchServer.java
   search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/AbstractSearchServer.java
Modified:
   search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/AnnotationDismaxSearch.java
   search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/AnnotationSearch.java
   search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/ArtistDismaxSearch.java
   search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/ArtistSearch.java
   search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/CDStubDismaxSearch.java
   search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/CDStubSearch.java
   search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/FreeDBDismaxSearch.java
   search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/FreeDBSearch.java
   search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/LabelDismaxSearch.java
   search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/LabelSearch.java
   search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/RecordingDismaxSearch.java
   search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/RecordingSearch.java
   search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/ReleaseDismaxSearch.java
   search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/ReleaseGroupDismaxSearch.java
   search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/ReleaseGroupSearch.java
   search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/ReleaseSearch.java
   search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/ResourceType.java
   search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/SearchServer.java
   search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/SearchServerServlet.java
   search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/TagDismaxSearch.java
   search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/TagSearch.java
   search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/TestSearchOnly.java
   search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/WorkDismaxSearch.java
   search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/WorkSearch.java
   search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindAnnotationTest.java
   search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindArtistTest.java
   search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindCDStubTest.java
   search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindFreeDBTest.java
   search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindLabelTest.java
   search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindRecordingTest.java
   search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindReleaseGroupTest.java
   search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindReleaseTest.java
   search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindTagTest.java
   search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindWorkTest.java
   search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/IssueSearch167RecordingTest.java
   search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/IssueSearch167Test.java
   search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/IssueSearch173Test.java
   search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/IssueSearch174Test.java
   search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/RecordingIT.java
   search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/ReloadIndexesTest.java
Log:
SEARCH-239: Search updater doesn't update the index last-updated value returned by SEARCH-232
Change the way DismaxSearchServer is working: it doesn't inherit anymore from SearchServer, but rather it implements the Decorator pattern and use an underlying SearchServer. That way we can guarantee a search server and its equivalent dismax search server are using the same search manager, results writers, ...
Split actual SearchServer into a proper interface, and an abstract class AbstractSearchServer. Introduced AbstractDismaxSearchServer that implements common features of dismax search servers. And get rid of odd search servers constructors.


Modified: search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/AnnotationDismaxSearch.java
===================================================================
--- search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/AnnotationDismaxSearch.java	2012-11-02 18:59:28 UTC (rev 13610)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/AnnotationDismaxSearch.java	2012-11-04 22:29:56 UTC (rev 13611)
@@ -3,37 +3,29 @@
 import java.util.HashMap;
 import java.util.Map;
 
-import org.apache.lucene.queryParser.ParseException;
-import org.apache.lucene.search.Query;
-import org.apache.lucene.search.SearcherManager;
 import org.musicbrainz.search.index.AnnotationIndexField;
 
-public class AnnotationDismaxSearch extends AnnotationSearch {
+public class AnnotationDismaxSearch extends AbstractDismaxSearchServer {
 
-    private DismaxSearcher dismaxSearcher;
+  @Override
+  protected DismaxSearcher initDismaxSearcher() {
+    Map<String, DismaxAlias.AliasField> fieldBoosts = new HashMap<String, DismaxAlias.AliasField>(2);
+    fieldBoosts.put(AnnotationIndexField.NAME.getName(), new DismaxAlias.AliasField(true, 1f));
+    fieldBoosts.put(AnnotationIndexField.TEXT.getName(), new DismaxAlias.AliasField(true, 1f));
+    DismaxAlias dismaxAlias = new DismaxAlias();
+    dismaxAlias.setFields(fieldBoosts);
+    dismaxAlias.setTie(0.1f);
+    return new DismaxSearcher(dismaxAlias);
+  }
 
-    protected void initDismaxSearcher() {
-        Map<String, DismaxAlias.AliasField> fieldBoosts = new HashMap<String, DismaxAlias.AliasField>(2);
-        fieldBoosts.put(AnnotationIndexField.NAME.getName(), new DismaxAlias.AliasField(true, 1f));
-        fieldBoosts.put(AnnotationIndexField.TEXT.getName(), new DismaxAlias.AliasField(true, 1f));
-        DismaxAlias dismaxAlias = new DismaxAlias();
-        dismaxAlias.setFields(fieldBoosts);
-        dismaxAlias.setTie(0.1f);
-        dismaxSearcher = new DismaxSearcher(dismaxAlias);
-    }
+  /**
+   * Standard Search
+   *
+   * @param searcher
+   * @throws Exception
+   */
+  public AnnotationDismaxSearch(AbstractSearchServer searchServer) throws Exception {
+    super(searchServer);
+  }
 
-    /**
-     * Standard Search
-     *
-     * @param searcher
-     * @throws Exception
-     */
-  public AnnotationDismaxSearch(SearcherManager searcherManager) throws Exception {
-    super(searcherManager);
-        initDismaxSearcher();
-    }
-
-    protected Query parseQuery(String userQuery) throws ParseException {
-        return dismaxSearcher.parseQuery(userQuery, analyzer);
-    }
 }

Modified: search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/AnnotationSearch.java
===================================================================
--- search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/AnnotationSearch.java	2012-11-02 18:59:28 UTC (rev 13610)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/AnnotationSearch.java	2012-11-04 22:29:56 UTC (rev 13611)
@@ -13,40 +13,40 @@
 import org.musicbrainz.search.servlet.mmd2.AnnotationWriter;
 
 
-public class AnnotationSearch extends SearchServer {
+public class AnnotationSearch extends AbstractSearchServer {
 
-    protected void setupDefaultFields() {
-        defaultFields = new ArrayList<String>();
-        defaultFields.add(AnnotationIndexField.TEXT.getName());
-    }
+  protected void setupDefaultFields() {
+    defaultFields = new ArrayList<String>();
+    defaultFields.add(AnnotationIndexField.TEXT.getName());
+  }
 
-    private AnnotationSearch() throws Exception {
-        resultsWriter = new AnnotationWriter();
-        mmd1Writer = null;
-        setupDefaultFields();
-        analyzer = DatabaseIndex.getAnalyzer(AnnotationIndexField.class);
-    }
+  private AnnotationSearch() throws Exception {
+    resultsWriter = new AnnotationWriter();
+    mmd1Writer = null;
+    setupDefaultFields();
+    analyzer = DatabaseIndex.getAnalyzer(AnnotationIndexField.class);
+  }
 
-    public AnnotationSearch(SearcherManager searcherManager) throws Exception {
-        this();
-        this.searcherManager = searcherManager;
-        setLastServerUpdatedDate();
-        resultsWriter.setLastServerUpdatedDate(this.getServerLastUpdatedDate());
-    }
+  public AnnotationSearch(SearcherManager searcherManager) throws Exception {
+    this();
+    this.searcherManager = searcherManager;
+    setLastServerUpdatedDate();
+    resultsWriter.setLastServerUpdatedDate(this.getServerLastUpdatedDate());
+  }
 
 
-    @Override
-    protected QueryParser getParser() {
-     return new QueryParser(LuceneVersion.LUCENE_VERSION, defaultFields.get(0), analyzer);
+  @Override
+  public QueryParser getParser() {
+    return new QueryParser(LuceneVersion.LUCENE_VERSION, defaultFields.get(0), analyzer);
   }
 
-    @Override
-    protected  String printExplainHeader(Document doc)
-            throws IOException, ParseException {
-        return doc.get(AnnotationIndexField.ID.getName()) +':'
-                + doc.get(AnnotationIndexField.ENTITY.getName())
-                + '\n';
-    }
+  @Override
+  protected  String printExplainHeader(Document doc)
+      throws IOException, ParseException {
+    return doc.get(AnnotationIndexField.ID.getName()) +':'
+        + doc.get(AnnotationIndexField.ENTITY.getName())
+        + '\n';
+  }
 
 
 }
\ No newline at end of file

Modified: search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/ArtistDismaxSearch.java
===================================================================
--- search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/ArtistDismaxSearch.java	2012-11-02 18:59:28 UTC (rev 13610)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/ArtistDismaxSearch.java	2012-11-04 22:29:56 UTC (rev 13611)
@@ -3,53 +3,31 @@
 import java.util.HashMap;
 import java.util.Map;
 
-import org.apache.lucene.queryParser.ParseException;
-import org.apache.lucene.search.Query;
-import org.apache.lucene.search.SearcherManager;
 import org.musicbrainz.search.index.ArtistIndexField;
 
-public class ArtistDismaxSearch extends ArtistSearch {
+public class ArtistDismaxSearch extends AbstractDismaxSearchServer {
 
-    private DismaxSearcher dismaxSearcher;
+  @Override
+  protected DismaxSearcher initDismaxSearcher() {
+    Map<String, DismaxAlias.AliasField> fieldBoosts = new HashMap<String, DismaxAlias.AliasField>(3);
+    fieldBoosts.put(ArtistIndexField.ARTIST_ACCENT.getName(), new DismaxAlias.AliasField(false, 1.4f));
+    fieldBoosts.put(ArtistIndexField.ARTIST.getName(), new DismaxAlias.AliasField(true, 1.2f));
+    fieldBoosts.put(ArtistIndexField.SORTNAME.getName(), new DismaxAlias.AliasField(true, 1.1f));
+    fieldBoosts.put(ArtistIndexField.ALIAS.getName(), new DismaxAlias.AliasField(true, 0.9f));
+    DismaxAlias dismaxAlias = new DismaxAlias();
+    dismaxAlias.setFields(fieldBoosts);
+    dismaxAlias.setTie(0.1f);
+    return new DismaxSearcher(dismaxAlias);
+  }
 
-    protected void initDismaxSearcher() {
-        Map<String, DismaxAlias.AliasField> fieldBoosts = new HashMap<String, DismaxAlias.AliasField>(3);
-        fieldBoosts.put(ArtistIndexField.ARTIST_ACCENT.getName(), new DismaxAlias.AliasField(false, 1.4f));
-        fieldBoosts.put(ArtistIndexField.ARTIST.getName(), new DismaxAlias.AliasField(true, 1.2f));
-        fieldBoosts.put(ArtistIndexField.SORTNAME.getName(), new DismaxAlias.AliasField(true, 1.1f));
-        fieldBoosts.put(ArtistIndexField.ALIAS.getName(), new DismaxAlias.AliasField(true, 0.9f));
-        DismaxAlias dismaxAlias = new DismaxAlias();
-        dismaxAlias.setFields(fieldBoosts);
-        dismaxAlias.setTie(0.1f);
-        dismaxSearcher = new DismaxSearcher(dismaxAlias);
-    }
+  /**
+   * Standard Search
+   *
+   * @param searcher
+   * @throws Exception
+   */
+  public ArtistDismaxSearch(AbstractSearchServer searchServer) throws Exception {
+    super(searchServer);
+  }
 
-    /**
-     * Standard Search
-     *
-     * @param searcher
-     * @throws Exception
-     */
-    public ArtistDismaxSearch(SearcherManager searcherManager) throws Exception {
-        super(searcherManager);
-        initDismaxSearcher();
-    }
-
-    /**
-     * User By Search All
-     *
-     * @param searcher
-     * @param query
-     * @param offset
-     * @param limit
-     * @throws Exception
-     */
-    public ArtistDismaxSearch(SearcherManager searcherManager, String query, int offset, int limit) throws Exception {
-        super(searcherManager, query, offset, limit);
-        initDismaxSearcher();
-    }
-
-    protected Query parseQuery(String userQuery) throws ParseException {
-        return dismaxSearcher.parseQuery(userQuery, analyzer);
-    }
 }

Modified: search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/ArtistSearch.java
===================================================================
--- search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/ArtistSearch.java	2012-11-02 18:59:28 UTC (rev 13610)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/ArtistSearch.java	2012-11-04 22:29:56 UTC (rev 13611)
@@ -13,64 +13,48 @@
 import org.musicbrainz.search.servlet.mmd2.ArtistWriter;
 
 
-public class ArtistSearch extends SearchServer {
+public class ArtistSearch extends AbstractSearchServer {
 
-    protected void setupDefaultFields() {
-        defaultFields = new ArrayList<String>();
-        defaultFields.add(ArtistIndexField.ARTIST.getName());
-        defaultFields.add(ArtistIndexField.ALIAS.getName());
-        defaultFields.add(ArtistIndexField.SORTNAME.getName());
-    }
+  protected void setupDefaultFields() {
+    defaultFields = new ArrayList<String>();
+    defaultFields.add(ArtistIndexField.ARTIST.getName());
+    defaultFields.add(ArtistIndexField.ALIAS.getName());
+    defaultFields.add(ArtistIndexField.SORTNAME.getName());
+  }
 
 
-    private ArtistSearch() throws Exception {
-        resultsWriter = new ArtistWriter();
-        mmd1Writer = new ArtistMmd1XmlWriter();
-        setupDefaultFields();
-        analyzer = DatabaseIndex.getAnalyzer(ArtistIndexField.class);
-    }
+  private ArtistSearch() throws Exception {
+    resultsWriter = new ArtistWriter();
+    mmd1Writer = new ArtistMmd1XmlWriter();
+    setupDefaultFields();
+    analyzer = DatabaseIndex.getAnalyzer(ArtistIndexField.class);
+  }
 
-    /**
-     * Standard Search
-     *
-     * @param searcher
-     * @throws Exception
-     */
-    public ArtistSearch(SearcherManager searcherManager) throws Exception {
-        this();
-        this.searcherManager = searcherManager;
-        setLastServerUpdatedDate();
-        resultsWriter.setLastServerUpdatedDate(this.getServerLastUpdatedDate());
+  /**
+   * Standard Search
+   *
+   * @param searcher
+   * @throws Exception
+   */
+  public ArtistSearch(SearcherManager searcherManager) throws Exception {
+    this();
+    this.searcherManager = searcherManager;
+    setLastServerUpdatedDate();
+    resultsWriter.setLastServerUpdatedDate(this.getServerLastUpdatedDate());
 
-    }
+  }
 
-    /**
-     * User By Search All
-     *
-     * @param searcher
-     * @param query
-     * @param offset
-     * @param limit
-     * @throws Exception
-     */
-    public ArtistSearch(SearcherManager searcherManager, String query, int offset, int limit) throws Exception {
-        this(searcherManager);
-        this.query=query;
-        this.offset=offset;
-        this.limit=limit;
-    }
+  @Override
+  public QueryParser getParser() {
+    return new ArtistQueryParser(defaultFields.toArray(new String[0]), analyzer);
+  }
 
-      @Override
-    protected QueryParser getParser() {
-       return new ArtistQueryParser(defaultFields.toArray(new String[0]), analyzer);
-    }
+  @Override
+  protected  String printExplainHeader(Document doc)
+      throws IOException, ParseException {
+    return doc.get(ArtistIndexField.ARTIST_ID.getName()) +':'
+        + doc.get(ArtistIndexField.ARTIST.getName())
+        + '\n';
+  }
 
-    @Override
-    protected  String printExplainHeader(Document doc)
-            throws IOException, ParseException {
-        return doc.get(ArtistIndexField.ARTIST_ID.getName()) +':'
-                + doc.get(ArtistIndexField.ARTIST.getName())
-                + '\n';
-    }
-
 }

Modified: search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/CDStubDismaxSearch.java
===================================================================
--- search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/CDStubDismaxSearch.java	2012-11-02 18:59:28 UTC (rev 13610)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/CDStubDismaxSearch.java	2012-11-04 22:29:56 UTC (rev 13611)
@@ -3,53 +3,31 @@
 import java.util.HashMap;
 import java.util.Map;
 
-import org.apache.lucene.queryParser.ParseException;
-import org.apache.lucene.search.Query;
-import org.apache.lucene.search.SearcherManager;
 import org.musicbrainz.search.index.CDStubIndexField;
 
-public class CDStubDismaxSearch extends CDStubSearch {
+public class CDStubDismaxSearch extends AbstractDismaxSearchServer {
 
-    private DismaxSearcher dismaxSearcher;
+  @Override
+  protected DismaxSearcher initDismaxSearcher() {
+    Map<String, DismaxAlias.AliasField> fieldBoosts = new HashMap<String, DismaxAlias.AliasField>(2);
+    fieldBoosts.put(CDStubIndexField.TITLE.getName(), new DismaxAlias.AliasField(true, 1.3f));
+    fieldBoosts.put(CDStubIndexField.ARTIST.getName(), new DismaxAlias.AliasField(true, 1f));
+    fieldBoosts.put(CDStubIndexField.COMMENT.getName(), new DismaxAlias.AliasField(false, 0.8f));
+    fieldBoosts.put(CDStubIndexField.BARCODE.getName(), new DismaxAlias.AliasField(false, 0.8f));
+    DismaxAlias dismaxAlias = new DismaxAlias();
+    dismaxAlias.setFields(fieldBoosts);
+    dismaxAlias.setTie(0.1f);
+    return new DismaxSearcher(dismaxAlias);
+  }
 
-    protected void initDismaxSearcher() {
-        Map<String, DismaxAlias.AliasField> fieldBoosts = new HashMap<String, DismaxAlias.AliasField>(2);
-        fieldBoosts.put(CDStubIndexField.TITLE.getName(), new DismaxAlias.AliasField(true, 1.3f));
-        fieldBoosts.put(CDStubIndexField.ARTIST.getName(), new DismaxAlias.AliasField(true, 1f));
-        fieldBoosts.put(CDStubIndexField.COMMENT.getName(), new DismaxAlias.AliasField(false, 0.8f));
-        fieldBoosts.put(CDStubIndexField.BARCODE.getName(), new DismaxAlias.AliasField(false, 0.8f));
-        DismaxAlias dismaxAlias = new DismaxAlias();
-        dismaxAlias.setFields(fieldBoosts);
-        dismaxAlias.setTie(0.1f);
-        dismaxSearcher = new DismaxSearcher(dismaxAlias);
-    }
+  /**
+   * Standard Search
+   *
+   * @param searcher
+   * @throws Exception
+   */
+  public CDStubDismaxSearch(AbstractSearchServer searchServer) throws Exception {
+    super(searchServer);
+  }
 
-    /**
-     * Standard Search
-     *
-     * @param searcher
-     * @throws Exception
-     */
-  public CDStubDismaxSearch(SearcherManager searcherManager) throws Exception {
-    super(searcherManager);
-        initDismaxSearcher();
-    }
-
-    /**
-     * User By Search All
-     *
-     * @param searcher
-     * @param query
-     * @param offset
-     * @param limit
-     * @throws Exception
-     */
-  public CDStubDismaxSearch(SearcherManager searcherManager, String query, int offset, int limit) throws Exception {
-    super(searcherManager, query, offset, limit);
-        initDismaxSearcher();
-    }
-
-    protected Query parseQuery(String userQuery) throws ParseException {
-        return dismaxSearcher.parseQuery(userQuery, analyzer);
-    }
 }

Modified: search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/CDStubSearch.java
===================================================================
--- search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/CDStubSearch.java	2012-11-02 18:59:28 UTC (rev 13610)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/CDStubSearch.java	2012-11-04 22:29:56 UTC (rev 13611)
@@ -14,47 +14,35 @@
 import org.musicbrainz.search.servlet.mmd2.CDStubWriter;
 
 
-public class CDStubSearch extends SearchServer {
+public class CDStubSearch extends AbstractSearchServer {
 
-    protected void setupDefaultFields() {
-        defaultFields = new ArrayList<String>();
-        defaultFields.add(CDStubIndexField.ARTIST.getName());
-        defaultFields.add(CDStubIndexField.TITLE.getName());
-    }
+  protected void setupDefaultFields() {
+    defaultFields = new ArrayList<String>();
+    defaultFields.add(CDStubIndexField.ARTIST.getName());
+    defaultFields.add(CDStubIndexField.TITLE.getName());
+  }
 
-    private CDStubSearch() throws Exception {
-        resultsWriter = new CDStubWriter();
-        mmd1Writer = null;
-        setupDefaultFields();
-        analyzer = DatabaseIndex.getAnalyzer(CDStubIndexField.class);
-    }
+  public CDStubSearch(SearcherManager searcherManager) throws Exception {
+    resultsWriter = new CDStubWriter();
+    mmd1Writer = null;
+    setupDefaultFields();
+    analyzer = DatabaseIndex.getAnalyzer(CDStubIndexField.class);
+    this.searcherManager = searcherManager;
+    setLastServerUpdatedDate();
+    resultsWriter.setLastServerUpdatedDate(this.getServerLastUpdatedDate());
+  }
 
-    public CDStubSearch(SearcherManager searcherManager) throws Exception {
-        this();
-        this.searcherManager = searcherManager;
-        setLastServerUpdatedDate();
-        resultsWriter.setLastServerUpdatedDate(this.getServerLastUpdatedDate());
-    }
+  @Override
+  public QueryParser getParser() {
+    return new MultiFieldQueryParser(LuceneVersion.LUCENE_VERSION, defaultFields.toArray(new String[0]), analyzer);
+  }
 
-    public CDStubSearch(SearcherManager searcherManager, String query, int offset, int limit) throws Exception {
-            this(searcherManager);
-            this.query=query;
-            this.offset=offset;
-            this.limit=limit;
-
-        }
-
-     @Override
-    protected QueryParser getParser() {
-        return new MultiFieldQueryParser(LuceneVersion.LUCENE_VERSION, defaultFields.toArray(new String[0]), analyzer);
-    }
-
-    @Override
-    protected  String printExplainHeader(Document doc)
-            throws IOException, ParseException {
-        return doc.get(CDStubIndexField.ID.getName()) +':'
-                + doc.get(CDStubIndexField.ARTIST.getName()) + ':'
-                + doc.get(CDStubIndexField.TITLE.getName())
-                + '\n';
-    }
+  @Override
+  protected  String printExplainHeader(Document doc)
+      throws IOException, ParseException {
+    return doc.get(CDStubIndexField.ID.getName()) +':'
+        + doc.get(CDStubIndexField.ARTIST.getName()) + ':'
+        + doc.get(CDStubIndexField.TITLE.getName())
+        + '\n';
+  }
 }

Modified: search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/FreeDBDismaxSearch.java
===================================================================
--- search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/FreeDBDismaxSearch.java	2012-11-02 18:59:28 UTC (rev 13610)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/FreeDBDismaxSearch.java	2012-11-04 22:29:56 UTC (rev 13611)
@@ -32,25 +32,30 @@
 import org.apache.lucene.queryParser.ParseException;
 import org.apache.lucene.queryParser.QueryParser;
 import org.apache.lucene.search.Query;
-import org.apache.lucene.search.SearcherManager;
 
-public class FreeDBDismaxSearch extends FreeDBSearch {
+public class FreeDBDismaxSearch extends AbstractDismaxSearchServer {
 
-    /**
-     * Standard Search
-     *
-     * @param searcher
-     * @throws Exception
-     */
-    public FreeDBDismaxSearch(SearcherManager searcherManager) throws Exception {
-        super(searcherManager);
-    }
+  /**
+   * Standard Search
+   *
+   * @param searcher
+   * @throws Exception
+   */
+  public FreeDBDismaxSearch(AbstractSearchServer searchServer) throws Exception {
+    super(searchServer);
+  }
 
-    protected Query parseQuery(String query) throws ParseException
-    {
-        //Treat all as text
-        query=QueryParser.escape(query);
-        QueryParser parser = getParser();
-        return parser.parse(query);
-    }
+  @Override
+  protected Query parseQuery(String query) throws ParseException
+  {
+    //Treat all as text
+    query=QueryParser.escape(query);
+    QueryParser parser = realSearchServer.getParser();
+    return parser.parse(query);
+  }
+
+  @Override
+  protected DismaxSearcher initDismaxSearcher() {
+    return null;
+  }
 }

Modified: search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/FreeDBSearch.java
===================================================================
--- search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/FreeDBSearch.java	2012-11-02 18:59:28 UTC (rev 13610)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/FreeDBSearch.java	2012-11-04 22:29:56 UTC (rev 13611)
@@ -14,38 +14,38 @@
 import org.musicbrainz.search.servlet.mmd2.FreeDBWriter;
 
 
-public class FreeDBSearch extends SearchServer {
+public class FreeDBSearch extends AbstractSearchServer {
 
-    protected void setupDefaultFields() {
-        defaultFields = new ArrayList<String>();
-        defaultFields.add(FreeDBIndexField.ARTIST.getName());
-        defaultFields.add(FreeDBIndexField.TITLE.getName());
-    }
+  protected void setupDefaultFields() {
+    defaultFields = new ArrayList<String>();
+    defaultFields.add(FreeDBIndexField.ARTIST.getName());
+    defaultFields.add(FreeDBIndexField.TITLE.getName());
+  }
 
-    private FreeDBSearch() throws Exception {
-        resultsWriter = new FreeDBWriter();
-        mmd1Writer = null;
-        setupDefaultFields();
-        analyzer = DatabaseIndex.getAnalyzer(FreeDBIndexField.class);
-    }
+  private FreeDBSearch() throws Exception {
+    resultsWriter = new FreeDBWriter();
+    mmd1Writer = null;
+    setupDefaultFields();
+    analyzer = DatabaseIndex.getAnalyzer(FreeDBIndexField.class);
+  }
 
-    public FreeDBSearch(SearcherManager searcherManager) throws Exception {
-        this();
-        this.searcherManager = searcherManager;
-    }
+  public FreeDBSearch(SearcherManager searcherManager) throws Exception {
+    this();
+    this.searcherManager = searcherManager;
+  }
 
 
-    @Override
-    protected QueryParser getParser() {
-     return new MultiFieldQueryParser(LuceneVersion.LUCENE_VERSION, defaultFields.toArray(new String[0]), analyzer);
+  @Override
+  public QueryParser getParser() {
+    return new MultiFieldQueryParser(LuceneVersion.LUCENE_VERSION, defaultFields.toArray(new String[0]), analyzer);
   }
 
-    @Override
-    protected  String printExplainHeader(Document doc)
-            throws IOException, ParseException {
-        return doc.get(FreeDBIndexField.ARTIST.getName()) +':'
-                + doc.get(FreeDBIndexField.TITLE.getName())
-                + '\n';
-    }
+  @Override
+  protected  String printExplainHeader(Document doc)
+      throws IOException, ParseException {
+    return doc.get(FreeDBIndexField.ARTIST.getName()) +':'
+        + doc.get(FreeDBIndexField.TITLE.getName())
+        + '\n';
+  }
 
 }
\ No newline at end of file

Modified: search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/LabelDismaxSearch.java
===================================================================
--- search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/LabelDismaxSearch.java	2012-11-02 18:59:28 UTC (rev 13610)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/LabelDismaxSearch.java	2012-11-04 22:29:56 UTC (rev 13611)
@@ -32,16 +32,12 @@
 import java.util.HashMap;
 import java.util.Map;
 
-import org.apache.lucene.queryParser.ParseException;
-import org.apache.lucene.search.Query;
-import org.apache.lucene.search.SearcherManager;
 import org.musicbrainz.search.index.LabelIndexField;
 
-public class LabelDismaxSearch extends LabelSearch {
+public class LabelDismaxSearch extends AbstractDismaxSearchServer {
 
-  private DismaxSearcher dismaxSearcher;
-
-  protected void initDismaxSearcher() {
+  @Override
+  protected DismaxSearcher initDismaxSearcher() {
     Map<String, DismaxAlias.AliasField> fieldBoosts = new HashMap<String, DismaxAlias.AliasField>(3);
     fieldBoosts.put(LabelIndexField.LABEL_ACCENT.getName(), new DismaxAlias.AliasField(false, 1.4f));
     fieldBoosts.put(LabelIndexField.LABEL.getName(), new DismaxAlias.AliasField(true, 1.3f));
@@ -50,7 +46,7 @@
     DismaxAlias dismaxAlias = new DismaxAlias();
     dismaxAlias.setFields(fieldBoosts);
     dismaxAlias.setTie(0.1f);
-    dismaxSearcher = new DismaxSearcher(dismaxAlias);
+    return new DismaxSearcher(dismaxAlias);
   }
 
   /**
@@ -59,26 +55,8 @@
    * @param searcher
    * @throws Exception
    */
-  public LabelDismaxSearch(SearcherManager searcherManager) throws Exception {
-    super(searcherManager);
-    initDismaxSearcher();
+  public LabelDismaxSearch(AbstractSearchServer searchServer) throws Exception {
+    super(searchServer);
   }
 
-  /**
-   * User By Search All
-   * 
-   * @param searcher
-   * @param query
-   * @param offset
-   * @param limit
-   * @throws Exception
-   */
-  public LabelDismaxSearch(SearcherManager searcherManager, String query, int offset, int limit) throws Exception {
-    super(searcherManager, query, offset, limit);
-    initDismaxSearcher();
-  }
-
-  protected Query parseQuery(String userQuery) throws ParseException {
-    return dismaxSearcher.parseQuery(userQuery, analyzer);
-  }
 }

Modified: search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/LabelSearch.java
===================================================================
--- search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/LabelSearch.java	2012-11-02 18:59:28 UTC (rev 13610)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/LabelSearch.java	2012-11-04 22:29:56 UTC (rev 13611)
@@ -12,7 +12,7 @@
 import org.musicbrainz.search.servlet.mmd1.LabelMmd1XmlWriter;
 import org.musicbrainz.search.servlet.mmd2.LabelWriter;
 
-public class LabelSearch extends SearchServer {
+public class LabelSearch extends AbstractSearchServer {
 
   protected void setupDefaultFields() {
     defaultFields = new ArrayList<String>();
@@ -35,15 +35,8 @@
     resultsWriter.setLastServerUpdatedDate(this.getServerLastUpdatedDate());
   }
 
-  public LabelSearch(SearcherManager searcherManager, String query, int offset, int limit) throws Exception {
-    this(searcherManager);
-    this.query = query;
-    this.offset = offset;
-    this.limit = limit;
-  }
-
   @Override
-  protected QueryParser getParser() {
+  public QueryParser getParser() {
     return new LabelQueryParser(defaultFields.toArray(new String[0]), analyzer);
   }
 

Modified: search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/RecordingDismaxSearch.java
===================================================================
--- search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/RecordingDismaxSearch.java	2012-11-02 18:59:28 UTC (rev 13610)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/RecordingDismaxSearch.java	2012-11-04 22:29:56 UTC (rev 13611)
@@ -33,16 +33,12 @@
 import java.util.HashMap;
 import java.util.Map;
 
-import org.apache.lucene.queryParser.ParseException;
-import org.apache.lucene.search.Query;
-import org.apache.lucene.search.SearcherManager;
 import org.musicbrainz.search.index.RecordingIndexField;
 
-public class RecordingDismaxSearch extends RecordingSearch {
+public class RecordingDismaxSearch extends AbstractDismaxSearchServer {
 
-  private DismaxSearcher dismaxSearcher;
-
-  protected void initDismaxSearcher() {
+  @Override
+  protected DismaxSearcher initDismaxSearcher() {
     Map<String, DismaxAlias.AliasField> fieldBoosts = new HashMap<String, DismaxAlias.AliasField>(4);
     fieldBoosts.put(RecordingIndexField.RECORDING_ACCENT.getName(), new DismaxAlias.AliasField(false, 1.8f));
     fieldBoosts.put(RecordingIndexField.RECORDING.getName(), new DismaxAlias.AliasField(true, 1.6f));
@@ -52,7 +48,7 @@
     DismaxAlias dismaxAlias = new DismaxAlias();
     dismaxAlias.setFields(fieldBoosts);
     dismaxAlias.setTie(0.1f);
-    dismaxSearcher = new DismaxSearcher(dismaxAlias);
+    return new DismaxSearcher(dismaxAlias);
   }
 
   /**
@@ -61,26 +57,8 @@
    * @param searcher
    * @throws Exception
    */
-  public RecordingDismaxSearch(SearcherManager searcherManager) throws Exception {
-    super(searcherManager);
-    initDismaxSearcher();
+  public RecordingDismaxSearch(AbstractSearchServer searchServer) throws Exception {
+    super(searchServer);
   }
 
-  /**
-   * User By Search All
-   * 
-   * @param searcher
-   * @param query
-   * @param offset
-   * @param limit
-   * @throws Exception
-   */
-  public RecordingDismaxSearch(SearcherManager searcherManager, String query, int offset, int limit) throws Exception {
-    super(searcherManager, query, offset, limit);
-    initDismaxSearcher();
-  }
-
-  protected Query parseQuery(String userQuery) throws ParseException {
-    return dismaxSearcher.parseQuery(userQuery, analyzer);
-  }
 }

Modified: search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/RecordingSearch.java
===================================================================
--- search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/RecordingSearch.java	2012-11-02 18:59:28 UTC (rev 13610)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/RecordingSearch.java	2012-11-04 22:29:56 UTC (rev 13611)
@@ -13,7 +13,7 @@
 import org.musicbrainz.search.servlet.mmd2.RecordingWriter;
 
 
-public class RecordingSearch extends SearchServer {
+public class RecordingSearch extends AbstractSearchServer {
 
   protected void setupDefaultFields() {
     defaultFields = new ArrayList<String>();
@@ -35,15 +35,8 @@
     resultsWriter.setLastServerUpdatedDate(this.getServerLastUpdatedDate());
   }
 
-  public RecordingSearch(SearcherManager searcherManager, String query, int offset, int limit) throws Exception {
-    this(searcherManager);
-    this.query = query;
-    this.offset = offset;
-    this.limit = limit;
-  }
-
   @Override
-  protected QueryParser getParser() {
+  public QueryParser getParser() {
     return new RecordingQueryParser(defaultFields.toArray(new String[0]), analyzer);
   }
 

Modified: search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/ReleaseDismaxSearch.java
===================================================================
--- search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/ReleaseDismaxSearch.java	2012-11-02 18:59:28 UTC (rev 13610)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/ReleaseDismaxSearch.java	2012-11-04 22:29:56 UTC (rev 13611)
@@ -32,16 +32,12 @@
 import java.util.HashMap;
 import java.util.Map;
 
-import org.apache.lucene.queryParser.ParseException;
-import org.apache.lucene.search.Query;
-import org.apache.lucene.search.SearcherManager;
 import org.musicbrainz.search.index.ReleaseIndexField;
 
-public class ReleaseDismaxSearch extends ReleaseSearch {
+public class ReleaseDismaxSearch extends AbstractDismaxSearchServer {
 
-  private DismaxSearcher dismaxSearcher;
-
-  protected void initDismaxSearcher() {
+  @Override
+  protected DismaxSearcher initDismaxSearcher() {
     Map<String, DismaxAlias.AliasField> fieldBoosts = new HashMap<String, DismaxAlias.AliasField>(6);
     fieldBoosts.put(ReleaseIndexField.RELEASE_ACCENT.getName(), new DismaxAlias.AliasField(false, 1.4f));
     fieldBoosts.put(ReleaseIndexField.RELEASE.getName(), new DismaxAlias.AliasField(true, 1.2f));
@@ -54,7 +50,7 @@
     DismaxAlias dismaxAlias = new DismaxAlias();
     dismaxAlias.setFields(fieldBoosts);
     dismaxAlias.setTie(0.1f);
-    dismaxSearcher = new ReleaseDismaxSearcher(dismaxAlias);
+    return new ReleaseDismaxSearcher(dismaxAlias);
   }
 
   /**
@@ -63,27 +59,8 @@
    * @param searcher
    * @throws Exception
    */
-  public ReleaseDismaxSearch(SearcherManager searcherManager) throws Exception {
-    super(searcherManager);
-    initDismaxSearcher();
+  public ReleaseDismaxSearch(AbstractSearchServer searchServer) throws Exception {
+    super(searchServer);
   }
 
-  /**
-   * User By Search All
-   * 
-   * @param searcher
-   * @param query
-   * @param offset
-   * @param limit
-   * @throws Exception
-   */
-  public ReleaseDismaxSearch(SearcherManager searcherManager, String query, int offset, int limit) throws Exception {
-    super(searcherManager, query, offset, limit);
-    initDismaxSearcher();
-  }
-
-  @Override
-  protected Query parseQuery(String userQuery) throws ParseException {
-    return dismaxSearcher.parseQuery(userQuery, analyzer);
-  }
 }

Modified: search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/ReleaseGroupDismaxSearch.java
===================================================================
--- search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/ReleaseGroupDismaxSearch.java	2012-11-02 18:59:28 UTC (rev 13610)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/ReleaseGroupDismaxSearch.java	2012-11-04 22:29:56 UTC (rev 13611)
@@ -32,17 +32,13 @@
 import java.util.HashMap;
 import java.util.Map;
 
-import org.apache.lucene.queryParser.ParseException;
-import org.apache.lucene.search.Query;
-import org.apache.lucene.search.SearcherManager;
 import org.musicbrainz.search.index.ReleaseGroupIndexField;
 
-public class ReleaseGroupDismaxSearch extends ReleaseGroupSearch {
+public class ReleaseGroupDismaxSearch extends AbstractDismaxSearchServer {
 
-  private DismaxSearcher dismaxSearcher;
+  @Override
+  protected DismaxSearcher initDismaxSearcher() {
 
-  protected void initDismaxSearcher() {
-
     Map<String, DismaxAlias.AliasField> fieldBoosts = new HashMap<String, DismaxAlias.AliasField>(4);
     fieldBoosts.put(ReleaseGroupIndexField.RELEASEGROUP_ACCENT.getName(), new DismaxAlias.AliasField(false, 1.6f));
     fieldBoosts.put(ReleaseGroupIndexField.RELEASEGROUP.getName(), new DismaxAlias.AliasField(true, 1.4f));
@@ -52,7 +48,7 @@
     DismaxAlias dismaxAlias = new DismaxAlias();
     dismaxAlias.setFields(fieldBoosts);
     dismaxAlias.setTie(0.1f);
-    dismaxSearcher = new DismaxSearcher(dismaxAlias);
+    return new DismaxSearcher(dismaxAlias);
   }
 
   /**
@@ -61,27 +57,8 @@
    * @param searcher
    * @throws Exception
    */
-  public ReleaseGroupDismaxSearch(SearcherManager searcherManager) throws Exception {
-    super(searcherManager);
-    initDismaxSearcher();
+  public ReleaseGroupDismaxSearch(AbstractSearchServer searchServer) throws Exception {
+    super(searchServer);
   }
 
-  /**
-   * User By Search All
-   * 
-   * @param searcher
-   * @param query
-   * @param offset
-   * @param limit
-   * @throws Exception
-   */
-  public ReleaseGroupDismaxSearch(SearcherManager searcherManager, String query, int offset, int limit)
-      throws Exception {
-    super(searcherManager, query, offset, limit);
-    initDismaxSearcher();
-  }
-
-  protected Query parseQuery(String userQuery) throws ParseException {
-    return dismaxSearcher.parseQuery(userQuery, analyzer);
-  }
 }

Modified: search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/ReleaseGroupSearch.java
===================================================================
--- search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/ReleaseGroupSearch.java	2012-11-02 18:59:28 UTC (rev 13610)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/ReleaseGroupSearch.java	2012-11-04 22:29:56 UTC (rev 13611)
@@ -12,7 +12,7 @@
 import org.musicbrainz.search.servlet.mmd1.ReleaseGroupMmd1XmlWriter;
 import org.musicbrainz.search.servlet.mmd2.ReleaseGroupWriter;
 
-public class ReleaseGroupSearch extends SearchServer {
+public class ReleaseGroupSearch extends AbstractSearchServer {
 
   protected void setupDefaultFields() {
     defaultFields = new ArrayList<String>();
@@ -34,15 +34,8 @@
     resultsWriter.setLastServerUpdatedDate(this.getServerLastUpdatedDate());
   }
 
-  public ReleaseGroupSearch(SearcherManager searcherManager, String query, int offset, int limit) throws Exception {
-    this(searcherManager);
-    this.query = query;
-    this.offset = offset;
-    this.limit = limit;
-  }
-
   @Override
-  protected QueryParser getParser() {
+  public QueryParser getParser() {
     return new ReleaseGroupQueryParser(defaultFields.toArray(new String[0]), analyzer);
   }
 

Modified: search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/ReleaseSearch.java
===================================================================
--- search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/ReleaseSearch.java	2012-11-02 18:59:28 UTC (rev 13610)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/ReleaseSearch.java	2012-11-04 22:29:56 UTC (rev 13611)
@@ -12,7 +12,7 @@
 import org.musicbrainz.search.servlet.mmd1.ReleaseMmd1XmlWriter;
 import org.musicbrainz.search.servlet.mmd2.ReleaseWriter;
 
-public class ReleaseSearch extends SearchServer {
+public class ReleaseSearch extends AbstractSearchServer {
 
   protected void setupDefaultFields() {
     defaultFields = new ArrayList<String>();
@@ -34,15 +34,8 @@
     resultsWriter.setLastServerUpdatedDate(this.getServerLastUpdatedDate());
   }
 
-  public ReleaseSearch(SearcherManager searcherManager, String query, int offset, int limit) throws Exception {
-    this(searcherManager);
-    this.query = query;
-    this.offset = offset;
-    this.limit = limit;
-  }
-
   @Override
-  protected QueryParser getParser() {
+  public QueryParser getParser() {
     return new ReleaseQueryParser(defaultFields.toArray(new String[0]), analyzer);
   }
 

Modified: search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/ResourceType.java
===================================================================
--- search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/ResourceType.java	2012-11-02 18:59:28 UTC (rev 13610)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/ResourceType.java	2012-11-04 22:29:56 UTC (rev 13611)
@@ -34,8 +34,8 @@
 
   private String name;
   private String indexName = null;
-  private Class<SearchServer> searchServerClass;
-  private Class<SearchServer> dismaxSearchServerClass;
+  private Class<AbstractSearchServer> searchServerClass;
+  private Class<AbstractDismaxSearchServer> dismaxSearchServerClass;
   private Class<Similarity> similarityClass = null;
   private boolean isUsedBySearchAll;
 
@@ -70,11 +70,11 @@
     return indexName;
   }
 
-  public Class<SearchServer> getSearchServerClass() {
+  public Class<AbstractSearchServer> getSearchServerClass() {
     return searchServerClass;
   }
 
-  public Class<SearchServer> getDismaxSearchServerClass() {
+  public Class<AbstractDismaxSearchServer> getDismaxSearchServerClass() {
     return dismaxSearchServerClass;
   }
 

Modified: search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/SearchServer.java
===================================================================
--- search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/SearchServer.java	2012-11-02 18:59:28 UTC (rev 13610)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/SearchServer.java	2012-11-04 22:29:56 UTC (rev 13611)
@@ -1,166 +1,18 @@
-/* Copyright (c) 2009 Lukas Lalinsky
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the MusicBrainz project nor the names of the
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
 package org.musicbrainz.search.servlet;
 
 import java.io.IOException;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.List;
-import java.util.Locale;
-import java.util.TimeZone;
-import java.util.concurrent.Callable;
-import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.lucene.analysis.Analyzer;
-import org.apache.lucene.document.Document;
 import org.apache.lucene.index.CorruptIndexException;
-import org.apache.lucene.index.Term;
 import org.apache.lucene.queryParser.ParseException;
-import org.apache.lucene.queryParser.QueryParser;
-import org.apache.lucene.search.IndexSearcher;
 import org.apache.lucene.search.Query;
-import org.apache.lucene.search.ScoreDoc;
 import org.apache.lucene.search.SearcherManager;
-import org.apache.lucene.search.TermQuery;
-import org.apache.lucene.search.TopDocs;
-import org.apache.lucene.util.NumericUtils;
-import org.musicbrainz.search.MbDocument;
-import org.musicbrainz.search.index.MetaIndexField;
-import org.musicbrainz.search.servlet.mmd1.Mmd1XmlWriter;
-import org.musicbrainz.search.servlet.mmd2.ResultsWriter;
 
-public abstract class SearchServer implements Callable<Results> {
+public interface SearchServer {
 
-  protected String query;
-  protected int offset;
-  protected int limit;
+  public abstract org.musicbrainz.search.servlet.ResultsWriter getWriter(String version);
 
-  protected Analyzer analyzer;
-  protected ResultsWriter resultsWriter;
-  protected Mmd1XmlWriter mmd1Writer;
-  protected List<String> defaultFields;
-  protected SearcherManager searcherManager;
-  protected Date serverLastUpdatedDate;
-  protected SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm zz", Locale.US);
-  protected AtomicInteger searchCount = new AtomicInteger();
-
-  protected SearchServer() {
-  }
-
   /**
-   * Set the last updated date by getting the value from the index, then for efficiency convert to a format suitable for
-   * use in output html
-   * 
-   * @throws IOException
-   */
-  protected void setLastServerUpdatedDate() throws IOException {
-
-    if (searcherManager == null) {
-      return;
-    }
-
-    // Is not a disaster if missing so just log and carry on
-    IndexSearcher searcher = searcherManager.acquire();
-    try {
-      Term term = new Term(MetaIndexField.META.getName(), MetaIndexField.META_VALUE);
-      TermQuery query = new TermQuery(term);
-      TopDocs hits = searcher.search(query, 10);
-
-      if (hits.scoreDocs.length == 0) {
-        System.out.println("No matches in the index for the meta document.");
-        return;
-      } else if (hits.scoreDocs.length > 1) {
-        System.out.println("More than one meta document was found in the index.");
-        return;
-      }
-
-      int docId = hits.scoreDocs[0].doc;
-      MbDocument doc = new MbDocument(searcher.doc(docId));
-      serverLastUpdatedDate = new Date(NumericUtils.prefixCodedToLong(doc.get(MetaIndexField.LAST_UPDATED)));
-      dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
-    } catch (Exception e) {
-      System.out.println(e);
-    } finally {
-      searcherManager.release(searcher);
-    }
-  }
-
-  public Date getServerLastUpdatedDate() {
-    return serverLastUpdatedDate;
-  }
-
-  public void reloadIndex() throws CorruptIndexException, IOException {
-    if (searcherManager != null) {
-      // Try to refresh
-      searcherManager.maybeRefresh();
-      // Update last update date
-      this.setLastServerUpdatedDate();
-      resultsWriter.setLastServerUpdatedDate(this.getServerLastUpdatedDate());
-    }
-  }
-
-  public void close() throws IOException {
-  }
-
-  public org.musicbrainz.search.servlet.mmd2.ResultsWriter getMmd2Writer() {
-    return resultsWriter;
-  }
-
-  public Mmd1XmlWriter getMmd1Writer() {
-    return mmd1Writer;
-  }
-
-  public List<String> getSearchFields() {
-    return defaultFields;
-  }
-
-  public org.musicbrainz.search.servlet.ResultsWriter getWriter(String version) {
-    if (SearchServerServlet.WS_VERSION_1.equals(version)) {
-      return getMmd1Writer();
-    } else {
-      return getMmd2Writer();
-    }
-  }
-
-  /**
-   * Use this for All Searches run on an Executor
-   * 
-   * @return
-   * @throws IOException
-   * @throws ParseException
-   */
-  @Override
-  public Results call() throws IOException, ParseException {
-    return search(query, offset, limit);
-  }
-
-  /**
    * Process query from Mbserver before sending to lucene searcher, returning between results from offset upto limit
    * 
    * @param query
@@ -170,85 +22,21 @@
    * @throws IOException
    * @throws ParseException
    */
-  public Results search(String query, int offset, int limit) throws IOException, ParseException {
+  public abstract Results search(String query, int offset, int limit) throws IOException, ParseException;
 
-    return searchLucene(query, offset, limit);
-  }
-
   /**
-   * Parse and search lucene query, returning between results from offset up to limit
+   * Process query from Mbserver before sending to lucene searcher, returning between results from offset upto limit
    * 
    * @param query
    * @param offset
    * @param limit
    * @return
    * @throws IOException
-   * @throws ParseException if the query was invalid
-   */
-  public Results searchLucene(String query, int offset, int limit) throws IOException, ParseException {
-
-    IndexSearcher searcher = searcherManager.acquire();
-    try {
-      TopDocs topdocs = searcher.search(parseQuery(query), offset + limit);
-      searchCount.incrementAndGet();
-      return processResults(searcher, topdocs, offset);
-    } finally {
-      searcherManager.release(searcher);
-    }
-  }
-
-  /**
-   * Parse the query
-   * 
-   * @param query
-   * @return
    * @throws ParseException
    */
-  protected Query parseQuery(String query) throws ParseException {
-    QueryParser parser = getParser();
-    return parser.parse(query);
-  }
+  public abstract Results search(Query query, int offset, int limit) throws IOException, ParseException;
 
   /**
-   * @return count of searches done on this index since servlet started
-   */
-  public String getCount() {
-    return searchCount.toString();
-  }
-
-  /**
-   * Get Query Parser for parsing queries for this resourceType , QueryParser is not thread safe so always get a new
-   * instance;
-   * 
-   * @return
-   */
-  protected abstract QueryParser getParser();
-
-  /**
-   * Process results of search
-   * 
-   * @param searcher
-   * @param topDocs
-   * @param offset
-   * @return
-   * @throws IOException
-   */
-  private Results processResults(IndexSearcher searcher, TopDocs topDocs, int offset) throws IOException {
-    Results results = new Results();
-    results.offset = offset;
-    results.totalHits = topDocs.totalHits;
-    ScoreDoc docs[] = topDocs.scoreDocs;
-    float maxScore = topDocs.getMaxScore();
-    for (int i = offset; i < docs.length; i++) {
-      Result result = new Result();
-      result.score = docs[i].score / maxScore;
-      result.doc = new MbDocument(searcher.doc(docs[i].doc));
-      results.results.add(result);
-    }
-    return results;
-  }
-
-  /**
    * Explain the results This method is for debugging and to allow end users to understand why their query is not
    * returning the results they expected so they can refine their query
    * 
@@ -259,59 +47,16 @@
    * @throws IOException
    * @throws ParseException
    */
-  public String explain(String query, int offset, int limit) throws IOException, ParseException {
-    StringBuffer sb = new StringBuffer("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n");
-    sb.append("<html lang=\"en\">\n<head>\n");
-    sb.append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n");
-    sb.append("</head>\n<body>");
-    IndexSearcher searcher = searcherManager.acquire();
-    try {
-      Query parsedQuery = parseQuery(query);
-      TopDocs topdocs = searcher.search(parsedQuery, offset + limit);
-      ScoreDoc docs[] = topdocs.scoreDocs;
-      float maxScore = topdocs.getMaxScore();
-      sb.append("<p>Query:" + parsedQuery.toString() + "</p>\n");
-      for (int i = 0; i < docs.length; i++) {
-        explainAndDisplayResult(i, sb, searcher, parsedQuery, docs[i], maxScore);
-      }
-      searchCount.incrementAndGet();
-    } finally {
-      searcherManager.release(searcher);
-    }
-    sb.append("</body>\n</html>");
-    return sb.toString();
-  }
+  public abstract String explain(String query, int offset, int limit) throws IOException, ParseException;
 
-  /**
-   * Output the Explain for the document
-   * 
-   * @param sb
-   * @param searcher
-   * @param query
-   * @param scoreDoc
-   * @throws IOException
-   * @throws ParseException
-   */
-  protected void explainAndDisplayResult(int i, StringBuffer sb, IndexSearcher searcher, Query query,
-      ScoreDoc scoreDoc, float maxScore) throws IOException, ParseException {
-    sb.append("<p>" + i + ":Score:" + (scoreDoc.score / maxScore) * 100 + "</p>\n");
-    sb.append(printExplainHeader(searcher.doc(scoreDoc.doc)));
-    sb.append(searcher.explain(query, scoreDoc.doc).toHtml());
+  public abstract SearcherManager getSearcherManager();
 
-  }
+  public Analyzer getAnalyzer();
 
-  /**
-   * Print details about the matching document, override to give resource type specific information
-   * 
-   * @param doc
-   * @return
-   * @throws IOException
-   * @throws ParseException
-   */
-  protected abstract String printExplainHeader(Document doc) throws IOException, ParseException;
+  public abstract String getCount();
 
-  public SearcherManager getSearcherManager() {
-    return searcherManager;
-  }
+  public abstract void close() throws IOException;
 
-}
+  public abstract void reloadIndex() throws CorruptIndexException, IOException;
+
+}
\ No newline at end of file

Modified: search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/SearchServerServlet.java
===================================================================
--- search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/SearchServerServlet.java	2012-11-02 18:59:28 UTC (rev 13610)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/SearchServerServlet.java	2012-11-04 22:29:56 UTC (rev 13611)
@@ -38,8 +38,11 @@
 import java.util.Collection;
 import java.util.EnumMap;
 import java.util.Enumeration;
+import java.util.List;
+import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -130,16 +133,15 @@
       File indexFileDir = new File(indexDir + System.getProperty("file.separator") + resourceType.getIndexName()
           + "_index");
 
-      SearchServer searchServer = null;
-      SearchServer dismaxSearchServer = null;
+      AbstractSearchServer searchServer = null;
+      AbstractDismaxSearchServer dismaxSearchServer = null;
 
       try {
         Directory directory = useMMapDirectory ? new MMapDirectory(indexFileDir) : new NIOFSDirectory(indexFileDir);
         SearcherManager searcherManager = new SearcherManager(directory, new MusicBrainzSearcherFactory(resourceType));
-        searchServer = resourceType.getSearchServerClass().getConstructor(SearcherManager.class)
-            .newInstance(searcherManager);
-        dismaxSearchServer = resourceType.getDismaxSearchServerClass().getConstructor(SearcherManager.class)
-            .newInstance(searcherManager);
+        searchServer = resourceType.getSearchServerClass().getConstructor(SearcherManager.class).newInstance(searcherManager);
+        dismaxSearchServer = resourceType.getDismaxSearchServerClass().getConstructor(AbstractSearchServer.class)
+            .newInstance(searchServer);
 
       } catch (CorruptIndexException e) {
         log.warning("Could not load " + resourceType.getIndexName() + " index, index is corrupted: " + e.getMessage());
@@ -556,32 +558,29 @@
   private void doAllSearch(HttpServletResponse response, String query, boolean isDismax, Integer offset, Integer limit,
       String responseFormat, boolean isPretty) throws Exception {
 
-    SearchServer artistSearch = searchers.get(ResourceType.ARTIST);
-    SearchServer releaseSearch = searchers.get(ResourceType.RELEASE);
-    SearchServer releaseGroupSearch = searchers.get(ResourceType.RELEASE_GROUP);
-    SearchServer labelSearch = searchers.get(ResourceType.LABEL);
-    SearchServer recordingSearch = searchers.get(ResourceType.RECORDING);
-    SearchServer workSearch = searchers.get(ResourceType.WORK);
+    SearchServer artistSearch = isDismax ? dismaxSearchers.get(ResourceType.ARTIST) : searchers
+        .get(ResourceType.ARTIST);
+    SearchServer releaseSearch = isDismax ? dismaxSearchers.get(ResourceType.RELEASE) : searchers
+        .get(ResourceType.RELEASE);
+    SearchServer releaseGroupSearch = isDismax ? dismaxSearchers.get(ResourceType.RELEASE_GROUP) : searchers
+        .get(ResourceType.RELEASE_GROUP);
+    SearchServer labelSearch = isDismax ? dismaxSearchers.get(ResourceType.LABEL) : searchers
+        .get(ResourceType.LABEL);
+    SearchServer recordingSearch = isDismax ? dismaxSearchers.get(ResourceType.RECORDING) : searchers
+        .get(ResourceType.RECORDING);
+    SearchServer workSearch = isDismax ? dismaxSearchers.get(ResourceType.WORK) : searchers
+        .get(ResourceType.WORK);
 
-    Collection<SearchServer> searches = new ArrayList<SearchServer>();
-    if (isDismax) {
-      searches.add(new ArtistDismaxSearch(artistSearch.getSearcherManager(), query, offset, limit));
-      searches.add(new ReleaseDismaxSearch(releaseSearch.getSearcherManager(), query, offset, limit));
-      searches.add(new ReleaseGroupDismaxSearch(releaseGroupSearch.getSearcherManager(), query, offset, limit));
-      searches.add(new LabelDismaxSearch(labelSearch.getSearcherManager(), query, offset, limit));
-      searches.add(new RecordingDismaxSearch(recordingSearch.getSearcherManager(), query, offset, limit));
-      searches.add(new WorkDismaxSearch(workSearch.getSearcherManager(), query, offset, limit));
-    } else {
-      searches.add(new ArtistSearch(artistSearch.getSearcherManager(), query, offset, limit));
-      searches.add(new ReleaseSearch(releaseSearch.getSearcherManager(), query, offset, limit));
-      searches.add(new ReleaseGroupSearch(releaseGroupSearch.getSearcherManager(), query, offset, limit));
-      searches.add(new LabelSearch(labelSearch.getSearcherManager(), query, offset, limit));
-      searches.add(new RecordingSearch(recordingSearch.getSearcherManager(), query, offset, limit));
-      searches.add(new WorkSearch(workSearch.getSearcherManager(), query, offset, limit));
-    }
+    Collection<Callable<Results>> searches = new ArrayList<Callable<Results>>();
+    searches.add(new CallableSearch(artistSearch, query, offset, limit));
+    searches.add(new CallableSearch(releaseSearch, query, offset, limit));
+    searches.add(new CallableSearch(releaseGroupSearch, query, offset, limit));
+    searches.add(new CallableSearch(labelSearch, query, offset, limit));
+    searches.add(new CallableSearch(recordingSearch, query, offset, limit));
+    searches.add(new CallableSearch(workSearch, query, offset, limit));
 
     // Run each search in parallel then merge results
-    java.util.List<java.util.concurrent.Future<Results>> results = es.invokeAll(searches);
+    List<Future<Results>> results = es.invokeAll(searches);
     Results allResults = new Results();
     // Results are returned in same order as they were submitted
     Results artistResults = results.get(0).get();
@@ -609,4 +608,26 @@
     writer.write(out, allResults, responseFormat, isPretty);
     out.close();
   }
+
+  // Used by doAllSearch()
+  class CallableSearch implements Callable<Results> {
+
+    private final SearchServer searchServer;
+    private final String query;
+    private final Integer offset;
+    private final Integer limit;
+
+    public CallableSearch(SearchServer searchServer, String query, Integer offset, Integer limit) {
+      this.searchServer = searchServer;
+      this.query = query;
+      this.offset = offset;
+      this.limit = limit;
+    }
+
+    @Override
+    public Results call() throws Exception {
+      return searchServer.search(query, offset, limit);
+    }
+
+  }
 }

Modified: search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/TagDismaxSearch.java
===================================================================
--- search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/TagDismaxSearch.java	2012-11-02 18:59:28 UTC (rev 13610)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/TagDismaxSearch.java	2012-11-04 22:29:56 UTC (rev 13611)
@@ -32,9 +32,8 @@
 import org.apache.lucene.queryParser.ParseException;
 import org.apache.lucene.queryParser.QueryParser;
 import org.apache.lucene.search.Query;
-import org.apache.lucene.search.SearcherManager;
 
-public class TagDismaxSearch extends TagSearch {
+public class TagDismaxSearch extends AbstractDismaxSearchServer {
 
   /**
    * Standard Search
@@ -42,15 +41,20 @@
    * @param searcher
    * @throws Exception
    */
-  public TagDismaxSearch(SearcherManager searcherManager) throws Exception {
-    super(searcherManager);
+  public TagDismaxSearch(AbstractSearchServer searchServer) throws Exception {
+    super(searchServer);
   }
 
   @Override
   protected Query parseQuery(String query) throws ParseException {
     // Treat all as text
     query = QueryParser.escape(query);
-    QueryParser parser = getParser();
+    QueryParser parser = realSearchServer.getParser();
     return parser.parse(query);
   }
+
+  @Override
+  protected DismaxSearcher initDismaxSearcher() {
+    return null;
+  }
 }

Modified: search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/TagSearch.java
===================================================================
--- search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/TagSearch.java	2012-11-02 18:59:28 UTC (rev 13610)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/TagSearch.java	2012-11-04 22:29:56 UTC (rev 13611)
@@ -11,7 +11,7 @@
 import org.musicbrainz.search.index.TagIndexField;
 import org.musicbrainz.search.servlet.mmd2.TagWriter;
 
-public class TagSearch extends SearchServer {
+public class TagSearch extends AbstractSearchServer {
 
   protected void setupDefaultFields() {
     defaultFields = new ArrayList<String>();
@@ -40,7 +40,7 @@
   }
 
   @Override
-  protected QueryParser getParser() {
+  public QueryParser getParser() {
     return new TagQueryParser(defaultFields.get(0), analyzer);
   }
 

Modified: search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/TestSearchOnly.java
===================================================================
--- search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/TestSearchOnly.java	2012-11-02 18:59:28 UTC (rev 13610)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/TestSearchOnly.java	2012-11-04 22:29:56 UTC (rev 13611)
@@ -68,7 +68,7 @@
     final static int MAX_MATCHES_LIMIT = 100;
 
     final static String CHARSET = "UTF-8";
-    private static EnumMap<ResourceType, SearchServer> searchers = new EnumMap<ResourceType, SearchServer>(ResourceType.class);
+    private static EnumMap<ResourceType, AbstractSearchServer> searchers = new EnumMap<ResourceType, AbstractSearchServer>(ResourceType.class);
     private String initMessage = null;
     static long totalQueryTime = 0;
     static Map<URL, Integer> map = new LinkedHashMap<URL, Integer>();
@@ -105,7 +105,7 @@
 
             File indexFileDir = new File(indexDir + System.getProperty("file.separator") + resourceType.getIndexName() + "_index");
 
-            SearchServer searchServer = null;
+            AbstractSearchServer searchServer = null;
             try {
 
                 Directory directory = useMMapDirectory ? new MMapDirectory(indexFileDir) : new NIOFSDirectory(indexFileDir);

Modified: search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/WorkDismaxSearch.java
===================================================================
--- search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/WorkDismaxSearch.java	2012-11-02 18:59:28 UTC (rev 13610)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/WorkDismaxSearch.java	2012-11-04 22:29:56 UTC (rev 13611)
@@ -32,52 +32,23 @@
 import java.util.HashMap;
 import java.util.Map;
 
-import org.apache.lucene.queryParser.ParseException;
-import org.apache.lucene.search.Query;
-import org.apache.lucene.search.SearcherManager;
 import org.musicbrainz.search.index.WorkIndexField;
 
-public class WorkDismaxSearch extends WorkSearch {
+public class WorkDismaxSearch extends AbstractDismaxSearchServer {
 
-  private DismaxSearcher dismaxSearcher;
-
-  protected void initDismaxSearcher() {
+  @Override
+  protected DismaxSearcher initDismaxSearcher() {
     Map<String, DismaxAlias.AliasField> fieldBoosts = new HashMap<String, DismaxAlias.AliasField>(2);
     fieldBoosts.put(WorkIndexField.WORK.getName(), new DismaxAlias.AliasField(true, 1.3f));
     fieldBoosts.put(WorkIndexField.ALIAS.getName(), new DismaxAlias.AliasField(true, 0.9f));
     DismaxAlias dismaxAlias = new DismaxAlias();
     dismaxAlias.setFields(fieldBoosts);
     dismaxAlias.setTie(0.1f);
-    dismaxSearcher = new DismaxSearcher(dismaxAlias);
+    return new DismaxSearcher(dismaxAlias);
   }
 
-  /**
-   * Standard Search
-   * 
-   * @param searcher
-   * @throws Exception
-   */
-  public WorkDismaxSearch(SearcherManager searcherManager) throws Exception {
-    super(searcherManager);
-    initDismaxSearcher();
+  public WorkDismaxSearch(AbstractSearchServer searchServer) {
+    super(searchServer);
   }
 
-  /**
-   * User By Search All
-   * 
-   * @param searcher
-   * @param query
-   * @param offset
-   * @param limit
-   * @throws Exception
-   */
-  public WorkDismaxSearch(SearcherManager searcherManager, String query, int offset, int limit) throws Exception {
-    super(searcherManager, query, offset, limit);
-    initDismaxSearcher();
-  }
-
-  @Override
-  protected Query parseQuery(String userQuery) throws ParseException {
-    return dismaxSearcher.parseQuery(userQuery, analyzer);
-  }
 }

Modified: search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/WorkSearch.java
===================================================================
--- search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/WorkSearch.java	2012-11-02 18:59:28 UTC (rev 13610)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/WorkSearch.java	2012-11-04 22:29:56 UTC (rev 13611)
@@ -12,45 +12,38 @@
 import org.musicbrainz.search.servlet.mmd2.WorkWriter;
 
 
-public class WorkSearch extends SearchServer {
+public class WorkSearch extends AbstractSearchServer {
 
-    protected void setupDefaultFields() {
-        defaultFields = new ArrayList<String>();
-        defaultFields.add(WorkIndexField.WORK.getName());
-        defaultFields.add(WorkIndexField.ALIAS.getName());
-    }
+  protected void setupDefaultFields() {
+    defaultFields = new ArrayList<String>();
+    defaultFields.add(WorkIndexField.WORK.getName());
+    defaultFields.add(WorkIndexField.ALIAS.getName());
+  }
 
-    public WorkSearch() throws Exception {
-        resultsWriter = new WorkWriter();
-        setupDefaultFields();
-        analyzer = DatabaseIndex.getAnalyzer(WorkIndexField.class);
-    }
+  public WorkSearch() throws Exception {
+    resultsWriter = new WorkWriter();
+    setupDefaultFields();
+    analyzer = DatabaseIndex.getAnalyzer(WorkIndexField.class);
+  }
 
-    public WorkSearch(SearcherManager searcherManager) throws Exception {
-        this();
-        this.searcherManager = searcherManager;
-        setLastServerUpdatedDate();
-        resultsWriter.setLastServerUpdatedDate(this.getServerLastUpdatedDate());
-    }
+  public WorkSearch(SearcherManager searcherManager) throws Exception {
+    this();
+    this.searcherManager = searcherManager;
+    setLastServerUpdatedDate();
+    resultsWriter.setLastServerUpdatedDate(this.getServerLastUpdatedDate());
+  }
 
-    public WorkSearch(SearcherManager searcherManager, String query, int offset, int limit) throws Exception {
-        this(searcherManager);
-        this.query=query;
-        this.offset=offset;
-        this.limit=limit;
-    }
+  @Override
+  public QueryParser getParser() {
+    return new WorkQueryParser(defaultFields.toArray(new String[0]), analyzer);
+  }
 
-     @Override
-    protected QueryParser getParser() {
-       return new WorkQueryParser(defaultFields.toArray(new String[0]), analyzer);
-    }
+  @Override
+  protected  String printExplainHeader(Document doc)
+      throws IOException, ParseException {
+    return doc.get(WorkIndexField.WORK_ID.getName()) +':'
+        + doc.get(WorkIndexField.WORK.getName())
+        + '\n';
+  }
 
-    @Override
-    protected  String printExplainHeader(Document doc)
-            throws IOException, ParseException {
-        return doc.get(WorkIndexField.WORK_ID.getName()) +':'
-                + doc.get(WorkIndexField.WORK.getName())
-                + '\n';
-    }
-
 }
\ No newline at end of file

Modified: search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindAnnotationTest.java
===================================================================
--- search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindAnnotationTest.java	2012-11-02 18:59:28 UTC (rev 13610)
+++ search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindAnnotationTest.java	2012-11-04 22:29:56 UTC (rev 13611)
@@ -27,8 +27,8 @@
  */
 public class FindAnnotationTest {
 
-  private SearchServer ss;
-  private SearchServer sd;
+  private AbstractSearchServer ss;
+  private AbstractDismaxSearchServer sd;
 
 
   @Before
@@ -109,93 +109,93 @@
     SearcherManager searcherManager = new SearcherManager(ramDir, new MusicBrainzSearcherFactory(
         ResourceType.ANNOTATION));
     ss = new AnnotationSearch(searcherManager);
-    sd = new AnnotationDismaxSearch(searcherManager);
+    sd = new AnnotationDismaxSearch(ss);
 
   }
 
   @Test
   public void testSearchByTypeRelease() throws Exception {
-    Results res = ss.searchLucene("type:release", 0, 10);
+    Results res = ss.search("type:release", 0, 10);
     assertEquals(1, res.totalHits);
   }
 
   @Test
   public void testSearchByTypeArtist() throws Exception {
-    Results res = ss.searchLucene("type:artist", 0, 10);
+    Results res = ss.search("type:artist", 0, 10);
     assertEquals(1, res.totalHits);
   }
 
   @Test
   public void testSearchByDismax1() throws Exception {
-    Results res = sd.searchLucene("Pieds nus", 0, 10);
+    Results res = sd.search("Pieds nus", 0, 10);
     assertEquals(1, res.totalHits);
   }
 
   @Test
   public void testSearchByDismax2() throws Exception {
-    Results res = sd.searchLucene("0828768226629", 0, 10);
+    Results res = sd.search("0828768226629", 0, 10);
     assertEquals(1, res.totalHits);
   }
 
   @Test
   public void testSearchByTypeReleaseGroup() throws Exception {
-    Results res = ss.searchLucene("type:release-group", 0, 10);
+    Results res = ss.search("type:release-group", 0, 10);
     assertEquals("3 Songs", res.results.get(0).getDoc().get(AnnotationIndexField.NAME));
     assertEquals(1, res.totalHits);
   }
 
   @Test
   public void testSearchByTypeRecording() throws Exception {
-    Results res = ss.searchLucene("type:recording", 0, 10);
+    Results res = ss.search("type:recording", 0, 10);
     assertEquals(1, res.totalHits);
   }
 
   @Test
   public void testSearchByTypeWork() throws Exception {
-    Results res = ss.searchLucene("type:work", 0, 10);
+    Results res = ss.search("type:work", 0, 10);
     assertEquals(1, res.totalHits);
   }
 
   @Test
   public void testSearchByName() throws Exception {
-    Results res = ss.searchLucene("name:Pieds nus sur la braise", 0, 10);
+    Results res = ss.search("name:Pieds nus sur la braise", 0, 10);
     assertEquals(1, res.totalHits);
   }
 
   @Test
   public void testSearchByNameNoMatch() throws Exception {
-    Results res = ss.searchLucene("name:fred", 0, 10);
+    Results res = ss.search("name:fred", 0, 10);
     assertEquals(0, res.totalHits);
   }
 
   @Test
   public void testSearchByEntity() throws Exception {
-    Results res = ss.searchLucene("entity:bdb24cb5-404b-4f60-bba4-7b730325ae47", 0, 10);
+    Results res = ss.search("entity:bdb24cb5-404b-4f60-bba4-7b730325ae47", 0, 10);
     assertEquals(1, res.totalHits);
   }
 
   @Test
   public void testSearchByEntitydNoMatch() throws Exception {
-    Results res = ss.searchLucene("entity:bdb24cb5-404b-4f60-bba4-000000000000", 0, 10);
+    Results res = ss.search("entity:bdb24cb5-404b-4f60-bba4-000000000000", 0, 10);
     assertEquals(0, res.totalHits);
   }
 
   @Test
   public void testSearchByText() throws Exception {
-    Results res = ss.searchLucene("text:DiscID", 0, 10);
+    Results res = ss.search("text:DiscID", 0, 10);
     assertEquals(1, res.totalHits);
   }
 
   @Test
   public void testSearchByTextNoMatch() throws Exception {
-    Results res = ss.searchLucene("text:fred", 0, 10);
+    Results res = ss.search("text:fred", 0, 10);
     assertEquals(0, res.totalHits);
   }
 
   @Test
   public void testSearchByDefaultField() throws Exception {
 
-    Results res = ss.searchLucene("DiscID", 0, 10);
+    Results res = ss.search("DiscID", 0, 10);
     assertEquals(1, res.totalHits);
   }
 
@@ -205,7 +205,7 @@
   @Test
   public void testOutputXml() throws Exception {
 
-    Results res = ss.searchLucene("entity:bdb24cb5-404b-4f60-bba4-7b730325ae47", 0, 1);
+    Results res = ss.search("entity:bdb24cb5-404b-4f60-bba4-7b730325ae47", 0, 1);
     org.musicbrainz.search.servlet.mmd2.ResultsWriter writer = ss.getMmd2Writer();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);
@@ -228,7 +228,7 @@
   @Test
   public void testOutputJson() throws Exception {
 
-    Results res = ss.searchLucene("entity:bdb24cb5-404b-4f60-bba4-7b730325ae47", 0, 1);
+    Results res = ss.search("entity:bdb24cb5-404b-4f60-bba4-7b730325ae47", 0, 1);
     org.musicbrainz.search.servlet.mmd2.ResultsWriter writer = ss.getMmd2Writer();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);
@@ -251,7 +251,7 @@
   @Test
   public void testOutputJsonNew() throws Exception {
 
-    Results res = ss.searchLucene("entity:bdb24cb5-404b-4f60-bba4-7b730325ae47", 0, 1);
+    Results res = ss.search("entity:bdb24cb5-404b-4f60-bba4-7b730325ae47", 0, 1);
     org.musicbrainz.search.servlet.mmd2.ResultsWriter writer = ss.getMmd2Writer();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);
@@ -275,7 +275,7 @@
   @Test
   public void testOutputJsonNewPretty() throws Exception {
 
-    Results res = ss.searchLucene("entity:bdb24cb5-404b-4f60-bba4-7b730325ae47", 0, 1);
+    Results res = ss.search("entity:bdb24cb5-404b-4f60-bba4-7b730325ae47", 0, 1);
     org.musicbrainz.search.servlet.mmd2.ResultsWriter writer = ss.getMmd2Writer();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);

Modified: search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindArtistTest.java
===================================================================
--- search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindArtistTest.java	2012-11-02 18:59:28 UTC (rev 13610)
+++ search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindArtistTest.java	2012-11-04 22:29:56 UTC (rev 13611)
@@ -32,8 +32,8 @@
  */
 public class FindArtistTest {
 
-  private SearchServer ss;
-  private SearchServer sd;
+  private AbstractSearchServer ss;
+  private AbstractDismaxSearchServer sd;
 
 
   @Before
@@ -103,13 +103,13 @@
     writer.close();
     SearcherManager searcherManager = new SearcherManager(ramDir, new MusicBrainzSearcherFactory(ResourceType.ARTIST));
     ss = new ArtistSearch(searcherManager);
-    sd = new ArtistDismaxSearch(searcherManager);
+    sd = new ArtistDismaxSearch(ss);
 
   }
 
   @Test
   public void testFindArtistById() throws Exception {
-    Results res = ss.searchLucene("arid:\"4302e264-1cf0-4d1f-aca7-2a6f89e34b36\"", 0, 10);
+    Results res = ss.search("arid:\"4302e264-1cf0-4d1f-aca7-2a6f89e34b36\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -125,7 +125,7 @@
 
   @Test
   public void testFindArtistByName() throws Exception {
-    Results res = ss.searchLucene("artist:\"Farming Incident\"", 0, 10);
+    Results res = ss.search("artist:\"Farming Incident\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -134,7 +134,7 @@
 
   @Test
   public void testFindArtistDismaxSingleTerm() throws Exception {
-    Results res = sd.searchLucene("Farming", 0, 10);
+    Results res = sd.search("Farming", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -143,7 +143,7 @@
 
   @Test
   public void testFindArtistDismaxPhrase() throws Exception {
-    Results res = sd.searchLucene("Farming Incident", 0, 10);
+    Results res = sd.search("Farming Incident", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -152,7 +152,7 @@
 
   @Test
   public void testFindArtistDismaxFuzzy() throws Exception {
-    Results res = sd.searchLucene("Farmin", 0, 10);
+    Results res = sd.search("Farmin", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -161,7 +161,7 @@
 
   @Test
   public void testFindArtistBySortName() throws Exception {
-    Results res = ss.searchLucene("sortname:\"Incident, Farming\"", 0, 10);
+    Results res = ss.search("sortname:\"Incident, Farming\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -171,7 +171,7 @@
 
   @Test
   public void testFindArtistByType() throws Exception {
-    Results res = ss.searchLucene("type:\"group\"", 0, 10);
+    Results res = ss.search("type:\"group\"", 0, 10);
     assertEquals(2, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -180,7 +180,7 @@
 
   @Test
   public void testFindArtistByIpi() throws Exception {
-    Results res = ss.searchLucene("ipi:1001", 0, 10);
+    Results res = ss.search("ipi:1001", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -189,7 +189,7 @@
 
   @Test
   public void testFindArtistByNumericType() throws Exception {
-    Results res = ss.searchLucene("type:2", 0, 10);
+    Results res = ss.search("type:2", 0, 10);
     assertEquals(2, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -198,7 +198,7 @@
 
   @Test
   public void testFindArtistByBeginDate() throws Exception {
-    Results res = ss.searchLucene("begin:\"1999-04\"", 0, 10);
+    Results res = ss.search("begin:\"1999-04\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -207,7 +207,7 @@
 
   @Test
   public void testFindArtistByEnded() throws Exception {
-    Results res = ss.searchLucene("ended:\"true\"", 0, 10);
+    Results res = ss.search("ended:\"true\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -217,19 +217,19 @@
 
   @Test
   public void testFindArtistByEndDate() throws Exception {
-    Results res = ss.searchLucene("end:\"1999-04\"", 0, 10);
+    Results res = ss.search("end:\"1999-04\"", 0, 10);
     assertEquals(0, res.totalHits);
   }
 
   @Test
   public void testFindArtistByTypePerson() throws Exception {
-    Results res = ss.searchLucene("type:\"person\"", 0, 10);
+    Results res = ss.search("type:\"person\"", 0, 10);
     assertEquals(1, res.totalHits);
   }
 
   @Test
   public void testFindArtistByAlias() throws Exception {
-    Results res = ss.searchLucene("alias:\"Echo And The Bunnymen\"", 0, 10);
+    Results res = ss.search("alias:\"Echo And The Bunnymen\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -239,7 +239,7 @@
 
   @Test
   public void testFindArtistByCountry() throws Exception {
-    Results res = ss.searchLucene("country:\"af\"", 0, 10);
+    Results res = ss.search("country:\"af\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -249,7 +249,7 @@
 
   @Test
   public void testFindArtistWithNoCountry() throws Exception {
-    Results res = ss.searchLucene("country:unknown", 0, 10);
+    Results res = ss.search("country:unknown", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -258,7 +258,7 @@
 
   @Test
   public void testFindArtistWithNoGender() throws Exception {
-    Results res = ss.searchLucene("gender:unknown", 0, 10);
+    Results res = ss.search("gender:unknown", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -268,7 +268,7 @@
 
   @Test
   public void testFindArtistByCountryUppercase() throws Exception {
-    Results res = ss.searchLucene("country:\"AF\"", 0, 10);
+    Results res = ss.search("country:\"AF\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -278,7 +278,7 @@
 
   @Test
   public void testFindArtistByGenderLowercase() throws Exception {
-    Results res = ss.searchLucene("gender:\"male\"", 0, 10);
+    Results res = ss.search("gender:\"male\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -288,7 +288,7 @@
 
   @Test
   public void testFindArtistByGenderTitlecase() throws Exception {
-    Results res = ss.searchLucene("gender:\"Male\"", 0, 10);
+    Results res = ss.search("gender:\"Male\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -298,7 +298,7 @@
 
   @Test
   public void testFindArtistByTag() throws Exception {
-    Results res = ss.searchLucene("tag:Thrash", 0, 10);
+    Results res = ss.search("tag:Thrash", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -311,7 +311,7 @@
 
     //Matches on name field without it being specified
     {
-      Results res = ss.searchLucene("\"Echo & The Bunnymen\"", 0, 10);
+      Results res = ss.search("\"Echo & The Bunnymen\"", 0, 10);
       assertEquals(1, res.totalHits);
       Result result = res.results.get(0);
       MbDocument doc = result.doc;
@@ -324,7 +324,7 @@
 
     //and alias field  field without it being specified
     {
-      Results res = ss.searchLucene("\"Echo & The Bunnyman\"", 0, 10);
+      Results res = ss.search("\"Echo & The Bunnyman\"", 0, 10);
       assertEquals(1, res.totalHits);
       Result result = res.results.get(0);
       MbDocument doc = result.doc;
@@ -337,7 +337,7 @@
 
     //but doesn't search default fields if a field is specified
     {
-      Results res = ss.searchLucene("type:\"Echo & The Bunnyman\"", 0, 10);
+      Results res = ss.search("type:\"Echo & The Bunnyman\"", 0, 10);
       assertEquals(0, res.totalHits);
 
     }
@@ -345,7 +345,7 @@
 
   @Test
   public void testFindArtistByExcalamation() throws Exception {
-    Results res = ss.searchLucene("Farming\\!", 0, 10);
+    Results res = ss.search("Farming\\!", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -361,7 +361,7 @@
   @Test
   public void testOutputAsMmd1Xml() throws Exception {
 
-    Results res = ss.searchLucene("artist:\"Farming Incident\"", 0, 1);
+    Results res = ss.search("artist:\"Farming Incident\"", 0, 1);
     Mmd1XmlWriter v1Writer = new ArtistMmd1XmlWriter();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);
@@ -390,7 +390,7 @@
   @Test
   public void testOutputXml() throws Exception {
 
-    Results res = ss.searchLucene("artist:\"Farming Incident\"", 0, 1);
+    Results res = ss.search("artist:\"Farming Incident\"", 0, 1);
     ResultsWriter v1Writer = ss.getMmd2Writer();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);
@@ -423,7 +423,7 @@
   @Test
   public void testOutputXml2() throws Exception {
 
-    Results res = ss.searchLucene("artist:\"Echo & the Bunnymen\"", 0, 1);
+    Results res = ss.search("artist:\"Echo & the Bunnymen\"", 0, 1);
     ResultsWriter v1Writer = ss.getMmd2Writer();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);
@@ -449,7 +449,7 @@
   @Test
   public void testOutputXml3() throws Exception {
 
-    Results res = ss.searchLucene("artist:\"PJ Harvey\"", 0, 1);
+    Results res = ss.search("artist:\"PJ Harvey\"", 0, 1);
     ResultsWriter writer = ss.getMmd2Writer();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);
@@ -472,7 +472,7 @@
   @Test
   public void testOutputAsMmd1XmlSpecialCharacters() throws Exception {
 
-    Results res = ss.searchLucene("alias:\"Echo And The Bunnymen\"", 0, 1);
+    Results res = ss.search("alias:\"Echo And The Bunnymen\"", 0, 1);
     Mmd1XmlWriter v1Writer = ss.getMmd1Writer();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);
@@ -493,7 +493,7 @@
   @Test
   public void testOutputJson() throws Exception {
 
-    Results res = ss.searchLucene("artist:\"Farming Incident\"", 0, 1);
+    Results res = ss.search("artist:\"Farming Incident\"", 0, 1);
     ResultsWriter writer = ss.getMmd2Writer();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);
@@ -520,7 +520,7 @@
 
   @Test
   public void testOutputJsonMultiple() throws Exception {
-    Results res = ss.searchLucene("artist:\"Farming Incident\" OR artist:\"Echo & The Bunnymen\"", 0, 2);
+    Results res = ss.search("artist:\"Farming Incident\" OR artist:\"Echo & The Bunnymen\"", 0, 2);
 
     ResultsWriter writer = ss.getMmd2Writer();
     StringWriter sw = new StringWriter();
@@ -538,7 +538,7 @@
   @Test
   public void testOutputJsonNew() throws Exception {
 
-    Results res = ss.searchLucene("artist:\"Farming Incident\"", 0, 1);
+    Results res = ss.search("artist:\"Farming Incident\"", 0, 1);
     ResultsWriter writer = ss.getMmd2Writer();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);
@@ -571,7 +571,7 @@
   @Test
   public void testOutputJsonNewPretty() throws Exception {
 
-    Results res = ss.searchLucene("artist:\"Farming Incident\"", 0, 1);
+    Results res = ss.search("artist:\"Farming Incident\"", 0, 1);
     ResultsWriter writer = ss.getMmd2Writer();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);
@@ -592,7 +592,7 @@
   @Test
   public void testOutputJsonNewPrettyWithAliases() throws Exception {
 
-    Results res = ss.searchLucene("arid:ccd4879c-5e88-4385-b131-bf65296bf245", 0, 1);
+    Results res = ss.search("arid:ccd4879c-5e88-4385-b131-bf65296bf245", 0, 1);
     ResultsWriter writer = ss.getMmd2Writer();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);

Modified: search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindCDStubTest.java
===================================================================
--- search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindCDStubTest.java	2012-11-02 18:59:28 UTC (rev 13610)
+++ search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindCDStubTest.java	2012-11-04 22:29:56 UTC (rev 13611)
@@ -27,8 +27,8 @@
  */
 public class FindCDStubTest {
 
-  private SearchServer ss;
-  private SearchServer sd;
+  private AbstractSearchServer ss;
+  private AbstractDismaxSearchServer sd;
 
 
   @Before
@@ -68,66 +68,66 @@
     writer.close();
     SearcherManager searcherManager = new SearcherManager(ramDir, new MusicBrainzSearcherFactory(ResourceType.CDSTUB));
     ss = new CDStubSearch(searcherManager);
-    sd = new CDStubDismaxSearch(searcherManager);
+    sd = new CDStubDismaxSearch(ss);
   }
 
   @Test
   public void testSearchByArtist() throws Exception {
-    Results res = ss.searchLucene("artist:\"Doo Doo\"", 0, 10);
+    Results res = ss.search("artist:\"Doo Doo\"", 0, 10);
     assertEquals(1, res.totalHits);
   }
 
   @Test
   public void testSearchByDismax1() throws Exception {
-    Results res = sd.searchLucene("First", 0, 10);
+    Results res = sd.search("First", 0, 10);
     assertEquals(1, res.totalHits);
   }
 
   @Test
   public void testSearchByDismax2() throws Exception {
-    Results res = sd.searchLucene("Doo Doo", 0, 10);
+    Results res = sd.search("Doo Doo", 0, 10);
     assertEquals(1, res.totalHits);
   }
 
   @Test
   public void testSearchByDismax3() throws Exception {
-    Results res = sd.searchLucene("837101029193", 0, 10);
+    Results res = sd.search("837101029193", 0, 10);
     assertEquals(1, res.totalHits);
   }
 
   @Test
   public void testSearchByDismax4() throws Exception {
-    Results res = sd.searchLucene("CD Baby", 0, 10);
+    Results res = sd.search("CD Baby", 0, 10);
     assertEquals(1, res.totalHits);
   }
 
   @Test
   public void testSearchByTitle() throws Exception {
-    Results res = ss.searchLucene("title:\"Doo Doo First\"", 0, 10);
+    Results res = ss.search("title:\"Doo Doo First\"", 0, 10);
     assertEquals(1, res.totalHits);
   }
 
   @Test
   public void testSearchByBarcode() throws Exception {
-    Results res = ss.searchLucene("barcode:\"837101029193\"", 0, 10);
+    Results res = ss.search("barcode:\"837101029193\"", 0, 10);
     assertEquals(1, res.totalHits);
   }
 
   @Test
   public void testSearchByComment() throws Exception {
-    Results res = ss.searchLucene("comment:\"CD Baby id:vozzolo\"", 0, 10);
+    Results res = ss.search("comment:\"CD Baby id:vozzolo\"", 0, 10);
     assertEquals(1, res.totalHits);
   }
 
   @Test
   public void testSearchByDiscId() throws Exception {
-    Results res = ss.searchLucene("discid:qA87dKURKperVfmckD5b_xo8BO8-", 0, 10);
+    Results res = ss.search("discid:qA87dKURKperVfmckD5b_xo8BO8-", 0, 10);
     assertEquals(1, res.totalHits);
   }
 
   @Test
   public void testSearchByNumTracks() throws Exception {
-    Results res = ss.searchLucene("tracks:2", 0, 10);
+    Results res = ss.search("tracks:2", 0, 10);
     assertEquals(1, res.totalHits);
   }
 
@@ -138,7 +138,7 @@
   @Test
   public void testOutputXml() throws Exception {
 
-    Results res = ss.searchLucene("title:\"Doo Doo\"", 0, 1);
+    Results res = ss.search("title:\"Doo Doo\"", 0, 1);
     ResultsWriter writer = ss.getMmd2Writer();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);
@@ -166,7 +166,7 @@
   @Test
   public void testOutputXmlNoArtist() throws Exception {
 
-    Results res = ss.searchLucene("title:fred", 0, 1);
+    Results res = ss.search("title:fred", 0, 1);
     ResultsWriter writer = ss.getMmd2Writer();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);
@@ -190,7 +190,7 @@
   @Test
   public void testOutputJson() throws Exception {
 
-    Results res = ss.searchLucene("title:\"Doo Doo\"", 0, 1);
+    Results res = ss.search("title:\"Doo Doo\"", 0, 1);
     ResultsWriter writer = ss.getMmd2Writer();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);
@@ -215,7 +215,7 @@
   @Test
   public void testOutputJsonNew() throws Exception {
 
-    Results res = ss.searchLucene("title:\"Doo Doo\"", 0, 1);
+    Results res = ss.search("title:\"Doo Doo\"", 0, 1);
     ResultsWriter writer = ss.getMmd2Writer();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);
@@ -240,7 +240,7 @@
   @Test
   public void testOutputJsonNewPretty() throws Exception {
 
-    Results res = ss.searchLucene("title:\"Doo Doo\"", 0, 1);
+    Results res = ss.search("title:\"Doo Doo\"", 0, 1);
     ResultsWriter writer = ss.getMmd2Writer();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);

Modified: search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindFreeDBTest.java
===================================================================
--- search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindFreeDBTest.java	2012-11-02 18:59:28 UTC (rev 13610)
+++ search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindFreeDBTest.java	2012-11-04 22:29:56 UTC (rev 13611)
@@ -24,7 +24,7 @@
  */
 public class FindFreeDBTest  {
 
-  private SearchServer ss;
+  private AbstractSearchServer ss;
 
   @Before
   public void setUp() throws Exception {
@@ -52,7 +52,7 @@
 
   @Test
   public void testSearchFreeDBByArtist() throws Exception {
-    Results res = ss.searchLucene("artist:\"Ska-P\"", 0, 10);
+    Results res = ss.search("artist:\"Ska-P\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -66,7 +66,7 @@
 
   @Test
   public void testSearchFreeDBByTitle() throws Exception {
-    Results res = ss.searchLucene("title:\"L\u00e1grimas & Gozos\"", 0, 10);
+    Results res = ss.search("title:\"L\u00e1grimas & Gozos\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -80,7 +80,7 @@
 
   @Test
   public void testSearchFreeDBByDiscId() throws Exception {
-    Results res = ss.searchLucene("discid:\"c20c4b0d\"", 0, 10);
+    Results res = ss.search("discid:\"c20c4b0d\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -94,7 +94,7 @@
 
   @Test
   public void testSearchFreeDBByYear() throws Exception {
-    Results res = ss.searchLucene("year:\"2008\"", 0, 10);
+    Results res = ss.search("year:\"2008\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -111,7 +111,7 @@
 
     //by artist
     {
-      Results res = ss.searchLucene("\"Ska-P\"", 0, 10);
+      Results res = ss.search("\"Ska-P\"", 0, 10);
       assertEquals(1, res.totalHits);
       Result result = res.results.get(0);
       MbDocument doc = result.doc;
@@ -125,7 +125,7 @@
 
     //by title
     {
-      Results res = ss.searchLucene("\"L\u00e1grimas & Gozos\"", 0, 10);
+      Results res = ss.search("\"L\u00e1grimas & Gozos\"", 0, 10);
       assertEquals(1, res.totalHits);
       Result result = res.results.get(0);
       MbDocument doc = result.doc;
@@ -145,7 +145,7 @@
   @Test
   public void testOutputXml() throws Exception {
 
-    Results res = ss.searchLucene("discid:\"c20c4b0d\"", 0, 10);
+    Results res = ss.search("discid:\"c20c4b0d\"", 0, 10);
     org.musicbrainz.search.servlet.mmd2.ResultsWriter writer = new FreeDBWriter();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);
@@ -169,7 +169,7 @@
   @Test
   public void testOutputJson() throws Exception {
 
-    Results res = ss.searchLucene("discid:\"c20c4b0d\"", 0, 10);
+    Results res = ss.search("discid:\"c20c4b0d\"", 0, 10);
     ResultsWriter writer = new FreeDBWriter();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);
@@ -194,7 +194,7 @@
   @Test
   public void testOutputJsonNew() throws Exception {
 
-    Results res = ss.searchLucene("discid:\"c20c4b0d\"", 0, 10);
+    Results res = ss.search("discid:\"c20c4b0d\"", 0, 10);
     ResultsWriter writer = new FreeDBWriter();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);
@@ -219,7 +219,7 @@
   @Test
   public void testOutputJsonNewPretty() throws Exception {
 
-    Results res = ss.searchLucene("discid:\"c20c4b0d\"", 0, 10);
+    Results res = ss.search("discid:\"c20c4b0d\"", 0, 10);
     ResultsWriter writer = new FreeDBWriter();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);

Modified: search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindLabelTest.java
===================================================================
--- search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindLabelTest.java	2012-11-02 18:59:28 UTC (rev 13610)
+++ search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindLabelTest.java	2012-11-04 22:29:56 UTC (rev 13611)
@@ -34,8 +34,8 @@
  */
 public class FindLabelTest {
 
-  private SearchServer ss;
-  private SearchServer sd;
+  private AbstractSearchServer ss;
+  private AbstractDismaxSearchServer sd;
 
 
   @Before
@@ -108,12 +108,12 @@
     writer.close();
     SearcherManager searcherManager = new SearcherManager(ramDir, new MusicBrainzSearcherFactory(ResourceType.LABEL));
     ss = new LabelSearch(searcherManager);
-    sd = new LabelDismaxSearch(searcherManager);
+    sd = new LabelDismaxSearch(ss);
   }
 
   @Test
   public void testFindLabelById() throws Exception {
-    Results res = ss.searchLucene("laid:\"ff571ff4-04cb-4b9c-8a1c-354c330f863c\"", 0, 10);
+    Results res = ss.search("laid:\"ff571ff4-04cb-4b9c-8a1c-354c330f863c\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -129,7 +129,7 @@
 
   @Test
   public void testFindLabelByName() throws Exception {
-    Results res = ss.searchLucene("label:\"Jockey Slut\"", 0, 10);
+    Results res = ss.search("label:\"Jockey Slut\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -139,7 +139,7 @@
 
   @Test
   public void testFindLabelByDismax1() throws Exception {
-    Results res = sd.searchLucene("Jockey Slut", 0, 10);
+    Results res = sd.search("Jockey Slut", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -149,7 +149,7 @@
 
   @Test
   public void testFindLabelByDismax2() throws Exception {
-    Results res = sd.searchLucene("Jockey", 0, 10);
+    Results res = sd.search("Jockey", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -161,7 +161,7 @@
   public void testFindLabelByDefault() throws Exception {
 
     {
-      Results res = ss.searchLucene("\"Jockey Slut\"", 0, 10);
+      Results res = ss.search("\"Jockey Slut\"", 0, 10);
       assertEquals(1, res.totalHits);
       Result result = res.results.get(0);
       MbDocument doc = result.doc;
@@ -170,7 +170,7 @@
     }
 
     {
-      Results res = ss.searchLucene("\"Slut Jockey\"", 0, 10);
+      Results res = ss.search("\"Slut Jockey\"", 0, 10);
       assertEquals(1, res.totalHits);
       Result result = res.results.get(0);
       MbDocument doc = result.doc;
@@ -179,7 +179,7 @@
     }
 
     {
-      Results res = ss.searchLucene("\"Jockeys\"", 0, 10);
+      Results res = ss.search("\"Jockeys\"", 0, 10);
       assertEquals(1, res.totalHits);
       Result result = res.results.get(0);
       MbDocument doc = result.doc;
@@ -190,7 +190,7 @@
 
   @Test
   public void testFindLabelByType() throws Exception {
-    Results res = ss.searchLucene("type:\"production\"", 0, 10);
+    Results res = ss.search("type:\"production\"", 0, 10);
     assertEquals(2, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -202,7 +202,7 @@
 
   @Test
   public void testFindLabelByIpi() throws Exception {
-    Results res = ss.searchLucene("ipi:1001", 0, 10);
+    Results res = ss.search("ipi:1001", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -214,7 +214,7 @@
 
   @Test
   public void testFindLabelByNumericType() throws Exception {
-    Results res = ss.searchLucene("type:3", 0, 10);
+    Results res = ss.search("type:3", 0, 10);
     assertEquals(2, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -226,7 +226,7 @@
 
   @Test
   public void testFindLabelBySortname() throws Exception {
-    Results res = ss.searchLucene("sortname:\"Slut, Jockey\"", 0, 10);
+    Results res = ss.search("sortname:\"Slut, Jockey\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -236,7 +236,7 @@
 
   @Test
   public void testFindLabelByCountry() throws Exception {
-    Results res = ss.searchLucene("country:\"gb\"", 0, 10);
+    Results res = ss.search("country:\"gb\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -246,7 +246,7 @@
 
   @Test
   public void testFindLabelByUnknownCountry() throws Exception {
-    Results res = ss.searchLucene("country:\"unknown\"", 0, 10);
+    Results res = ss.search("country:\"unknown\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -255,7 +255,7 @@
 
   @Test
   public void testFindLabelByCountryUpercase() throws Exception {
-    Results res = ss.searchLucene("country:\"GB\"", 0, 10);
+    Results res = ss.search("country:\"GB\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -265,7 +265,7 @@
 
   @Test
   public void testFindLabelByCode() throws Exception {
-    Results res = ss.searchLucene("code:5807", 0, 10);
+    Results res = ss.search("code:5807", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -275,7 +275,7 @@
 
   @Test
   public void testFindLabelByCode2() throws Exception {
-    Results res = ss.searchLucene("code:005807", 0, 10);
+    Results res = ss.search("code:005807", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -285,7 +285,7 @@
 
   @Test
   public void testFindLabelByCodeRange() throws Exception {
-    Results res = ss.searchLucene("code:[5806 TO 5807]", 0, 10);
+    Results res = ss.search("code:[5806 TO 5807]", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -295,7 +295,7 @@
 
   @Test
   public void testFindLabelByZeroedCode() throws Exception {
-    Results res = ss.searchLucene("code:\"05807\"", 0, 10);
+    Results res = ss.search("code:\"05807\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -305,7 +305,7 @@
 
   @Test
   public void testFindLabelByTag() throws Exception {
-    Results res = ss.searchLucene("tag:dance", 0, 10);
+    Results res = ss.search("tag:dance", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -315,7 +315,7 @@
 
   @Test
   public void testFindLabelByEnded() throws Exception {
-    Results res = ss.searchLucene("ended:\"true\"", 0, 10);
+    Results res = ss.search("ended:\"true\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -324,7 +324,7 @@
 
 
   public void testIssue66() throws Exception {
-    Results res = ss.searchLucene("dark", 0, 10);
+    Results res = ss.search("dark", 0, 10);
     assertEquals(1, res.totalHits);
     ResultsWriter writer = new LabelMmd1XmlWriter();
     StringWriter sw = new StringWriter();
@@ -353,7 +353,7 @@
   @Test
   public void testOutputAsMmd1Xml() throws Exception {
 
-    Results res = ss.searchLucene("label:\"Jockey Slut\"", 0, 1);
+    Results res = ss.search("label:\"Jockey Slut\"", 0, 1);
     ResultsWriter writer = new LabelMmd1XmlWriter();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);
@@ -380,7 +380,7 @@
   @Test
   public void testOutputAsXml() throws Exception {
 
-    Results res = ss.searchLucene("label:\"Jockey Slut\"", 0, 1);
+    Results res = ss.search("label:\"Jockey Slut\"", 0, 1);
     ResultsWriter writer = ss.getMmd2Writer();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);
@@ -408,7 +408,7 @@
   @Test
   public void testOutputAsXmlWithUnknownCountry() throws Exception {
 
-    Results res = ss.searchLucene("laid:a539bb1e-f2e1-4b45-9db8-8053841e7503", 0, 1);
+    Results res = ss.search("laid:a539bb1e-f2e1-4b45-9db8-8053841e7503", 0, 1);
     ResultsWriter writer = ss.getMmd2Writer();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);
@@ -426,7 +426,7 @@
   @Test
   public void testOutputAsMMd1XmlWithUnknownType() throws Exception {
 
-    Results res = ss.searchLucene("blob", 0, 1);
+    Results res = ss.search("blob", 0, 1);
     ResultsWriter writer = new LabelMmd1XmlWriter();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);
@@ -445,7 +445,7 @@
   @Test
   public void testOutputJson() throws Exception {
 
-    Results res = ss.searchLucene("label:\"Jockey Slut\"", 0, 10);
+    Results res = ss.search("label:\"Jockey Slut\"", 0, 10);
     org.musicbrainz.search.servlet.mmd2.ResultsWriter writer = ss.getMmd2Writer();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);
@@ -474,7 +474,7 @@
   @Test
   public void testOutputJsonNew() throws Exception {
 
-    Results res = ss.searchLucene("label:\"Jockey Slut\"", 0, 10);
+    Results res = ss.search("label:\"Jockey Slut\"", 0, 10);
     org.musicbrainz.search.servlet.mmd2.ResultsWriter writer = ss.getMmd2Writer();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);
@@ -507,7 +507,7 @@
   @Test
   public void testOutputJsonNewIdent() throws Exception {
 
-    Results res = ss.searchLucene("label:\"Jockey Slut\"", 0, 10);
+    Results res = ss.search("label:\"Jockey Slut\"", 0, 10);
     org.musicbrainz.search.servlet.mmd2.ResultsWriter writer = ss.getMmd2Writer();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);

Modified: search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindRecordingTest.java
===================================================================
--- search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindRecordingTest.java	2012-11-02 18:59:28 UTC (rev 13610)
+++ search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindRecordingTest.java	2012-11-04 22:29:56 UTC (rev 13611)
@@ -35,8 +35,8 @@
 public class FindRecordingTest {
 
 
-  private SearchServer ss;
-  private SearchServer sd;
+  private AbstractSearchServer ss;
+  private AbstractDismaxSearchServer sd;
 
 
 
@@ -131,12 +131,12 @@
     SearcherManager searcherManager = new SearcherManager(ramDir,
         new MusicBrainzSearcherFactory(ResourceType.RECORDING));
     ss = new RecordingSearch(searcherManager);
-    sd = new RecordingDismaxSearch(searcherManager);
+    sd = new RecordingDismaxSearch(ss);
   }
 
   @Test
   public void testFindRecordingByV1TrackField() throws Exception {
-    Results res = ss.searchLucene("track:\"Gravitational Lenz\"", 0, 10);
+    Results res = ss.search("track:\"Gravitational Lenz\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -151,7 +151,7 @@
 
   @Test
   public void testFindRecording() throws Exception {
-    Results res = ss.searchLucene("recording:\"Gravitational Lenz\"", 0, 10);
+    Results res = ss.search("recording:\"Gravitational Lenz\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -167,7 +167,7 @@
 
   @Test
   public void testFindRecordingDismax1() throws Exception {
-    Results res = sd.searchLucene("Gravitational", 0, 10);
+    Results res = sd.search("Gravitational", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -176,7 +176,7 @@
 
   @Test
   public void testFindRecordingDismax2() throws Exception {
-    Results res = sd.searchLucene("Glorious", 0, 10);
+    Results res = sd.search("Glorious", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -185,7 +185,7 @@
 
   @Test
   public void testFindRecordingDismax3() throws Exception {
-    Results res = sd.searchLucene("Farming Incident", 0, 10);
+    Results res = sd.search("Farming Incident", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -194,7 +194,7 @@
 
   @Test
   public void testFindRecordingByV1TrackId() throws Exception {
-    Results res = ss.searchLucene("trid:\"7ca7782b-a602-448b-b108-bb881a7be2d6\"", 0, 10);
+    Results res = ss.search("trid:\"7ca7782b-a602-448b-b108-bb881a7be2d6\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -203,7 +203,7 @@
 
   @Test
   public void testFindRecordingById() throws Exception {
-    Results res = ss.searchLucene("rid:\"7ca7782b-a602-448b-b108-bb881a7be2d6\"", 0, 10);
+    Results res = ss.search("rid:\"7ca7782b-a602-448b-b108-bb881a7be2d6\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -212,7 +212,7 @@
 
   @Test
   public void testFindRecordingByReleaseId() throws Exception {
-    Results res = ss.searchLucene("reid:\"1d9e8ed6-3893-4d3b-aa7d-6cd79609e386\"", 0, 10);
+    Results res = ss.search("reid:\"1d9e8ed6-3893-4d3b-aa7d-6cd79609e386\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -221,7 +221,7 @@
 
   @Test
   public void testFindRecordingByDemo() throws Exception {
-    Results res = ss.searchLucene("comment:\"demo\"", 0, 10);
+    Results res = ss.search("comment:\"demo\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -230,7 +230,7 @@
 
   @Test
   public void testFindRecordingByArtistId() throws Exception {
-    Results res = ss.searchLucene("arid:\"4302e264-1cf0-4d1f-aca7-2a6f89e34b36\"", 0, 10);
+    Results res = ss.search("arid:\"4302e264-1cf0-4d1f-aca7-2a6f89e34b36\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -238,7 +238,7 @@
   }
 
   public void testFindRecordingByArtistName() throws Exception {
-    Results res = ss.searchLucene("artist:\"Farming Incident\"", 0, 10);
+    Results res = ss.search("artist:\"Farming Incident\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -248,7 +248,7 @@
   /** Searches recording field, which should include names of associated tracks) */
   @Test
   public void testFindRecordingByTrackName() throws Exception {
-    Results res = ss.searchLucene("recording:\"Gravitational Lens\"", 0, 10);
+    Results res = ss.search("recording:\"Gravitational Lens\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -257,7 +257,7 @@
 
   @Test
   public void testFindRecordingByReleaseType() throws Exception {
-    Results res = ss.searchLucene("type:\"compilation\"", 0, 10);
+    Results res = ss.search("type:\"compilation\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -266,7 +266,7 @@
 
   @Test
   public void testFindRecordingByPrimaryReleaseType() throws Exception {
-    Results res = ss.searchLucene("primarytype:\"album\"", 0, 10);
+    Results res = ss.search("primarytype:\"album\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -275,7 +275,7 @@
 
   @Test
   public void testFindRecordingBySecondaryReleaseType() throws Exception {
-    Results res = ss.searchLucene("secondarytype:\"compilation\"", 0, 10);
+    Results res = ss.search("secondarytype:\"compilation\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -284,7 +284,7 @@
 
   @Test
   public void testFindRecordingByReleaseGroupId() throws Exception {
-    Results res = ss.searchLucene("rgid:\"4444e264-1cf0-4d1f-aca7-2a6f89e34b36\"", 0, 10);
+    Results res = ss.search("rgid:\"4444e264-1cf0-4d1f-aca7-2a6f89e34b36\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -293,7 +293,7 @@
 
   @Test
   public void testFindRecordingByReleaseCountry() throws Exception {
-    Results res = ss.searchLucene("country:UK", 0, 10);
+    Results res = ss.search("country:UK", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -302,7 +302,7 @@
 
   @Test
   public void testFindRecordingByReleaseFormat() throws Exception {
-    Results res = ss.searchLucene("format:Vinyl", 0, 10);
+    Results res = ss.search("format:Vinyl", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -311,7 +311,7 @@
 
   @Test
   public void testFindRecordingByReleaseTypeNumeric() throws Exception {
-    Results res = ss.searchLucene("type:\"4\"", 0, 10);
+    Results res = ss.search("type:\"4\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -320,7 +320,7 @@
 
   @Test
   public void testFindRecordingByNumberOfTracksOnMediumOnRelease() throws Exception {
-    Results res = ss.searchLucene("tracks:10", 0, 10);
+    Results res = ss.search("tracks:10", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -329,7 +329,7 @@
 
   @Test
   public void testFindRecordingByNumberOfTracksOnRelease() throws Exception {
-    Results res = ss.searchLucene("tracksrelease:10", 0, 10);
+    Results res = ss.search("tracksrelease:10", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -338,7 +338,7 @@
 
   @Test
   public void testFindRecordingByDuration() throws Exception {
-    Results res = ss.searchLucene("dur:234000", 0, 10);
+    Results res = ss.search("dur:234000", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -347,7 +347,7 @@
 
   @Test
   public void testFindRecordingByDuration2() throws Exception {
-    Results res = ss.searchLucene("dur:234000", 0, 10);
+    Results res = ss.search("dur:234000", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -356,7 +356,7 @@
 
   @Test
   public void testFindRecordingByISRC() throws Exception {
-    Results res = ss.searchLucene("isrc:123456789", 0, 10);
+    Results res = ss.search("isrc:123456789", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -365,13 +365,13 @@
 
   @Test
   public void testFindRecordingByNonNumericDuration() throws Exception {
-    Results res = ss.searchLucene("dur:fred", 0, 10);
+    Results res = ss.search("dur:fred", 0, 10);
     assertEquals(0, res.totalHits);
   }
 
   @Test
   public void testFindRecordingByTag() throws Exception {
-    Results res = ss.searchLucene("tag:indie", 0, 10);
+    Results res = ss.search("tag:indie", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -380,7 +380,7 @@
 
   @Test
   public void testFindRecordingByDurationRange() throws Exception {
-    Results res = ss.searchLucene("dur:[87 TO 240000]", 0, 10);
+    Results res = ss.search("dur:[87 TO 240000]", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -393,7 +393,7 @@
 
   @Test
   public void testFindRecordingByQdur() throws Exception {
-    Results res = ss.searchLucene("qdur:117", 0, 10);
+    Results res = ss.search("qdur:117", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -407,7 +407,7 @@
 
   @Test
   public void testFindRecordingByTrackPosition() throws Exception {
-    Results res = ss.searchLucene("tnum:5", 0, 10);
+    Results res = ss.search("tnum:5", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -420,7 +420,7 @@
 
   @Test
   public void testFindRecordingByTrackNumber() throws Exception {
-    Results res = ss.searchLucene("number:A4", 0, 10);
+    Results res = ss.search("number:A4", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -433,7 +433,7 @@
 
   @Test
   public void testFindRecordingByPosition() throws Exception {
-    Results res = ss.searchLucene("position:1", 0, 10);
+    Results res = ss.search("position:1", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -446,7 +446,7 @@
 
   @Test
   public void testFindRecordingByReleaseStatus() throws Exception {
-    Results res = ss.searchLucene("status:Official", 0, 10);
+    Results res = ss.search("status:Official", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -459,7 +459,7 @@
 
   @Test
   public void testFindRecordingByReleaseDate() throws Exception {
-    Results res = ss.searchLucene("date:1970-01-01", 0, 10);
+    Results res = ss.search("date:1970-01-01", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -472,7 +472,7 @@
 
   @Test
   public void testFindRecordingByDefault() throws Exception {
-    Results res = ss.searchLucene("\"Gravitational Lenz\"", 0, 10);
+    Results res = ss.search("\"Gravitational Lenz\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -486,13 +486,13 @@
 
   @Test
   public void testNumericRangeQuery() throws Exception {
-    Results res = ss.searchLucene("tracks:[1 TO 10]", 0, 10);
+    Results res = ss.search("tracks:[1 TO 10]", 0, 10);
     assertEquals(1, res.totalHits);
   }
 
   @Test
   public void testFindRecordingByPuid() throws Exception {
-    Results res = ss.searchLucene("puid:1d9e8ed6-3893-4d3b-aa7d-72e79609e386", 0, 10);
+    Results res = ss.search("puid:1d9e8ed6-3893-4d3b-aa7d-72e79609e386", 0, 10);
     assertEquals(1, res.totalHits);
   }
 
@@ -500,7 +500,7 @@
   @Test
   public void testOutputAsMmd1Xml() throws Exception {
 
-    Results res = ss.searchLucene("track:\"Gravitational Lenz\"", 0, 10);
+    Results res = ss.search("track:\"Gravitational Lenz\"", 0, 10);
     ResultsWriter writer = new TrackMmd1XmlWriter();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);
@@ -526,7 +526,7 @@
   @Test
   public void testOutputAsXml() throws Exception {
 
-    Results res = ss.searchLucene("recording:\"Gravitational Lenz\"", 0, 10);
+    Results res = ss.search("recording:\"Gravitational Lenz\"", 0, 10);
     ResultsWriter writer = ss.getMmd2Writer();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);
@@ -572,7 +572,7 @@
   @Test
   public void testOutputJson() throws Exception {
 
-    Results res = ss.searchLucene("recording:\"Gravitational Lenz\"", 0, 10);
+    Results res = ss.search("recording:\"Gravitational Lenz\"", 0, 10);
     ResultsWriter writer = ss.getMmd2Writer();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);
@@ -605,7 +605,7 @@
   @Test
   public void testOutputJsonNew() throws Exception {
 
-    Results res = ss.searchLucene("recording:\"Gravitational Lenz\"", 0, 10);
+    Results res = ss.search("recording:\"Gravitational Lenz\"", 0, 10);
     ResultsWriter writer = ss.getMmd2Writer();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);
@@ -640,7 +640,7 @@
   @Test
   public void testOutputJsonNewPretty() throws Exception {
 
-    Results res = ss.searchLucene("recording:\"Gravitational Lenz\"", 0, 10);
+    Results res = ss.search("recording:\"Gravitational Lenz\"", 0, 10);
     ResultsWriter writer = ss.getMmd2Writer();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);

Modified: search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindReleaseGroupTest.java
===================================================================
--- search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindReleaseGroupTest.java	2012-11-02 18:59:28 UTC (rev 13610)
+++ search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindReleaseGroupTest.java	2012-11-04 22:29:56 UTC (rev 13611)
@@ -34,8 +34,8 @@
  */
 public class FindReleaseGroupTest {
 
-  private SearchServer ss;
-  private SearchServer sd;
+  private AbstractSearchServer ss;
+  private AbstractDismaxSearchServer sd;
 
 
 
@@ -129,12 +129,12 @@
     SearcherManager searcherManager = new SearcherManager(ramDir, new MusicBrainzSearcherFactory(
         ResourceType.RELEASE_GROUP));
     ss = new ReleaseGroupSearch(searcherManager);
-    sd = new ReleaseGroupDismaxSearch(searcherManager);
+    sd = new ReleaseGroupDismaxSearch(ss);
   }
 
   @Test
   public void testFindReleaseGroupById() throws Exception {
-    Results res = ss.searchLucene("rgid:\"2c7d81da-8fc3-3157-99c1-e9195ac92c45\"", 0, 10);
+    Results res = ss.search("rgid:\"2c7d81da-8fc3-3157-99c1-e9195ac92c45\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -146,7 +146,7 @@
 
   @Test
   public void testFindReleaseGroupByName() throws Exception {
-    Results res = ss.searchLucene("releasegroup:\"Nobody's Twisting Your Arm\"", 0, 10);
+    Results res = ss.search("releasegroup:\"Nobody's Twisting Your Arm\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -157,7 +157,7 @@
 
   @Test
   public void testFindReleaseGroupByReleaseStatus() throws Exception {
-    Results res = ss.searchLucene("status:official", 0, 10);
+    Results res = ss.search("status:official", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -167,7 +167,7 @@
   }
   @Test
   public void testFindReleaseGroupByDismax1() throws Exception {
-    Results res = sd.searchLucene("Twisting", 0, 10);
+    Results res = sd.search("Twisting", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -178,7 +178,7 @@
 
   @Test
   public void testFindReleaseGroupByDismax2() throws Exception {
-    Results res = sd.searchLucene("secret", 0, 10);
+    Results res = sd.search("secret", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -189,7 +189,7 @@
 
   @Test
   public void testFindReleaseGroupByDismax3() throws Exception {
-    Results res = sd.searchLucene("wedding", 0, 10);
+    Results res = sd.search("wedding", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -200,9 +200,9 @@
 
   @Test
   public void testFindReleaseGroupByRelease() throws Exception {
-    Results res = ss.searchLucene("releasegroup:\"secret\"", 0, 10);
+    Results res = ss.search("releasegroup:\"secret\"", 0, 10);
     assertEquals(0, res.totalHits);
-    res = ss.searchLucene("release:secret", 0, 10);
+    res = ss.search("release:secret", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -213,15 +213,15 @@
 
   @Test
   public void testFindReleaseByNumberofReleases() throws Exception {
-    Results res = ss.searchLucene("releases:1", 0, 10);
+    Results res = ss.search("releases:1", 0, 10);
     assertEquals(1, res.totalHits);
   }
 
   @Test
   public void testFindReleaseGroupByReleaseId() throws Exception {
-    Results res = ss.searchLucene("releaseid:\"2c7d81da-8fc3-3157-99c1-e9195ac92c46\"", 0, 10);
+    Results res = ss.search("releaseid:\"2c7d81da-8fc3-3157-99c1-e9195ac92c46\"", 0, 10);
     assertEquals(0, res.totalHits);
-    res = ss.searchLucene("release:secret", 0, 10);
+    res = ss.search("release:secret", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -232,7 +232,7 @@
 
   @Test
   public void testFindReleaseGroupByArtist() throws Exception {
-    Results res = ss.searchLucene("artist:\"The Wedding Present\"", 0, 10);
+    Results res = ss.search("artist:\"The Wedding Present\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -245,7 +245,7 @@
 
   @Test
   public void testFindReleaseGroupByType() throws Exception {
-    Results res = ss.searchLucene("type:\"single\"", 0, 10);
+    Results res = ss.search("type:\"single\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -256,7 +256,7 @@
 
   @Test
   public void testFindReleaseGroupByPrimaryType() throws Exception {
-    Results res = ss.searchLucene("primarytype:\"single\"", 0, 10);
+    Results res = ss.search("primarytype:\"single\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -267,7 +267,7 @@
 
   @Test
   public void testFindReleaseGroupBySecondaryType() throws Exception {
-    Results res = ss.searchLucene("secondarytype:\"live\"", 0, 10);
+    Results res = ss.search("secondarytype:\"live\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -278,7 +278,7 @@
 
   @Test
   public void testFindReleaseGroupByNumericType() throws Exception {
-    Results res = ss.searchLucene("type:2", 0, 10);
+    Results res = ss.search("type:2", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -289,9 +289,9 @@
 
   @Test
   public void testFindReleaseGroupByDefault() throws Exception {
-    Results res = ss.searchLucene("\"secret\"", 0, 10);
+    Results res = ss.search("\"secret\"", 0, 10);
     assertEquals(0, res.totalHits);
-    res = ss.searchLucene("\"Nobody's Twisting Your Arm\"", 0, 10);
+    res = ss.search("\"Nobody's Twisting Your Arm\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -305,7 +305,7 @@
 
   @Test
   public void testFindReleaseGroupByArtist2() throws Exception {
-    Results res = ss.searchLucene("artist:\"Erich Kunzel\"", 0, 10);
+    Results res = ss.search("artist:\"Erich Kunzel\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -315,7 +315,7 @@
 
   @Test
   public void testFindReleaseGroupByAllArtist2() throws Exception {
-    Results res = ss.searchLucene("artist:\"Erich Kunzel and Cincinnati Pops\"", 0, 10);
+    Results res = ss.search("artist:\"Erich Kunzel and Cincinnati Pops\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -325,7 +325,7 @@
 
   @Test
   public void testFindReleaseGroupByArtistName() throws Exception {
-    Results res = ss.searchLucene("artistname:\"Erich Kunzel\"", 0, 10);
+    Results res = ss.search("artistname:\"Erich Kunzel\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -335,7 +335,7 @@
 
   @Test
   public void testFindReleaseGroupByAllArtistName() throws Exception {
-    Results res = ss.searchLucene("artistname:\"Erich Kunzel\" AND artistname:\"Cincinnati Pops\"", 0, 10);
+    Results res = ss.search("artistname:\"Erich Kunzel\" AND artistname:\"Cincinnati Pops\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -346,7 +346,7 @@
 
   @Test
   public void testFindReleaseGroupByTag() throws Exception {
-    Results res = ss.searchLucene("tag:indie", 0, 10);
+    Results res = ss.search("tag:indie", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -356,7 +356,7 @@
 
   @Test
   public void testFindReleaseGroupByComment() throws Exception {
-    Results res = ss.searchLucene("comment:demo", 0, 10);
+    Results res = ss.search("comment:demo", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -374,7 +374,7 @@
   @Test
   public void testOutputAsAsMmd1Xml() throws Exception {
 
-    Results res = ss.searchLucene("releasegroup:\"Nobody's Twisting Your Arm\"", 0, 1);
+    Results res = ss.search("releasegroup:\"Nobody's Twisting Your Arm\"", 0, 1);
     ResultsWriter writer = new ReleaseGroupMmd1XmlWriter();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);
@@ -403,7 +403,7 @@
   @Test
   public void testOutputAsAsXml() throws Exception {
 
-    Results res = ss.searchLucene("releasegroup:\"Nobody's Twisting Your Arm\"", 0, 1);
+    Results res = ss.search("releasegroup:\"Nobody's Twisting Your Arm\"", 0, 1);
     ResultsWriter writer = ss.getMmd2Writer();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);
@@ -438,7 +438,7 @@
   @Test
   public void testOutputAsAsMmd1Xml2() throws Exception {
 
-    Results res = ss.searchLucene("releasegroup:Epics", 0, 1);
+    Results res = ss.search("releasegroup:Epics", 0, 1);
     ResultsWriter writer = new ReleaseGroupMmd1XmlWriter();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);
@@ -464,7 +464,7 @@
   @Test
   public void testOutputAsAsXml2() throws Exception {
 
-    Results res = ss.searchLucene("releasegroup:Epics", 0, 1);
+    Results res = ss.search("releasegroup:Epics", 0, 1);
     ResultsWriter writer = ss.getMmd2Writer();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);
@@ -494,7 +494,7 @@
   @Test
   public void testOutputJson() throws Exception {
 
-    Results res = ss.searchLucene("releasegroup:Epics", 0, 10);
+    Results res = ss.search("releasegroup:Epics", 0, 10);
     ResultsWriter writer = ss.getMmd2Writer();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);
@@ -513,7 +513,7 @@
 
   @Test
   public void testOutputJsonMultiple() throws Exception {
-    Results res = ss.searchLucene("rgid:2c7d81da-8fc3-3157-99c1-e9195ac92c45  OR artist:kunzel", 0, 10);
+    Results res = ss.search("rgid:2c7d81da-8fc3-3157-99c1-e9195ac92c45  OR artist:kunzel", 0, 10);
     org.musicbrainz.search.servlet.mmd2.ResultsWriter writer = ss.getMmd2Writer();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);
@@ -530,7 +530,7 @@
   @Test
   public void testOutputJsonNew() throws Exception {
 
-    Results res = ss.searchLucene("releasegroup:Epics", 0, 10);
+    Results res = ss.search("releasegroup:Epics", 0, 10);
     ResultsWriter writer = ss.getMmd2Writer();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);
@@ -558,7 +558,7 @@
   @Test
   public void testOutputJsonNewPretty() throws Exception {
 
-    Results res = ss.searchLucene("releasegroup:Epics", 0, 10);
+    Results res = ss.search("releasegroup:Epics", 0, 10);
     ResultsWriter writer = ss.getMmd2Writer();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);
@@ -574,7 +574,7 @@
   @Test
   public void testOutputJsonNewPretty2() throws Exception {
 
-    Results res = ss.searchLucene("rgid:2c7d81da-8fc3-3157-99c1-e9195ac92c45", 0, 10);
+    Results res = ss.search("rgid:2c7d81da-8fc3-3157-99c1-e9195ac92c45", 0, 10);
     ResultsWriter writer = ss.getMmd2Writer();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);

Modified: search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindReleaseTest.java
===================================================================
--- search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindReleaseTest.java	2012-11-02 18:59:28 UTC (rev 13610)
+++ search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindReleaseTest.java	2012-11-04 22:29:56 UTC (rev 13611)
@@ -41,8 +41,8 @@
  */
 public class FindReleaseTest {
 
-  private SearchServer ss;
-  private SearchServer sd;
+  private AbstractSearchServer ss;
+  private AbstractDismaxSearchServer sd;
 
   @Before
   public void setUp() throws Exception {
@@ -180,7 +180,7 @@
 
     SearcherManager searcherManager = new SearcherManager(ramDir, new MusicBrainzSearcherFactory(ResourceType.RELEASE));
     ss = new ReleaseSearch(searcherManager);
-    sd = new ReleaseDismaxSearch(searcherManager);
+    sd = new ReleaseDismaxSearch(ss);
   }
 
   @Test
@@ -532,7 +532,7 @@
 
   @Test
   public void testFindReleaseByTypeLowercase() throws Exception {
-    Results res = ss.searchLucene("type:\"compilation\"", 0, 10);
+    Results res = ss.search("type:\"compilation\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -543,7 +543,7 @@
 
   @Test
   public void testFindReleaseBySecondaryTypeFirst() throws Exception {
-    Results res = ss.searchLucene("secondarytype:\"Live\"", 0, 10);
+    Results res = ss.search("secondarytype:\"Live\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -555,7 +555,7 @@
 
   @Test
   public void testFindReleaseBySecondaryTypeSecond() throws Exception {
-    Results res = ss.searchLucene("secondarytype:\"Compilation\"", 0, 10);
+    Results res = ss.search("secondarytype:\"Compilation\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -567,7 +567,7 @@
 
   @Test
   public void testFindReleaseByTypeTitleCase() throws Exception {
-    Results res = ss.searchLucene("type:\"Compilation\"", 0, 10);
+    Results res = ss.search("type:\"Compilation\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -579,7 +579,7 @@
 
   @Test
   public void testFindReleaseByRgid() throws Exception {
-    Results res = ss.searchLucene("rgid:1d9e8ed6-3893-4d3b-aa7d-6cd79609e333", 0, 10);
+    Results res = ss.search("rgid:1d9e8ed6-3893-4d3b-aa7d-6cd79609e333", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -591,7 +591,7 @@
 
   @Test
   public void testFindReleaseByNumericType() throws Exception {
-    Results res = ss.searchLucene("type:4", 0, 10);
+    Results res = ss.search("type:4", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -603,7 +603,7 @@
 
   @Test
   public void testFindReleaseByStatusLowercase() throws Exception {
-    Results res = ss.searchLucene("status:\"official\"", 0, 10);
+    Results res = ss.search("status:\"official\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -615,7 +615,7 @@
 
   @Test
   public void testFindReleaseByStatusTitleCase() throws Exception {
-    Results res = ss.searchLucene("status:\"Official\"", 0, 10);
+    Results res = ss.search("status:\"Official\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -627,7 +627,7 @@
 
   @Test
   public void testFindReleaseByNumericstatus() throws Exception {
-    Results res = ss.searchLucene("status:1", 0, 10);
+    Results res = ss.search("status:1", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -639,7 +639,7 @@
 
   @Test
   public void testFindReleaseGroupByArtist2() throws Exception {
-    Results res = ss.searchLucene("artist:\"Erich Kunzel\"", 0, 10);
+    Results res = ss.search("artist:\"Erich Kunzel\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -650,7 +650,7 @@
 
   @Test
   public void testFindReleaseGroupByAllArtist2() throws Exception {
-    Results res = ss.searchLucene("artist:\"Erich Kunzel and Cincinnati Pops\"", 0, 10);
+    Results res = ss.search("artist:\"Erich Kunzel and Cincinnati Pops\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -660,25 +660,25 @@
 
   @Test
   public void testFindReleaseByNumberofMediums() throws Exception {
-    Results res = ss.searchLucene("mediums:2", 0, 10);
+    Results res = ss.search("mediums:2", 0, 10);
     assertEquals(1, res.totalHits);
   }
 
   @Test
   public void testFindReleaseByLabelId() throws Exception {
-    Results res = ss.searchLucene("laid:c1dfaf9c-d498-4f6c-b040-f7714315fcea", 0, 10);
+    Results res = ss.search("laid:c1dfaf9c-d498-4f6c-b040-f7714315fcea", 0, 10);
     assertEquals(1, res.totalHits);
   }
 
   @Test
   public void testNumericRangeQuery() throws Exception {
-    Results res = ss.searchLucene("tracksmedium:[7 TO 17]", 0, 10);
+    Results res = ss.search("tracksmedium:[7 TO 17]", 0, 10);
     assertEquals(2, res.totalHits);
   }
 
   @Test
   public void testFindReleaseByPuid() throws Exception {
-    Results res = ss.searchLucene("puid:668f3a22-03e8-e3cd-55e4-2e9a0906419a", 0, 10);
+    Results res = ss.search("puid:668f3a22-03e8-e3cd-55e4-2e9a0906419a", 0, 10);
     assertEquals(1, res.totalHits);
   }
 
@@ -691,7 +691,7 @@
   @Test
   public void testOutputAsMmdv1Xml() throws Exception {
 
-    Results res = ss.searchLucene("release:\"Our Glorious 5 Year Plan\"", 0, 1);
+    Results res = ss.search("release:\"Our Glorious 5 Year Plan\"", 0, 1);
     ResultsWriter writer = new ReleaseMmd1XmlWriter();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);
@@ -730,7 +730,7 @@
   @Test
   public void testOutputAsXml() throws Exception {
 
-    Results res = ss.searchLucene("release:\"Our Glorious 5 Year Plan\"", 0, 1);
+    Results res = ss.search("release:\"Our Glorious 5 Year Plan\"", 0, 1);
     ResultsWriter writer = ss.getMmd2Writer();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);
@@ -770,7 +770,7 @@
   @Test
   public void testOutputJson() throws Exception {
 
-    Results res = ss.searchLucene("release:\"Our Glorious 5 Year Plan\"", 0, 10);
+    Results res = ss.search("release:\"Our Glorious 5 Year Plan\"", 0, 10);
     ResultsWriter writer = ss.getMmd2Writer();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);
@@ -798,7 +798,7 @@
   @Test
   public void testOutputJsonNew() throws Exception {
 
-    Results res = ss.searchLucene("release:\"Our Glorious 5 Year Plan\"", 0, 10);
+    Results res = ss.search("release:\"Our Glorious 5 Year Plan\"", 0, 10);
     ResultsWriter writer = ss.getMmd2Writer();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);
@@ -831,7 +831,7 @@
   @Test
   public void testOutputJsonNewPretty() throws Exception {
 
-    Results res = ss.searchLucene("release:\"Our Glorious 5 Year Plan\"", 0, 10);
+    Results res = ss.search("release:\"Our Glorious 5 Year Plan\"", 0, 10);
     ResultsWriter writer = ss.getMmd2Writer();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);

Modified: search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindTagTest.java
===================================================================
--- search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindTagTest.java	2012-11-02 18:59:28 UTC (rev 13610)
+++ search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindTagTest.java	2012-11-04 22:29:56 UTC (rev 13611)
@@ -23,7 +23,7 @@
 
 public class FindTagTest {
 
-  private SearchServer ss;
+  private AbstractSearchServer ss;
 
   @Before
   public void setUp() throws Exception {
@@ -58,7 +58,7 @@
 
   @Test
   public void testFindTagByName() throws Exception {
-    Results res = ss.searchLucene("tag:rock", 0, 10);
+    Results res = ss.search("tag:rock", 0, 10);
     assertEquals(2, res.totalHits);
     Result result = res.results.get(0);
 
@@ -73,7 +73,7 @@
   @Test
   public void testOutputAsXml() throws Exception {
 
-    Results res = ss.searchLucene("tag:rock", 0, 10);
+    Results res = ss.search("tag:rock", 0, 10);
     ResultsWriter writer = ss.getMmd2Writer();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);
@@ -90,7 +90,7 @@
   @Test
   public void testOutputAsJson() throws Exception {
 
-    Results res = ss.searchLucene("tag:rock", 0, 10);
+    Results res = ss.search("tag:rock", 0, 10);
     ResultsWriter writer = ss.getMmd2Writer();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);
@@ -111,7 +111,7 @@
   @Test
   public void testOutputAsJsonNew() throws Exception {
 
-    Results res = ss.searchLucene("tag:rock", 0, 10);
+    Results res = ss.search("tag:rock", 0, 10);
     ResultsWriter writer = ss.getMmd2Writer();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);
@@ -132,7 +132,7 @@
   @Test
   public void testOutputAsJsonNewPretty() throws Exception {
 
-    Results res = ss.searchLucene("tag:rock", 0, 10);
+    Results res = ss.search("tag:rock", 0, 10);
     ResultsWriter writer = ss.getMmd2Writer();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);

Modified: search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindWorkTest.java
===================================================================
--- search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindWorkTest.java	2012-11-02 18:59:28 UTC (rev 13610)
+++ search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindWorkTest.java	2012-11-04 22:29:56 UTC (rev 13611)
@@ -34,8 +34,8 @@
  */
 public class FindWorkTest {
 
-  private SearchServer ss;
-  private SearchServer sd;
+  private AbstractSearchServer ss;
+  private AbstractDismaxSearchServer sd;
 
   @Before
   public void setUp() throws Exception {
@@ -103,12 +103,12 @@
     writer.close();
     SearcherManager searcherManager = new SearcherManager(ramDir, new MusicBrainzSearcherFactory(ResourceType.WORK));
     ss = new WorkSearch(searcherManager);
-    sd = new WorkDismaxSearch(searcherManager);
+    sd = new WorkDismaxSearch(ss);
   }
 
   @Test
   public void testFindWorkById() throws Exception {
-    Results res = ss.searchLucene("wid:\"4ff89cf0-86af-11de-90ed-001fc6f176ff\"", 0, 10);
+    Results res = ss.search("wid:\"4ff89cf0-86af-11de-90ed-001fc6f176ff\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -118,7 +118,7 @@
 
   @Test
   public void testFindWorkByName() throws Exception {
-    Results res = ss.searchLucene("work:\"Symphony No. 5\"", 0, 10);
+    Results res = ss.search("work:\"Symphony No. 5\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -128,7 +128,7 @@
 
   @Test
   public void testFindWorkByLyricsLang() throws Exception {
-    Results res = ss.searchLucene("lang:eng", 0, 10);
+    Results res = ss.search("lang:eng", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -138,7 +138,7 @@
 
   @Test
   public void testFindWorkByDismax1() throws Exception {
-    Results res = sd.searchLucene("Symphony No. 5", 0, 10);
+    Results res = sd.search("Symphony No. 5", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -148,7 +148,7 @@
 
   @Test
   public void testFindWorkByDismax2() throws Exception {
-    Results res = sd.searchLucene("Symphony", 0, 10);
+    Results res = sd.search("Symphony", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -158,7 +158,7 @@
 
   @Test
   public void testFindWorkByComment() throws Exception {
-    Results res = ss.searchLucene("comment:demo", 0, 10);
+    Results res = ss.search("comment:demo", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -168,7 +168,7 @@
 
   @Test
   public void testFindWorkByArtist() throws Exception {
-    Results res = ss.searchLucene("artist:\"Пётр Ильич Чайковский\"", 0, 10);
+    Results res = ss.search("artist:\"Пётр Ильич Чайковский\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -179,7 +179,7 @@
 
   @Test
   public void testFindWorkByISWC() throws Exception {
-    Results res = ss.searchLucene("iswc:\"T-101779304-1\"", 0, 10);
+    Results res = ss.search("iswc:\"T-101779304-1\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -189,7 +189,7 @@
 
   @Test
   public void testFindWorkByType() throws Exception {
-    Results res = ss.searchLucene("type:\"opera\"", 0, 10);
+    Results res = ss.search("type:\"opera\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -199,7 +199,7 @@
 
   @Test
   public void testFindWorkByAlias() throws Exception {
-    Results res = ss.searchLucene("alias:symp5", 0, 10);
+    Results res = ss.search("alias:symp5", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -209,7 +209,7 @@
 
   @Test
   public void testFindWorkByTag() throws Exception {
-    Results res = ss.searchLucene("tag:classical", 0, 10);
+    Results res = ss.search("tag:classical", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -219,7 +219,7 @@
 
   @Test
   public void testFindWorkByDefaultUsingName() throws Exception {
-    Results res = ss.searchLucene("\"Symphony No. 5\"", 0, 10);
+    Results res = ss.search("\"Symphony No. 5\"", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -229,7 +229,7 @@
 
   @Test
   public void testFindWorkByDefaultUsingAlias() throws Exception {
-    Results res = ss.searchLucene("symp5", 0, 10);
+    Results res = ss.search("symp5", 0, 10);
     assertEquals(1, res.totalHits);
     Result result = res.results.get(0);
     MbDocument doc = result.doc;
@@ -246,7 +246,7 @@
   @Test
   public void testOutputAsXml() throws Exception {
 
-    Results res = ss.searchLucene("work:\"Symphony No. 5\"", 0, 1);
+    Results res = ss.search("work:\"Symphony No. 5\"", 0, 1);
     ResultsWriter writer = ss.getMmd2Writer();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);
@@ -285,7 +285,7 @@
   @Test
   public void testOutputAsJson() throws Exception {
 
-    Results res = ss.searchLucene("work:\"Symphony No. 5\"", 0, 1);
+    Results res = ss.search("work:\"Symphony No. 5\"", 0, 1);
     ResultsWriter writer = ss.getMmd2Writer();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);
@@ -324,7 +324,7 @@
   @Test
   public void testOutputAsJsonNew() throws Exception {
 
-    Results res = ss.searchLucene("work:\"Symphony No. 5\"", 0, 1);
+    Results res = ss.search("work:\"Symphony No. 5\"", 0, 1);
     ResultsWriter writer = ss.getMmd2Writer();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);
@@ -361,7 +361,7 @@
   @Test
   public void testOutputAsJsonNewPretty() throws Exception {
 
-    Results res = ss.searchLucene("work:\"Symphony No. 5\"", 0, 1);
+    Results res = ss.search("work:\"Symphony No. 5\"", 0, 1);
     ResultsWriter writer = ss.getMmd2Writer();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);

Modified: search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/IssueSearch167RecordingTest.java
===================================================================
--- search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/IssueSearch167RecordingTest.java	2012-11-02 18:59:28 UTC (rev 13610)
+++ search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/IssueSearch167RecordingTest.java	2012-11-04 22:29:56 UTC (rev 13611)
@@ -27,7 +27,7 @@
 
 public class IssueSearch167RecordingTest {
 
-  private SearchServer sd;
+  private AbstractDismaxSearchServer sd;
 
   @Before
   public void setUp() throws Exception {
@@ -131,7 +131,7 @@
     writer.close();
     SearcherManager searcherManager = new SearcherManager(ramDir,
         new MusicBrainzSearcherFactory(ResourceType.RECORDING));
-    sd = new RecordingDismaxSearch(searcherManager);
+    sd = new RecordingDismaxSearch(new RecordingSearch(searcherManager));
   }
 
   /**

Modified: search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/IssueSearch167Test.java
===================================================================
--- search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/IssueSearch167Test.java	2012-11-02 18:59:28 UTC (rev 13610)
+++ search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/IssueSearch167Test.java	2012-11-04 22:29:56 UTC (rev 13611)
@@ -29,7 +29,7 @@
  */
 public class IssueSearch167Test {
 
-  private SearchServer sd;
+  private AbstractDismaxSearchServer sd;
 
   @Before
   public void setUp() throws Exception {
@@ -175,7 +175,7 @@
 
     writer.close();
     SearcherManager searcherManager = new SearcherManager(ramDir, new MusicBrainzSearcherFactory(ResourceType.ARTIST));
-    sd = new ArtistDismaxSearch(searcherManager);
+    sd = new ArtistDismaxSearch(new ArtistSearch(searcherManager));
   }
 
   @Test

Modified: search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/IssueSearch173Test.java
===================================================================
--- search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/IssueSearch173Test.java	2012-11-02 18:59:28 UTC (rev 13610)
+++ search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/IssueSearch173Test.java	2012-11-04 22:29:56 UTC (rev 13611)
@@ -30,8 +30,8 @@
 
 public class IssueSearch173Test  {
 
-  private SearchServer ss;
-  private SearchServer sd;
+  private AbstractSearchServer ss;
+  private AbstractDismaxSearchServer sd;
 
   @Before
   public void setUp() throws Exception {
@@ -69,10 +69,8 @@
     assertEquals("ad17t", tr.term().text());
 
     SearcherManager searcherManager = new SearcherManager(ramDir, new MusicBrainzSearcherFactory(ResourceType.RELEASE));
-    sd = new ReleaseDismaxSearch(searcherManager);
     ss = new ReleaseSearch(searcherManager);
-
-
+    sd = new ReleaseDismaxSearch(ss);
   }
 
   @Test

Modified: search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/IssueSearch174Test.java
===================================================================
--- search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/IssueSearch174Test.java	2012-11-02 18:59:28 UTC (rev 13610)
+++ search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/IssueSearch174Test.java	2012-11-04 22:29:56 UTC (rev 13611)
@@ -30,7 +30,7 @@
 
 public class IssueSearch174Test extends TestCase {
 
-  private SearchServer ss;
+  private AbstractSearchServer ss;
 
   @Override
   @Before

Modified: search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/RecordingIT.java
===================================================================
--- search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/RecordingIT.java	2012-11-02 18:59:28 UTC (rev 13610)
+++ search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/RecordingIT.java	2012-11-04 22:29:56 UTC (rev 13611)
@@ -1,75 +1,71 @@
 package org.musicbrainz.search.servlet;
 
+import static org.junit.Assert.assertTrue;
+
+import java.util.List;
+
 import org.junit.Test;
 import org.musicbrainz.mmd2.Metadata;
 import org.musicbrainz.mmd2.Recording;
 
-import java.util.List;
 
-import static org.junit.Assert.assertTrue;
-
-
 public class RecordingIT extends AbstractIntegration {
 
-    public RecordingIT() {
-        super();
-    }
+  public RecordingIT() {
+    super();
+  }
 
-    @Test
-    public void testSearchForRecording() throws Exception {
-        Metadata metadata = doSearch("http://localhost:8080/?type=recording&query=fred");
-        assertTrue(metadata.getRecordingList().getRecording().size()>0);
-    }
+  @Test
+  public void testSearchForRecording() throws Exception {
+    Metadata metadata = doSearch("http://localhost:8080/?type=recording&query=fred");
+    assertTrue(metadata.getRecordingList().getRecording().size()>0);
+  }
 
-    @Test
-    public void testSearchForTrackV1() throws Exception {
-        com.jthink.brainz.mmd.Metadata metadata = doSearchV1("http://localhost:8080/?type=track&query=fred&version=1");
-        assertTrue(metadata.getTrackList().getTrack().size()>0);
-    }
+  @Test
+  public void testSearchForTrackV1() throws Exception {
+    com.jthink.brainz.mmd.Metadata metadata = doSearchV1("http://localhost:8080/?type=track&query=fred&version=1");
+    assertTrue(metadata.getTrackList().getTrack().size()>0);
+  }
 
-    @Test
-    public void testSearchForRecordingDismax() throws Exception {
-        Metadata metadata = doSearch("http://localhost:8080/?dismax=true&type=recording&query=fred");
-        assertTrue(metadata.getRecordingList().getRecording().size()>0);
-    }
+  @Test
+  public void testSearchForRecordingDismax() throws Exception {
+    Metadata metadata = doSearch("http://localhost:8080/?dismax=true&type=recording&query=fred");
+    assertTrue(metadata.getRecordingList().getRecording().size()>0);
+  }
 
-    @Test
-    public void testSearchForRecordingDismaxPopularTerm() throws Exception {
-        Metadata metadata = doSearch("http://localhost:8080/?dismax=true&type=recording&query=love");
-        assertTrue(metadata.getRecordingList().getRecording().size()>0);
-    }
+  @Test
+  public void testSearchForRecordingDismaxPopularTerm() throws Exception {
+    Metadata metadata = doSearch("http://localhost:8080/?dismax=true&type=recording&query=love");
+    assertTrue(metadata.getRecordingList().getRecording().size()>0);
+  }
 
-    /** Will not do fuzzy because term length to short
-     *
-     * @throws Exception
-     */
-    @Test
-    public void testSearchForRecordingDismaxNoFuzzy() throws Exception {
-        Metadata metadata = doSearch("http://localhost:8080/?dismax=true&type=recording&query=the");
-        assertTrue(metadata.getRecordingList().getRecording().size()>0);
-    }
+  /** Will not do fuzzy because term length to short
+   *
+   * @throws Exception
+   */
+  @Test
+  public void testSearchForRecordingDismaxNoFuzzy() throws Exception {
+    Metadata metadata = doSearch("http://localhost:8080/?dismax=true&type=recording&query=the");
+    assertTrue(metadata.getRecordingList().getRecording().size()>0);
+  }
 
-    @Test
-    public void testSearchForRecordingDismaxMultiTerm() throws Exception {
-        Metadata metadata = doSearch("http://localhost:8080/?dismax=true&type=recording&query=love+rocket");
-        assertTrue(metadata.getRecordingList().getRecording().size()>0);
+  @Test
+  public void testSearchForRecordingDismaxMultiTerm() throws Exception {
+    Metadata metadata = doSearch("http://localhost:8080/?dismax=true&type=recording&query=love+rocket");
+    assertTrue(metadata.getRecordingList().getRecording().size()>0);
 
-    }
+  }
 
-    @Test
-    public void testSearchForRecordingWildcardScoringComparedToExactMatch() throws Exception {
-        Metadata metadata = doSearch("http://localhost:8080/?dismax=true&type=recording&query=luve");
-        assertTrue(metadata.getRecordingList().getRecording().size()>0);
-        List<Recording> recordings = metadata.getRecordingList().getRecording();
-        for(Recording r:recordings)
-        {
-            System.out.println(
-                    r.getScore()+":"
-                    +r.getTitle()+":"
-                    +r.getArtistCredit().getNameCredit().get(0).getArtist().getName()+":"
-                    +r.getReleaseList().getRelease().get(0).getTitle()
-                    );
-        }
-
+  @Test
+  public void testSearchForRecordingWildcardScoringComparedToExactMatch() throws Exception {
+    Metadata metadata = doSearch("http://localhost:8080/?dismax=true&type=recording&query=luve");
+    assertTrue(metadata.getRecordingList().getRecording().size()>0);
+    List<Recording> recordings = metadata.getRecordingList().getRecording();
+    for(Recording r:recordings)
+    {
+      System.out.println(r.getScore() + ":" + r.getTitle() + ":"
+          + r.getArtistCredit().getNameCredit().get(0).getArtist().getName());
     }
+
+  }
 }
\ No newline at end of file

Modified: search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/ReloadIndexesTest.java
===================================================================
--- search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/ReloadIndexesTest.java	2012-11-02 18:59:28 UTC (rev 13610)
+++ search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/ReloadIndexesTest.java	2012-11-04 22:29:56 UTC (rev 13611)
@@ -1,13 +1,16 @@
 package org.musicbrainz.search.servlet;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 import java.util.Date;
 
 import org.apache.lucene.analysis.Analyzer;
 import org.apache.lucene.index.IndexWriter;
 import org.apache.lucene.index.IndexWriterConfig;
+import org.apache.lucene.index.Term;
 import org.apache.lucene.search.SearcherManager;
+import org.apache.lucene.search.TermQuery;
 import org.apache.lucene.store.RAMDirectory;
 import org.apache.lucene.util.NumericUtils;
 import org.junit.Before;
@@ -22,8 +25,8 @@
 
 public class ReloadIndexesTest {
 
-  private SearchServer ss;
-  private SearchServer sd;
+  private AbstractSearchServer ss;
+  private AbstractDismaxSearchServer sd;
   private RAMDirectory ramDir;
 
   @Before
@@ -32,7 +35,7 @@
     addArtist1();
     SearcherManager searcherManager = new SearcherManager(ramDir, new MusicBrainzSearcherFactory(ResourceType.ARTIST));
     ss = new ArtistSearch(searcherManager);
-    sd = new ArtistDismaxSearch(searcherManager);
+    sd = new ArtistDismaxSearch(ss);
   }
 
   private void addArtist1() throws Exception {
@@ -90,14 +93,59 @@
       writer.addDocument(doc.getLuceneDocument());
     }
 
+    {
+      Term term = new Term(MetaIndexField.META.getName(), MetaIndexField.META_VALUE);
+      TermQuery query = new TermQuery(term);
+      writer.deleteDocuments(query);
+
+      MbDocument doc = new MbDocument();
+      doc.addField(MetaIndexField.META, MetaIndexField.META_VALUE);
+      doc.addField(MetaIndexField.LAST_UPDATED, NumericUtils.longToPrefixCoded(new Date().getTime()));
+      writer.addDocument(doc.getLuceneDocument());
+    }
+
     writer.commit();
     writer.close();
   }
 
+  private void updateIndexMetadata() throws Exception {
+    Analyzer analyzer = DatabaseIndex.getAnalyzer(ArtistIndexField.class);
+    IndexWriterConfig writerConfig = new IndexWriterConfig(LuceneVersion.LUCENE_VERSION, analyzer);
+    writerConfig.setSimilarity(new MusicbrainzSimilarity());
+    IndexWriter writer = new IndexWriter(ramDir, writerConfig);
+    // General Purpose Artist
+    {
+      MbDocument doc = new MbDocument();
+      doc.addField(ArtistIndexField.ARTIST_ID, "4302e264-1cf0-4d1f-aca7-2a6f89e34b36");
+      doc.addField(ArtistIndexField.ARTIST, "Farming Incident");
+      doc.addField(ArtistIndexField.SORTNAME, "Incident, Farming");
+      doc.addField(ArtistIndexField.BEGIN, "1999-04");
+      doc.addField(ArtistIndexField.TYPE, "Group");
+      doc.addField(ArtistIndexField.COMMENT, "the real one");
+      doc.addField(ArtistIndexField.COUNTRY, "AF");
+      doc.addField(ArtistIndexField.GENDER, "male");
+      doc.addField(ArtistIndexField.TAG, "thrash");
+      doc.addField(ArtistIndexField.TAGCOUNT, "5");
+      doc.addField(ArtistIndexField.TAG, "güth");
+      doc.addField(ArtistIndexField.TAGCOUNT, "11");
+      doc.addField(ArtistIndexField.IPI, "1001");
+      writer.addDocument(doc.getLuceneDocument());
+    }
+
+    {
+      MbDocument doc = new MbDocument();
+      doc.addField(MetaIndexField.META, MetaIndexField.META_VALUE);
+      doc.addField(MetaIndexField.LAST_UPDATED, NumericUtils.longToPrefixCoded(new Date().getTime()));
+      writer.addDocument(doc.getLuceneDocument());
+    }
+
+    writer.close();
+  }
+
   @Test
   public void testReloadDoesNothingIfIndexNotChanged() throws Exception {
     ss.reloadIndex();
-    Results res = ss.searchLucene("type:\"group\"", 0, 10);
+    Results res = ss.search("type:\"group\"", 0, 10);
     assertEquals(1, res.totalHits);
   }
 
@@ -105,19 +153,19 @@
   public void testReloadUpdatesReaderIfIndexChanged() throws Exception {
 
     Results res;
-    res = ss.searchLucene("type:\"group\"", 0, 10);
+    res = ss.search("type:\"group\"", 0, 10);
     assertEquals(1, res.totalHits);
 
     // Testing reloading if there are no changes
     ss.reloadIndex();
 
-    res = ss.searchLucene("type:\"group\"", 0, 10);
+    res = ss.search("type:\"group\"", 0, 10);
     assertEquals(1, res.totalHits);
 
     addArtist2();
     ss.reloadIndex();
 
-    res = ss.searchLucene("type:\"group\"", 0, 10);
+    res = ss.search("type:\"group\"", 0, 10);
     assertEquals(2, res.totalHits);
   }
 
@@ -125,7 +173,7 @@
   public void testDismaxSearchServerUpdatesToo() throws Exception {
 
     Results res;
-    res = sd.searchLucene("Bunnymen", 0, 10);
+    res = sd.search("Bunnymen", 0, 10);
     assertEquals(0, res.totalHits);
 
     addArtist2();
@@ -133,11 +181,38 @@
     // underlying searchmanager
     ss.reloadIndex();
 
-    res = sd.searchLucene("Bunnymen", 0, 10);
+    res = sd.search("Bunnymen", 0, 10);
     assertEquals(1, res.totalHits);
   }
 
   @Test
+  public void testDismaxSearchUsesSameResultWriter() throws Exception {
+
+    final String WS_VERSION_1 = "1";
+    final String WS_VERSION_2 = "2";
+
+    // Writers should be the same between SearchServer and DismaxSearchServer
+    assertEquals(ss.getWriter(WS_VERSION_1), sd.getWriter(WS_VERSION_1));
+    assertEquals(ss.getWriter(WS_VERSION_2), sd.getWriter(WS_VERSION_2));
+
+    // So last update date should be identical
+    Date initialDate = ss.getWriter(WS_VERSION_2).getLastUpdateDate();
+    assertEquals(initialDate, sd.getWriter(WS_VERSION_2).getLastUpdateDate());
+
+    // Reloading with no changes
+    ss.reloadIndex();
+    assertEquals(initialDate, sd.getWriter(WS_VERSION_2).getLastUpdateDate());
+    assertEquals(ss.getWriter(WS_VERSION_2).getLastUpdateDate(), sd.getWriter(WS_VERSION_2).getLastUpdateDate());
+
+    // Reloading no changes
+    addArtist2();
+    ss.reloadIndex();
+    // Last update date should be still be identical between both searchers, but has changed since index reload
+    assertEquals(ss.getWriter(WS_VERSION_2).getLastUpdateDate(), sd.getWriter(WS_VERSION_2).getLastUpdateDate());
+    assertTrue(initialDate.before(sd.getWriter(WS_VERSION_2).getLastUpdateDate()));
+  }
+
+  @Test
   public void testInitUpdatesReaderIfIndexChanged() throws Exception {
 
     addArtist2();
@@ -145,7 +220,7 @@
         new MusicBrainzSearcherFactory(ResourceType.RECORDING));
     ss = new ArtistSearch(searcherManager);
 
-    Results res = ss.searchLucene("type:\"group\"", 0, 10);
+    Results res = ss.search("type:\"group\"", 0, 10);
     assertEquals(2, res.totalHits);
   }
 }


_______________________________________________
MusicBrainz-commits mailing list
[email protected]
http://lists.musicbrainz.org/mailman/listinfo/musicbrainz-commits
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.