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


    第一,

        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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值