我们都在各种网站上看到过。糟糕的搜索工具。它们时刻提醒着你,在构建网站或应用程序时,搜索并不是一件可以掉以轻心的事情。搜索不再只是谷歌的游戏。当一个名为Lucene的Java库被引入Apache生态系统,然后在此基础上构建Solr时,开放源码开发人员开始在定制搜索特性方面大显身手。
在本文中,我们将向您介绍Apache Solr以及使用它构建的大量应用程序。内容划分如下:
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其中列出了书籍,文章和更多有趣的材料。
作为第一步,您应该遵循official tutorial它涵盖了任何搜索用例的基本方面:
要遵循official tutorial你必须下载Java和最新版本的Solrhere有关安装的详细信息,请访问official description。
接下来,您必须决定为Solr选择哪种web服务器。在官方教程中,使用了Jetty,但您也可以使用Tomcat。选择Tomcat时,请确保setting the UTF-8 encoding in the server.xml我还将研究Solr的不同版本,这些版本对初学者来说可能会很困惑:
如果您遵循了official tutorial您已经将一些XML文件推入到Solr索引中。这个过程称为索引或进给。在Solr中获取数据的可能性有很多:
在索引之前,您必须决定哪些数据字段应该是可搜索的,以及如何对这些字段进行索引。例如,当您有一个包含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的帮助下从几种不同的文档类型中提取相关信息。
为了进行调试,在浏览器中使用HTTP接口来查询Solr并获取XML是非常方便的。使用Firefox可以很好地显示XML:
您还可以使用velocity contribution,一个跨浏览器工具,将在关于“搜索应用程序原型”若要查询索引,可以使用dismax handler或者standard query handler。你可以filter和sort结果:
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,collapsing和suffix query support。
现在我将列出Solr的一些有趣的用例--没有特定的顺序。看看这个开源搜索服务器有多强大,多灵活。
这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项目:
这hathi trust项目是一个很好的例子,证明了Solr搜索大型数字图书馆的能力。直接报价from the article:“。。。我们的一百万本书索引的索引超过200千兆字节。。。所以我们期望最终为一千万本书提供2TB的索引”
库的其他示例:
使用Solr实现自动建议(也称为自动完成)的方法主要有两种:通过facets或通过NGramFilterFactory。
要把它推向极致,您可以完全在RAM中使用Lucene索引。德国一家大型音乐商店采用了这种方法。
自动建议的实际示例:
当提到空间搜索时,人们想到的是基于地理的应用。使用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关于‘近相似搜索和剽窃分析’的更多信息。
DuckDuckGo存在made with open source它的“零点击”信息是在Solr的帮助下使用dismax查询处理程序完成的:
该特性的索引包含1800万个文档,大小约为12GB。对于这种情况Gabriel不得不调优Solr:“关于Solr,我有两个与大多数站点不同的要求:
我通过a)调整dismax和schema和b)在顶部添加我自己的相关性过滤器来解决这些问题,该过滤器可以重新排序,并且在各种情况下不显示任何内容。其余的都用调优的开源产品来完成。再次引用Gabriel的话:“主要结果是很多东西的混合,包括外部API,例如Bing,WolframAlpha,Yahoo,我自己的索引和负面索引(垃圾邮件删除)等等。我正在处理一堆不同类型的数据。“查看other cool features例如privacy或者bang searches。
Carrot2是Solr的“贡献插件”之一。使用Carrot2,您可以支持clustering:“聚类是将一组观测数据分配到子集(称为聚类)中,使得同一聚类中的观测数据在某种意义上是相似的。“看一些research papers regarding clustering here。这是one visual example当对搜索“Pannous”应用聚类时-our company:
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')。
Feeding log files并在接近实时的情况下搜索它们表明,Solr可以处理大量数据并快速查询数据。我已经建立了一个简单的项目similar things,但是loggly已经做了更多的工作来使相同的任务成为实时的和分布式的。您需要将写索引保持得尽可能小,否则提交时间会增加得太多。Loggly每5分钟创建一个新的Solr索引,并在使用distributed capabilities of Solr!他们正在合并核心以保持索引数量较少,但这并不像听起来那么简单。手表this video了解他们工作的细节。
Solandra结合了Solr和分布式数据库Cassandra这是Facebook为其收件箱搜索而创建的,后来被开源。目前,Solandra并不打算用于生产。仍然有一些bug和distributed limitations of Solr也适用于索兰德拉。t开发人员正在工作very hard让Solandra好起来。
Jetwick现在可以通过Solandra运行,只需更改solrconfig.xml。Solandra还具有实时性的优点(无需优化,无需提交!)并且在不涉及任何主要设置的情况下进行分发。Solr云也是如此。
Solr provides facets,这样就可以很容易地向用户展示一些有用的过滤器选项,就像“Drupal Integration”示例中所展示的那样。Like I described earlier,甚至可以浏览一个深度类别树。这里的主要优点是类别取决于查询。这样,用户可以使用您提供的类别树进一步过滤搜索结果。下面是一个例子,该功能是为德国最大的二手商店之一实现的。点击“Schauspieler”可以看到它的子项:
其他商店:
您可能已经注意到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更具可伸缩性,我需要决定选择以下哪个分发选项:
具有许多方面的其他示例:
Plaxo.com该公司目前由康卡斯特公司拥有,为超过4000万人提供网址,并在Solr的帮助下通过这些网址提供智能搜索。Plaxo试图通过博客文章,推文等获取联系人的最新“社交”信息。Plaxo还tries to reduce duplicates。
一些用户报告说,他们已经从商业搜索解决方案迁移到FAST或者Google Search Appliance(GSA)到Solr(或Lucene)。迁移的原因各不相同:FAST drops linux support和Google can make integration problems.对我来说,主要原因是Solr不是一个黑盒子--您可以更快地调整源代码,维护旧版本并修复您的bug!
在已经集成的velocity插件和数据导入处理程序的帮助下,可以在几个小时内为您的搜索创建一个应用程序原型。Solr的下一个版本使velocity的使用变得更容易。GUI可通过http://localhost:port/solr/browse
如果您是Ruby on Rails用户,您可以查看Flare.若要了解有关搜索应用程序原型的更多信息,请查看this video introduction再来看看these slides.
假设你是一个新的谷歌,你有很多不同类型的数据可以显示,例如“新闻”,“视频”,“音乐”,“地图”,“购物”等等。其中一些类型只能从一些遗留系统中检索,您只希望根据业务逻辑显示最合适的类型。例如。包含“纽约”的查询应该导致从“地图”中选择结果,但“纽约客”应该更喜欢从“购物”类型中选择结果。
使用Solr,您可以设置这样一个白名单索引,它将帮助决定哪种类型对搜索查询更重要。例如,如果您为“购物”类型获得更多或更多相关结果,那么您应该更喜欢该类型的结果。如果没有白名单索引,即将所有数据放在单独的索引或系统中,几乎不可能比较相关性。
可以使用白名单索引,如下面的步骤所示。1.查询白名单索引,2。决定要显示的数据类型,请按3。查询子系统和4。仅显示所选类型的结果。
Solr对于科学应用程序也很有用,例如DNA search系统。我相信Solr也可以用于完全不同的字母,这样你就可以查询核苷酸序列--而不是单词--来得到匹配的基因,并确定该序列发生在哪个生物体中,类似于Blast。
你可以利用的另一个想法是建立一个非常个性化的搜索。每个用户都可以拖放自己选择的网站,并在之后进行查询。例如,经常我只需要stackoverflow,一些Wiki和一些带有预期结果的邮件列表,但正常的网络搜索引擎(Google,Bing等)给我的结果太过杂乱。
对于未来基于Solr的应用程序,我的最终想法可能是桌面搜索的Lucene/Solr实现。Solr的方面对于快速过滤不同的源(文件,文件夹,书签,手册页。。。)特别方便。在那些额外凌乱的台式机上涉水将是一个很棒的方式。
下一次你想问题的时候,想想Solr!即使您不懂Java,即使您知道什么都没有关于搜索:Solr应该在您的工具箱中。Solr不仅提供专业的全文搜索,它还可以为您的应用程序添加有价值的特性。我在这篇文章中涵盖了其中的一些,但我确信仍有一些激动人心的可能性在等着你!