Apache Solr:开始吧,兴奋吧!


我们都在各种网站上看到过。糟糕的搜索工具。它们时刻提醒着你,在构建网站或应用程序时,搜索并不是一件可以掉以轻心的事情。搜索不再只是谷歌的游戏。当一个名为Lucene的Java库被引入Apache生态系统,然后在此基础上构建Solr时,开放源码开发人员开始在定制搜索特性方面大显身手。

在本文中,我们将向您介绍Apache Solr以及使用它构建的大量应用程序。内容划分如下:

  1. 介绍

  2. 安装Solr

    1. Installation
    2. Indexing
    3. Querying

  3. 应用程序

    1. Drupal integration
    2. Hathi Trust
    3. Auto Suggestions
    4. Spatial search applications
    5. DuckDuckGo
    6. Clustering Support with Carrot2
    7. Near Real Time Search
    8. Loggly = Full text search in logs
    9. Solandra = Solr + Cassandra
    10. Category Browsing via Facets
    11. Jetwick - Open Twitter Search
    12. Plaxo - Online Address Management
    13. Replace FAST or Google Search
    14. Search Application Prototyping
    15. Solr as a Whitelist
    16. Future

  4. 摘要


1.介绍

Apache Solr是一个开源搜索服务器。它基于名为Apache Lucene。所以Solr基本上是一个HTTP包装器inverted index由Lucene提供。倒排索引可以被看作是一个单词列表,其中每个单词条目链接到它所包含的文档。这样,获取搜索查询“dzone”的所有文档就是一个简单的“get”操作。

Solr在企业项目中的一个优点是您不需要任何Java代码,尽管必须安装Java本身。如果您不确定何时使用Solr,何时使用Lucene,这些answers能帮上忙。如果您需要从网站构建Solr索引,那么您应该研究一下名为Apache Nutch在创建自己的解决方案之前。

为了确信Solr实际上在很多企业项目中使用,请看一看这个惊人的公共项目列表projects powered by Solr。如果您遇到问题,则mailing list或者stackoverflow会帮你的。为了使介绍更完整,我想提一下my personal link list以及resources page其中列出了书籍,文章和更多有趣的材料。


2.安装Solr

2.1.安装

作为第一步,您应该遵循official tutorial它涵盖了任何搜索用例的基本方面:

  • 索引-将任何形式的数据获取到Solr中。示例:JSON,XML,CSV和SQL数据库。这一步创建倒排索引--即,它将每个术语链接到它的文档。
  • 查询-要求Solr返回与用户查询最相关的文档


要遵循official tutorial你必须下载Java和最新版本的Solrhere有关安装的详细信息,请访问official description

接下来,您必须决定为Solr选择哪种web服务器。在官方教程中,使用了Jetty,但您也可以使用Tomcat。选择Tomcat时,请确保setting the UTF-8 encoding in the server.xml我还将研究Solr的不同版本,这些版本对初学者来说可能会很困惑:

  • 目前的稳定版本是1.4.1。如果你需要一个稳定的搜索,而不需要一个最新的功能,就使用这个。
  • Solr的下一个稳定版本将是3.x
  • 为了达到与Lucene相同的版本,将跳过1.5和2.x版本。
  • Version 4.x是最新的发展分支。Solr4.x处理高级功能,如language detection通过提卡,spatial search,results grouping(按字段分组/折叠),一个新的“面向用户”查询解析器(edismax handler),接近实时索引,极大的模糊搜索性能改进,SQL JOIN-a like feature还有更多。

2.2.索引编制

如果您遵循了official tutorial您已经将一些XML文件推入到Solr索引中。这个过程称为索引或进给。在Solr中获取数据的可能性有很多:

  • 使用Data Import Handler(DIH)是一个非常强大的非语言选项。它允许您从SQL数据库,CSV,XML文件,RSS提要,电子邮件等进行读取,而无需任何Java知识。DIH处理完全导入和增量导入。当只添加,更新或删除少量文档时,这是必要的。
  • HTTP interface从post工具中使用,您已经在正式教程中使用过该工具来索引XML文件。
  • Client libraries在不同的语言中也存在。(例如,用于Java(SolrJ)或Python)。


在索引之前,您必须决定哪些数据字段应该是可搜索的,以及如何对这些字段进行索引。例如,当您有一个包含HTML的字段时,您可以strip irrelevant characters,将文本标记为“可搜索术语”,将术语小写,最后stem the terms。相反,如果您的字段中包含不应解释的文本(例如URL),则您将shouldn't tokenize it并使用默认字段类型字符串。请参阅the official documentation关于schema.xml文件中的字段和字段类型定义。

在设计索引时,请记住Mauricio“该文档就是您要搜索的内容。“例如,如果您有tweet,并且您想搜索相似的用户,您需要设置一个用户索引--从tweet创建。这样,每个文档都是一个用户。如果您想搜索tweet,那么设置一个tweet索引;然后每个文档都是一个tweet.当然,您可以使用multi index options索尔的。

还请注意,有一个名为Solr Cell它允许您在Tika的帮助下从几种不同的文档类型中提取相关信息。

2.3.正在查询

为了进行调试,在浏览器中使用HTTP接口来查询Solr并获取XML是非常方便的。使用Firefox可以很好地显示XML:


您还可以使用velocity contribution,一个跨浏览器工具,将在关于“搜索应用程序原型”若要查询索引,可以使用dismax handler或者standard query handler。你可以filtersort结果:

q=superman&fq=type:book&sort=price asc  

你也可以做 a lot more;另一个概念是促进。在Solr中,可以在索引和查询时增强。如希望使用标题中的术语,请写:

q=title:superman^2 subject:superman

使用dismax请求处理程序时,写入:

q=superman&qf=title^2 subject

查看所有各种查询选项,例如fuzzy search,spellcheck query input,facets,collapsingsuffix query support

3.申请

现在我将列出Solr的一些有趣的用例--没有特定的顺序。看看这个开源搜索服务器有多强大,多灵活。

3.1.Drupal集成

Drupal integration可以看作是将Solr集成到PHP项目中的通用用例。对于PHP集成,您可以选择使用HTTP接口查询和检索XML或JSON。或使用PHP solr client library。这是a screenshot of a typical faceted search in drupal


有关分面搜索的更多信息,请参阅wiki of Solr

更多集成了Solr的PHP项目:


3.2.哈西信托

hathi trust项目是一个很好的例子,证明了Solr搜索大型数字图书馆的能力。直接报价from the article“。。。我们的一百万本书索引的索引超过200千兆字节。。。所以我们期望最终为一千万本书提供2TB的索引”

库的其他示例:


3.3.自动建议

使用Solr实现自动建议(也称为自动完成)的方法主要有两种:通过facets或通过NGramFilterFactory


要把它推向极致,您可以完全在RAM中使用Lucene索引。德国一家大型音乐商店采用了这种方法。

自动建议的实际示例:


3.4.空间搜索应用

当提到空间搜索时,人们想到的是基于地理的应用。使用Solr,this ordinary use case是可以实现的。这方面的一些示例如下


Spatial search can be useful in many different ways
:用于生物信息学,指纹搜索,面部搜索等(获取文档的指纹对于重复检测很重要)。最简单的方法是implemented in Jetwick以减少重复的tweet,但这会产生O(n)的性能,其中n是被查询项的数目。这对于10个或更少的术语来说是可以的,但是在O(1)时它会变得更好!其思想是使用一个特殊的散列集来获取所有相似的文档。这种技术称为local sensitive hashing。阅读this nice paper关于‘近相似搜索和剽窃分析’的更多信息。

3.5.鸭子

DuckDuckGo存在made with open source它的“零点击”信息是在Solr的帮助下使用dismax查询处理程序完成的:


该特性的索引包含1800万个文档,大小约为12GB。对于这种情况
Gabriel不得不调优Solr:“关于Solr,我有两个与大多数站点不同的要求:

  1. 我通常只显示一个结果,如果你点击它们,有时会在下面显示几个结果。因此,第一个结果是人们所期望的,这真的很重要。
  2. 误报在0点击中是非常糟糕的,所以我需要一种方法来不显示任何东西,如果一个匹配不是太相关。


我通过a)调整dismax和schema和b)在顶部添加我自己的相关性过滤器来解决这些问题,该过滤器可以重新排序,并且在各种情况下不显示任何内容。
其余的都用调优的开源产品来完成。再次引用Gabriel的话:“主要结果是很多东西的混合,包括外部API,例如Bing,WolframAlpha,Yahoo,我自己的索引和负面索引(垃圾邮件删除)等等。我正在处理一堆不同类型的数据。“查看other cool features例如privacy或者bang searches

3.6.Carrot2的集群支持

Carrot2是Solr的“贡献插件”之一。使用Carrot2,您可以支持clustering:“聚类是将一组观测数据分配到子集(称为聚类)中,使得同一聚类中的观测数据在某种意义上是相似的。“看一些research papers regarding clustering here。这是one visual example当对搜索“Pannous”应用聚类时-our company


3.7.近实时搜索

Solr还不是实时的,但是您可以tune Solr达到接近实时的程度,这意味着即使需要频繁更新,文档在被索引后可搜索所需的时间(“实时延迟时间”)也少于60秒。要使其工作,您可以设置两个索引。一个用于索引器的只写索引“W”和一个用于应用程序的只读索引“R”。索引R指的是相同的data directory必须在R的solrconfig.xml中通过以下方式定义:

<dataDir>/pathTo/IndexW/data/</dataDir>

为了确保您的用户和R索引看到W的索引文档,您必须每60秒触发一次空提交:

wget -q http://localhost:port/solr/update?stream.body=%3Ccommit/%3E -O /dev/null

每次触发这样的提交时,就会创建一个没有任何缓存条目的新搜索器。这可能会损害访问者在此提交后直接访问空缓存的性能,但是您可以在newSearcher entry在solrconfig.xml中。此外,autowarmCount property需要调优,这将用来自旧条目的新闻搜索器填充缓存。

另外,看看这篇文章'Scaling Lucene and Solr',专家们详细解释了如何处理大索引(=>'sharding')和如何处理高查询量(=>'replicating')。

3.8.Loggly=日志中的全文搜索

Feeding log files并在接近实时的情况下搜索它们表明,Solr可以处理大量数据并快速查询数据。我已经建立了一个简单的项目similar things,但是loggly已经做了更多的工作来使相同的任务成为实时的和分布式的。您需要将写索引保持得尽可能小,否则提交时间会增加得太多。Loggly每5分钟创建一个新的Solr索引,并在使用distributed capabilities of Solr!他们正在合并核心以保持索引数量较少,但这并不像听起来那么简单。手表this video了解他们工作的细节。

3.9.Solandra=Solr+Cassandra

Solandra结合了Solr和分布式数据库Cassandra这是Facebook为其收件箱搜索而创建的,后来被开源。目前,Solandra并不打算用于生产。仍然有一些bug和distributed limitations of Solr也适用于索兰德拉。t开发人员正在工作very hard让Solandra好起来。

Jetwick现在可以通过Solandra运行,只需更改solrconfig.xml。Solandra还具有实时性的优点(无需优化,无需提交!)并且在不涉及任何主要设置的情况下进行分发。Solr云也是如此。

3.10.通过刻面进行类别浏览

Solr provides facets,这样就可以很容易地向用户展示一些有用的过滤器选项,就像“Drupal Integration”示例中所展示的那样。Like I described earlier,甚至可以浏览一个深度类别树。这里的主要优点是类别取决于查询。这样,用户可以使用您提供的类别树进一步过滤搜索结果。下面是一个例子,该功能是为德国最大的二手商店之一实现的。点击“Schauspieler”可以看到它的子项:


其他商店:



3.11.Jetwick-打开Twitter搜索

您可能已经注意到Twitter正在使用Lucene under the hood。Twitter有一个非常极端的用例:每秒超过1000条tweet,每秒超过12000个查询,但实时延迟在10秒以下!然而,在我看来,该卷的相关性往往不是那么好。Twitter搜索经常包含大量重复和噪音。

