绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
solr查询工作原理深入内幕-1
2019-12-18 18:04:47

1.什么是Lucene?

作为一个开放源代码项目,Lucene从问世之后,引发了开放源代码社群的巨大反响,程序员们不仅使用它构建具体的全文检索应用,而且将之集成到各种系统软件中去,以及构建Web应用,甚至某些商业软件也采用了Lucene作为其内部全文检索子系统的核心。apache软件基金会的网站使用了Lucene作为全文检索的引擎,IBM的开源软件eclipse的2.1版本中也采用了Lucene作为帮助子系统的全文索引引擎,相应的IBM的商业软件Web Sphere中也采用了Lucene。Lucene以其开放源代码的特性、优异的索引结构、良好的系统架构获得了越来越多的应用。

Lucene作为一个全文检索引擎,其具有如下突出的优点:

(1)索引文件格式独立于应用平台。Lucene定义了一套以8位字节为基础的索引文件格式,使得兼容系统或者不同平台的应用能够共享建立的索引文件。

(2)在传统全文检索引擎的倒排索引的基础上,实现了分块索引,能够针对新的文件建立小文件索引,提升索引速度。然后通过与原有索引的合并,达到优化的目的。

(3)的面向对象的系统架构,使得对于Lucene扩展的学习难度降低,方便扩充新功能。

(4)设计了独立于语言和文件格式的文本分析接口,索引器通过接受Token流完成索引文件的创立,用户扩展新的语言和文件格式,只需要实现文本分析的接口。

(5)已经默认实现了一套强大的查询引擎,用户无需自己编写代码即使系统可获得强大的查询能力,Lucene的查询实现中默认实现了布尔操作、模糊查询(Fuzzy Search)、分组查询等等。

2.什么是solr?

为什么要solr:

  solr是将整个索引操作功能封装好了的搜索引擎系统(企业级搜索引擎产品)

  solr可以部署到单独的服务器上(WEB服务),它可以提供服务,我们的业务系统就只要发送请求,接收响应即可,降低了业务系统的负载

  solr部署在专门的服务器上,它的索引库就不会受业务系统服务器存储空间的限制

  solr支持分布式集群,索引服务的容量和能力可以线性扩展

solr的工作机制:

  solr就是在lucene工具包的基础之上进行了封装,而且是以web服务的形式对外提供索引功能

  业务系统需要使用到索引的功能(建索引,查索引)时,只要发出http请求,并将返回数据进行解析即可

Solr 是Apache下的一个开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。

Solr可以独立运行,运行在Jetty、Tomcat等这些Servlet容器中,Solr 索引的实现方法很简单,用 POST 方法向 Solr 服务器发送一个描述 Field 及其内容的 XML 文档,Solr根据xml文档添加、删除、更新索引 。Solr 搜索只需要发送 HTTP GET 请求,然后对 Solr 返回Xml、json等格式的查询结果进行解析,组织页面布局。Solr不提供构建UI的功能,Solr提供了一个管理界面,通过管理界面可以查询Solr的配置和运行情况。

3.lucene和solr的关系

solr是门户,lucene是底层基础,solr和lucene的关系正如hadoop和hdfs的关系。

 4.Jetty是什么?

  Jetty 是一个开源的servlet容器,它为基于Java的web容器,例如JSP和servlet提供运行环境。Jetty是使用Java语言编写的,它的API以一组JAR包的形式发布。开发人员可以将Jetty容器实例化成一个对象,可以迅速为一些独立运行(stand-alone)的Java应用提供网络和web连接。

5.流程概况

 

6.Jetty接收请求并处理

设置本地调试见所示

StartSolrJetty.java

publicstaticvoid main( String[] args )

{

//System.setProperty("solr.solr.home", "../../../example/solr"); Server server =new Server();

ServerConnector connector =newServerConnector(server,new HttpConnectionFactory());

// Set some timeout options to make debugging easier.connector.setIdleTimeout(1000 * 60 * 60);

connector.setSoLingerTime(-1);

connector.setPort(8983);

server.setConnectors(new Connector[] { connector });

WebAppContext bb =new WebAppContext();

bb.setServer(server);

bb.setContextPath("/solr");

bb.setWar("solr/webapp/web");//// START JMX SERVER// if( true ) {// MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();// MBeanContainer mBeanContainer = new MBeanContainer(mBeanServer);// server.getContainer().addEventListener(mBeanContainer);// mBeanContainer.start();// }

server.setHandler(bb);

try {

System.out.println(">>> STARTING EMBEDDED JETTY SERVER, PRESS ANY KEY TO STOP");

server.start();

while(System.in.available() == 0) {

Thread.sleep(5000);

}

server.stop();

server.join();

}

catch (Exception e) {

e.printStackTrace();

System.exit(100);

}

}

其中,Server是http服务器,聚合了Connector(http请求接收器)和请求处理器Hanlder,Server本身是一个handler和一个线程池,Connector使用线程池来调用handle方法。

/** Jetty HTTP Servlet Server.

* This class is the main class for the Jetty HTTP Servlet server.

* It aggregates Connectors (HTTP request receivers) and request Handlers.

* The server is itself a handler and a ThreadPool. Connectors use the ThreadPool methods

* to run jobs that will eventually call the handle method.

*/

其工作流程如下图所示

分享好友

分享这个小栈给你的朋友们,一起进步吧。

凉城时光
创建时间:2019-12-04 10:57:57
朋友 我们一起聊运维
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

栈主、嘉宾

查看更多
  • 我没
    栈主

小栈成员

查看更多
  • unnamed personq
  • unnamed personq
  • bluetooth
  • amadan
戳我,来吐槽~