Hi, I studied "5.6 Searching across multiple Lucene indexes 178" in <<Lucene in action>>.
I have 2 remote serarch computers(SearchServer) work as index servers and search requests from a search client(SearchClient,the 3rd computer). An error message, "Exception in thread "main" java.rmi.UnmarshalException", was thrown out. Does someone can explain with sample code about multiple-index servers and multiple indexes in single server? Thanks. Below are the source code: ////////////////SearchServer.java///////////////////// import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.ParallelMultiSearcher; import org.apache.lucene.search.RemoteSearchable; import org.apache.lucene.search.Searchable; import org.apache.lucene.search.Searcher; import org.apache.lucene.search.MultiSearcher; import java.io.File; import java.io.IOException; import java.rmi.Naming; import java.rmi.registry.LocateRegistry; public class SearchServer { private static final String m_disk1="/usr/local/eBingBong/"; //English private static final String m_disk2="/backup/eBingBong/"; //other languages private static Searchable []m_searchables; public static void main(String[] args) throws Exception { if (args.length != 1) { System.err.println("Usage: SearchServer <IP>"); System.err.println("java -Xms1000m -Xmx2000m SearchServer 161"); System.exit(-1); } FindIndex(); LocateRegistry.createRegistry(1099); Searcher multiSearcher = new MultiSearcher(m_searchables); RemoteSearchable multiImpl = new RemoteSearchable(multiSearcher); //Naming.rebind("//192.168.10.175/LIA_Multi", multiImpl); Naming.rebind("//192.168.10." +args[0] + "/LIA_Multi", multiImpl); Searcher parallelSearcher = new ParallelMultiSearcher (m_searchables); RemoteSearchable parallelImpl = new RemoteSearchable (parallelSearcher); //Naming.rebind("//192.168.10.175/LIA_Parallel", parallelImpl); Naming.rebind("//192.168.10." + args[0] + "/LIA_Parallel", parallelImpl); System.out.println("Server started"); } private static void FindIndex() { File []file=new File[10]; File tmpFile; int i=0; tmpFile=new File(m_disk1,"english"); if(tmpFile.exists()) file[i+ +]=tmpFile; tmpFile=new File(m_disk2,"chinese"); if(tmpFile.exists()) file[i+ +]=tmpFile; tmpFile=new File(m_disk2,"japanese"); if(tmpFile.exists()) file[i+ +]=tmpFile; tmpFile=new File(m_disk2,"korean"); if(tmpFile.exists()) file[i+ +]=tmpFile; tmpFile=new File(m_disk2,"czech"); if(tmpFile.exists()) file[i+ +]=tmpFile; tmpFile=new File(m_disk2,"german"); if(tmpFile.exists()) file[i+ +]=tmpFile; tmpFile=new File(m_disk2,"greek"); if(tmpFile.exists()) file[i+ +]=tmpFile; tmpFile=new File(m_disk2,"french"); if(tmpFile.exists()) file[i+ +]=tmpFile; tmpFile=new File(m_disk2,"dutch"); if(tmpFile.exists()) file[i+ +]=tmpFile; tmpFile=new File(m_disk2,"russian"); if(tmpFile.exists()) file[i+ +]=tmpFile; m_searchables = new Searchable[i]; for (int j = 0; j < i; j++) { try { m_searchables[j] = new IndexSearcher(file[j].getAbsolutePath()); } catch(IOException e) {} System.out.println(file[j].getAbsolutePath()); } } } /////////////////////////SearchClient.java/////////////////////// import org.apache.lucene.document.Document; import org.apache.lucene.index.Term; import org.apache.lucene.search.Hits; import org.apache.lucene.search.MultiSearcher; import org.apache.lucene.search.ParallelMultiSearcher; import org.apache.lucene.search.Searchable; import org.apache.lucene.search.TermQuery; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.search.Query; import org.apache.lucene.queryParser.QueryParser; import java.rmi.Naming; import java.util.Date; import java.util.HashMap; public class SearchClient { private static HashMap searcherCache = new HashMap(); private static String[] m_args; public static void main(String[] args) throws Exception { m_args=args; if (args.length < 2) { System.err.println("Usage: SearchClient <query> <IP1> <IP2> <...>"); System.err.println("java -Xms1000m -Xmx2000m SearchClient oil 161 163"); System.exit(-1); } String word = args[0]; // warm up the VM with several of each search for (int i=0; i < 5; i++) { search("LIA_Multi", word); search("LIA_Parallel", word); } } private static void search(String name, String word) throws Exception { //TermQuery query = new TermQuery(new Term("contents", word));//content //contents QueryParser parser=new QueryParser("content",new StandardAnalyzer ()); //parser.setOperator(QueryParser.DEFAULT_OPERATOR_AND); parser.setDefaultOperator(QueryParser.AND_OPERATOR); Query query = parser.parse(word); System.out.println(query.toString()); //MultiSearcher searcher = (MultiSearcher) searcherCache.get (name); ParallelMultiSearcher searcher = (ParallelMultiSearcher) searcherCache.get(name); if (searcher == null) { int serverSum=m_args.length-1; Searchable []remoteSearch=new Searchable[serverSum]; //remoteSearch[0]=lookupRemote("//192.168.10.156/",name); //remoteSearch[1]=lookupRemote("//192.168.10.175/",name); for(int suc=0; suc<serverSum; suc++) remoteSearch[suc]=lookupRemote ("//192.168.10."+m_args[suc+1]+"/",name); //searcher = new MultiSearcher(remoteSearch); searcher = new ParallelMultiSearcher(remoteSearch); searcherCache.put(name, searcher); } long begin = new Date().getTime(); Hits hits = searcher.search(query); long end = new Date().getTime(); System.out.println("Searched " + name + " for '" + word + "' (" + (end - begin) + " ms): "); if (hits.length() == 0) { System.out.print("<NONE FOUND>"); return; } else System.out.println("hit="+hits.length()); //for (int i = 0; i < hits.length(); i++) { for (int i = 0; i < 3; i++) { Document doc = hits.doc(i); //java.io.InvalidClassException: org.apache.lucene.document.Document; //String[] values = doc.getValues("syn"); //for (int j = 0; j < values.length; j++) { //System.out.print(values[j] + " "); System.out.println(doc.get("url")+"\n"); } System.out.println(hits.length()); //System.out.println(); // DO NOT CLOSE searcher! } private static Searchable lookupRemote(String IP, String name) throws Exception { return (Searchable) Naming.lookup(IP + name); } } -- Su.Cheng <[EMAIL PROTECTED]> --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]