减少这种情况was one reason我在业余时间创造了Jetwick。我在这里提到Jetwick是因为它extreme use of facets它向用户提供所有筛选器。Facets用于类似RSS的功能(保存的搜索),左侧的各种过滤器(如语言和retweet-count),右侧的过滤器用于获取趋势词和链接:


为了使Jetwick更具可伸缩性,我需要决定选择以下哪个分发选项:


具有许多方面的其他示例:


  • CNET Reviews-产品评论。电子评论,计算机评论和更多。
  • Shopper.com-比较价格和购买电脑,手机,数码相机和更多。
  • Zappos-鞋子和衣服。
  • manta.com-找公司。与客户联系。


3.12.Plaxo-在线地址管理

Plaxo.com该公司目前由康卡斯特公司拥有,为超过4000万人提供网址,并在Solr的帮助下通过这些网址提供智能搜索。Plaxo试图通过博客文章,推文等获取联系人的最新“社交”信息。Plaxo还tries to reduce duplicates

3.13.替换FAST或Google Search

一些用户报告说,他们已经从商业搜索解决方案迁移到FAST或者Google Search Appliance(GSA)到Solr(或Lucene)。迁移的原因各不相同:FAST drops linux supportGoogle can make integration problems.对我来说,主要原因是Solr不是一个黑盒子--您可以更快地调整源代码,维护旧版本并修复您的bug!

3.14.搜索应用程序原型

在已经集成的velocity插件和数据导入处理程序的帮助下,可以在几个小时内为您的搜索创建一个应用程序原型。Solr的下一个版本使velocity的使用变得更容易。GUI可通过http://localhost:port/solr/browse


如果您是Ruby on Rails用户,您可以查看
Flare.若要了解有关搜索应用程序原型的更多信息,请查看this video introduction再来看看these slides.


3.15.Solr作为白名单

假设你是一个新的谷歌,你有很多不同类型的数据可以显示,例如“新闻”,“视频”,“音乐”,“地图”,“购物”等等。其中一些类型只能从一些遗留系统中检索,您只希望根据业务逻辑显示最合适的类型。例如。包含“纽约”的查询应该导致从“地图”中选择结果,但“纽约客”应该更喜欢从“购物”类型中选择结果。

使用Solr,您可以设置这样一个白名单索引,它将帮助决定哪种类型对搜索查询更重要。例如,如果您为“购物”类型获得更多或更多相关结果,那么您应该更喜欢该类型的结果。如果没有白名单索引,即将所有数据放在单独的索引或系统中,几乎不可能比较相关性。

可以使用白名单索引,如下面的步骤所示。1.查询白名单索引,2。决定要显示的数据类型,请按3。查询子系统和4。仅显示所选类型的结果。

3.16.未来

Solr对于科学应用程序也很有用,例如DNA search系统。我相信Solr也可以用于完全不同的字母,这样你就可以查询核苷酸序列--而不是单词--来得到匹配的基因,并确定该序列发生在哪个生物体中,类似于Blast

你可以利用的另一个想法是建立一个非常个性化的搜索。每个用户都可以拖放自己选择的网站,并在之后进行查询。例如,经常我只需要stackoverflow,一些Wiki和一些带有预期结果的邮件列表,但正常的网络搜索引擎(Google,Bing等)给我的结果太过杂乱。

对于未来基于Solr的应用程序,我的最终想法可能是桌面搜索的Lucene/Solr实现。Solr的方面对于快速过滤不同的源(文件,文件夹,书签,手册页。。。)特别方便。在那些额外凌乱的台式机上涉水将是一个很棒的方式。

4.摘要

下一次你想问题的时候,想想Solr!即使您不懂Java,即使您知道什么都没有关于搜索:Solr应该在您的工具箱中。Solr不仅提供专业的全文搜索,它还可以为您的应用程序添加有价值的特性。我在这篇文章中涵盖了其中的一些,但我确信仍有一些激动人心的可能性在等着你!