您的位置:首页 > 其它

Lucene 7.1如何利用RMI进行远程搜索

2017-11-27 09:57 531 查看
    第一,

        lucene 5之前有个Searchable对象,通过这个对象,我们可以返回IndexSearch对象;比如说用户端让每个远程终端都返回一个IndexReader对象,然后在用户端这边调用MultiReader对象合并IndexRead对象,以实现分布式多终端远程搜索;但是较新的Lucene版本,本人没有找到类似的对象。如果使用自己创建的对象,运行时会报:
writing aborted; java.io.NotSerializableException;就是说对象必须是可以序列化的,但是Lucene用于搜索的关键对象都是不可序列化的,因此没法返回对象。
   第二,但是好在即使不能序列化,RMI远程搜索可以返回String对象,当然这样是有缺陷的--------当你使用分布式多个远程终端进行搜索时,需要对结果进行合并。

第三,不多说了,直接上代码
首先是server端

package test.lucene.lucene1.remote;

import java.net.MalformedURLException;

import java.rmi.Naming;

import java.rmi.RemoteException;

import java.rmi.registry.LocateRegistry;

public class SearchServer {
public static void main(String[] args) {
try {

SearcherFactory sf=new SearcherFactoryImpl();
int port=8879;
LocateRegistry.createRegistry(port);
Naming.rebind("//localhost:"+port+"/searcherFactory",sf);
System.out.println("-----------INFO:远程searcherFactory对象绑定成功!");
} catch (RemoteException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
}

        

        
}

}

然后是client

package test.lucene.lucene1.remote;

import java.io.IOException;

import java.net.MalformedURLException;

import java.rmi.Naming;

import java.rmi.NotBoundException;

import java.rmi.RemoteException;

import org.apache.lucene.queryparser.classic.ParseException;

public class SearchClient {
public static void main(String[] args) throws ParseException {
//在RMI服务注册表中查找名称为searcherFactory的对象,并调用其上的方法
try {
SearcherFactory sf=(SearcherFactory) Naming.lookup("//localhost/searcherFactory");
sf.search("编辑");
} catch (MalformedURLException | RemoteException | NotBoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

}

完整代码见http://download.csdn.net/download/mumushuiding/10133920
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: