`

Solr 3.6.1 官方教程翻译(转载)

 
阅读更多

文章来源:http://alexhi.sinaapp.com/archives/500

【1:开始及建立索引】

在了解 Solr 前推荐先了解一下 Lucene,Solr 基于 Lucene。

内容是官方教程,原文链接见:Solr Tutorial。我对其进行了简单的翻译。

文中使用的是 Linux 系统,我针对 Win 系列在翻译上做了些调整。例如文中提到的部分命令行在 UNIX,Cygwin 或者 MacOS 中的 shell 运行的语句,我就直接写对应的我在 CMD 下的语句了,如果想看 shell 命令,可以去英文原文中找找。

概览

本文档通过使用示例程序和示例数据来运行 Solr ,展示了一系列基础的操作。

需要

在开始这个教程前,你需要准备:

  1. Java 1.5 或更新,你可以从这几个地方拿到:Oracle,Open JDK,IBM,你也可以在命令行中运行java -version来看看自己机器上的版本。Gnu 的 GCJ 不支持 Solr。
  2. 一个Solr 发布包

开始

推荐你在同一台机子上看这个教程并运行示例程序,这样教程里面提及的链接就能正确地指向到你的 Solr 服务器。

Solr 可以运行在你喜欢的任何一个 Java Servlet 容器中,不过为了使这个教程简洁,我们将安装运行 Jetty(开源的servlet容器),运行 Solr WAR,加载示例配置文件这一套流程封装在 start.jar 中了,我们需要做的,就是简单的运行这个 jar 包。

那么具体操作是:解压 Solr 发布包,放置到合适位置。然后打开子文件夹”example“,再运行文件夹里的 start.jar。我的目录是 G:\Java_Info\apache-solr-3.6.1\example。

C:\Users\AlexWu>cd G:\Java_Info\apache-solr-3.6.1\example

C:\Users\AlexWu>g:

G:\Java_Info\apache-solr-3.6.1\example>java -jar start.jar

你运行了上面的语句后,程序将会在端口 8983 上启动 Jetty 应用服务器,并且在你的终端上将展现来自 Solr 的日志信息。

现在,你就可以登录浏览器访问http://localhost:8983/solr/admin/,看看 Solr 的运行情况了,OK,现在你已经开启 Solr 服务了。

建立索引

你的 Solr 服务器已经运行了,不过它还没有包含任何数据,你可以通过 POST请求来更新 Solr 索引,POST请求内容中可能包含添加、更新、删除文档的指令,或者提交待补充、删除和优化的索引的命令。

在子文件夹”exampledocs“中包含了符合 Solr 要求的指令类型示例,另外也包含了一个用于从命令行将这些示例指令 POST 给 Solr 服务器的 java 工具 jar,post.jar。

我们打开一个新的命令行窗口,进入目录后运行命令“java -jar -post.jar”,命令后面跟些这个文件夹下的 XML 文件,效果如下:

G:\Java_Info\apache-solr-3.6.1\example\exampledocs>java -jar post.jar solr.xml m
onitor.xml
SimplePostTool: version 1.4
SimplePostTool: POSTing files to http://localhost:8983/solr/update..
SimplePostTool: POSTing file solr.xml
SimplePostTool: POSTing file monitor.xml
SimplePostTool: COMMITting Solr index changes..

你已经成功的在 Solr 中建立了两个文档的索引,现在你可以使用浏览器上 Solr 的管理员界面的“Make a Query”接口来搜索“solr”了,点击“Search”按钮,页面将会带你到下面这个 URL 中:

http://localhost:8983/solr/select/?q=solr&start=0&rows=10&indent=on

返回的文本是包含了搜索结果的 XML 信息。

当然你也可以为所有的示例数据建立索引,运行下面的命令(假设你的命令行终端支持 *.xml 注释):

G:\Java_Info\apache-solr-3.6.1\example\exampledocs>java -jar post.jar *.xml
SimplePostTool: version 1.4
SimplePostTool: POSTing files to http://localhost:8983/solr/update..
SimplePostTool: POSTing file gb18030-example.xml
SimplePostTool: POSTing file hd.xml
SimplePostTool: POSTing file ipod_other.xml
SimplePostTool: POSTing file ipod_video.xml
SimplePostTool: POSTing file mem.xml
SimplePostTool: POSTing file money.xml
SimplePostTool: POSTing file monitor.xml
SimplePostTool: POSTing file monitor2.xml
SimplePostTool: POSTing file mp500.xml
SimplePostTool: POSTing file sd500.xml
SimplePostTool: POSTing file solr.xml
SimplePostTool: POSTing file utf8-example.xml
SimplePostTool: POSTing file vidcard.xml
SimplePostTool: COMMITting Solr index changes..

现在你就可以使用默认的Solr 查询语法(Solr Query Syntax,Lucene 查询语法的超集)来搜索任何各种东西了,好比这些:

另外还有很多途径将数据导入到 Solr 中:

  • 从数据库中导入数据:Data Import Handler (DIH)
  • 从 CSV 文件(包裹从 Excel 和 MySQL 中导出的 CSV 文件)中导入:Load a CSV file
  • 通过 POST 请求推 JSON 文本:POST JSON documents
  • Solr Cell(ExtractingRequestHandler) 为二进制文档(例如 Word、PDF)建立索引。
  • 使用SolrJ为 Java 等其他 Solr 客户端程序化创建文档并发送给 Solr。

【2:数据操作】

更新数据

你也许注意到了,我们上传了两次 solr.xml 但是搜索 solr 时只得到一个结果。这是因为示例的 Solr 的 schema.xml 为一个叫做 id 的字段定义了“uniqueKey”,当你上传的文档包含了相同的“uniqueKey”字段的值时,Solr 会自动为你将这个文档覆盖原有文档。

我们可以看看 Solr 统计页面的“CORE”区域中 numDocs 和 maxDoc 这两个字段的值,通过这两个字段值的变化来理解前面提到的内容:

http://localhost:8983/solr/admin/stats.jsp

numDocs是指在索引中可搜索到的文档数(由于部分文件可能包含不止一个<doc>,这个值有可能大于 XML 文件数)。maxDoc则数值更大,因为它还包含了逻辑上已经删除的但还未从索引中移除的文档。因为新文档会自动覆盖旧文档,所以你可以随你喜欢地重复上传相同的 XML 文件而numDocs数值不会增加。

你可以尝试着编辑已经存在的 XML 文件,改变一些数据,然后再次运行java -jar post.jar命令,然后你将看到这些变化会放映在随后的搜索中。

删除数据

我们可以很多指令,例如:通过在 URL 中 POST 请求一个删除命令来删除数据、指定文档的 unique key 的值、一个匹配多个文档的查询(留意这个)等等。由于这些命令都较小,我们可以在命令行中指定他们,而无需引用 XML 文件。

我们可以通过执行下面的命令来删除一个文档:

java -Ddata=args -Dcommit=no -jar post.jar "<delete><id>SP2514N</id></delete>"

执行完后,我们可以访问统计页面,往下滑到“UPDATE HANDLERS”区域,你将看到“deletesById : 1”。

如果你搜索id:SP2514N,它还能被找到,因为在这些改变提交并且开启一个新的搜索前,索引的改变还不能被看到。为了防止这种情况发生,发送一个提交命令给 Solr(post.jar 默认的帮你做了这个):

java -jar post.jar

现在再执行搜索id:SP2514N将发现已经找不到匹配的文档了。这时你也可以看看统计页面中UPDATE HANDLERS 区域和CORE 区域 的这些改变。

接下来我们可以使用delete-by-query 来删除所有名字中包含DDR的东西:

java -Ddata=args -jar post.jar "<delete><query>name:DDR</query></delete>"

提交(commit)是一个代价较大的操作,所以最好在索引有多次改变后在最后进行一次批量的提交。还有一个优化(optimize)命令,所做的事情和提交命令一样,但是将所有的索引片段合并成了一个片段,使之能较快搜索,并且移除所有已经删除的文件。所有的更新操作都会被记录。了解细节可以点击这里

为了继续进行教程,我们重新进入exampledocs目录添加一下之前可能删除掉的文件:

java -jar post.jar *.xml

查询数据

搜索操作可以通过 HTTP 的 GET请求的selectURL 来执行,其中 URL 包含一个参数q,其值为待查询字符串。你可以通过一系列可选参数来控制请求返回信息。例如你可以使用“fl”参数来控制返回什么字段、相关性指数(relevancy score)是否返回:

Solr 在管理员界面中提供了一个查询表单,这个表单能够设置一些了请求参数,它在测试和调试查询中比较有用。

排序

Solr 提供了简单的方法为一个或多个索引字段进行排序,使用“sort”参数,以逗号隔开,字段名加升降方向即可:

score”也可以作为一个字段进行排序:

复合函数也可以在排序参数中使用:

假如未指定排序方式,则默认为score desc以返回最高相关度的内容。

高亮

命中字段高亮是使返回的匹配文档内容中会带对应的高亮代码片段,下面的搜索示例是搜索video card,并且指定高亮字段为namefeatures。高亮代码区域将被加入到返回文档中,高亮的文字将会以<em>标签围绕(表强调)。

…&q=video card&fl=name,id&hl=true&hl.fl=name,features

要了解更多控制高亮的参数请看这里

分类统计(分面搜索、Faceted Search)

这里先普及一下 Faceted Search,翻译上可以是分类统计或分面搜索。

分面,分面是指事物的多维度属性。例如一本书包含主题、作者、年代等分面。而分面搜索是指通过事物的这些属性不断筛选、过滤搜索结果的方法。可以将分面搜索看成搜索和浏览的结合。(此段来自CDC

在这里我个人认为分类统计更贴近其含义,所以暂译为分类统计。

分类统计需要查询匹配的文件然后产生的各种属性或类别的计数。这样能使用户在现有搜索结果返回的分类基础上不断深入优化搜索结果。

下面的例子搜索了所有的文档(*:*),请求计数的分类字段为cat

…&q=*:*&facet=true&facet.field=cat

虽然结果列表中仅返回了前 10 个文档,但实际上是为查询匹配的所有文档进行了一整套完整的分类计数。

我们也可以同时多个分类,下面的例子在 boolean 字段inStock上添加了一个分类:

…&q=*:*&facet=true&facet.field=cat&facet.field=inStock

Solr 也能为任意查询生成计数。下面的 ipad 的搜索示例展示了通过使用范围查询(range queries)查价格低于一百和高于一百的信息:

…&q=ipod&facet=true&facet.query=price:[0 TO 100]&facet.query=price:[100 TO *]

甚至可以按照日期进行分类。下面的实例对生产日期进行了分类计数(manufacturedate_dt 字段),将 2004 到 2010 每年进行分类:

…&q=*:*&facet=true&facet.date=manufacturedate_dt&facet.date.start=2004-01-01T00:00:00Z&facet.date.end=2010-01-01T00:00:00Z&facet.date.gap=+1YEAR

更多有个分类统计的信息也许可以在faceting overviewfaceting parameters这两个页面找到。

搜索 UI

Solr 里包含了一个用 velocity 模板构建的搜索接口实例,包含了搜索,分类、高亮、自动完成以及地理信息搜索。

实例网址:http://localhost:8983/solr/browse

文本分析

文本字段通常通过拆分文档为单词、转小写、去复数、增加相关性(stemming to increase relevancy)来进行建立索引。为匹配索引内容,这些文本转换也通常适用于任何查询。

schema定义了索引中的字段和什么类型的分析适用于这些字段。当前你的服务器使用的 schema 可通过管理员页面的[SCHEMA]链接访问到。

我们文本内容的最好的分析组件(标记和过滤)很大程度上依赖于具体的语言。正如你在前面的[SCHEMA]链接看到的示例 schema 里,有使用一个名字为text_generalfieldType,其默认值适用于所有语言。

假如你知道你的文本内容是英语,好比本教程中的示例文档,则推荐你使用text_en_splitting来替代原有 fieldType 值,则将使用英语特定的词干(English-specific stemming)、断句方式(stop word removal)以及分裂复合词(split compound words)等来进行文本分析。

可以编辑solr/example/solr/conf目录下的schema.xml文件,来为textfeatures字段设置fieldTypetext_en_splitting。例如这样:

<field name="features" type="text_en_splitting" indexed="true" stored="true" multiValued="true"/>
...
<field name="text" type="text_en_splitting" indexed="true" stored="false" multiValued="true"/>

在做了以上修改后停止并重启 Solr ,再使用java -jar post.jar *.xml重新 POST 所有的示例文档,现在再查询下面的示例将会展示英语特定的转换:

  • 搜索power-shot将自动匹配PowerShotadata则将通过WordDelimiterFilterLowerCaseFilter这两个过滤器自动匹配到A-DATA。
  • 搜索features:recharging能通过PorterStemFilter的词干结构特性(stemming features)自动匹配到Rechargeable
  • 搜索“1 gigabyte”能匹配1GB,而且更牛的是,通过SynonymFilter在拼错单词是能自动纠正并匹配,好比pixima能自动匹配到Pixma

完整的关于分析组件(analysis components)、Analyzers、Tokenizers 和TokenFilters 的信息请参见此处

分析调试(Analysis Debugging)

这里有个很方便分析调试页面,通过这个页面你可以看到一个文本串是怎样分解成各个词,并将展示这些文本内容经过链中每个过滤器后的结果。

这个url展示了 “Canon Power-Shot SD500″ 怎样通过使用text_en_splitting类型逐步被替代创建。表中每一行展示了在通过分析器(analyzer)下一个TokenFilter后后所得到的结果。注意,powershotpowershot都被索引了。在同一个位置所生成的 Token 将展示在同一列中,例如shotpowershot(可比较在使用 text_general 类型时 token 生成情况)。

勾选verbose output将会展示更多细节,例如链中每一个分析主键的名字、token 所在位置以及其在原始文本中的开始和结束位置。

勾选highlight matches将同时提供索引和查询的值,并会在Index Analyzer区域中高亮显示所有在Query Analyzer区域中所匹配到的字段。

其他有意思的示例:

总结

恭喜你!你已经成功的运行了一个小的 Solr 示例,为索引中增加了一些文档,并在索引和 schema.xml 中进行了一些改变。你已经了解了查询、文本分析以及 Solr 管理员界面。你已经准备好开始在自己的项目中使用 Solr 了!你可以继续一下几个步骤:

  • 订阅 Solr邮件列表
  • 将这个 Solrexample目录复制到你的项目中作为一个模板。
  • solr/conf/目录下自定义 schema 和其他配置以满足你的需求。

Solr 还有大量的特性我们没有在这里提到,包括分布式搜索(distributed search)来处理大量的文档集合,函数式查询(function queries)数值字段统计(numeric field statistics)搜索结果集群(search results clustering)。请访问Solr Wiki以了解更多 Solr 的特性


分享到:
评论

相关推荐

    Solr 3.6.1 API

    Solr3.6.1英文chm格式API 全文搜索用的

    apache solr 源文件 3.6.1

    apache solr 源文件 版本为3.6.1 让你能够更好地了解solr实现,更好的使用solr

    solr7官方文档

    solr 使用官方指南,solr 使用官方指南solr 使用官方指南solr 使用官方指南

    solr3.5开发教程

    solr3.5开发教程solr3.5开发教程solr3.5开发教程solr3.5开发教程solr3.5开发教程

    solr6.6官方文档

    solr6.6官方文档,英文版

    solr自学详细教程,吐血总结

    solr自学详细教程,吐血总结

    solr下载安装教程

    Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个...本文为solr下载安装教程

    solr学习入门教程

    solr 学习的入门教程,很实用的学习材料。适合初学者实用

    SOLR的应用教程

    3.6.1 搜索语法 39 3.6.2 排序 42 3.6.3 字段增加权重 42 3.6.4 Solr分词器、过滤器、分析器 42 3.6.5 Solr高亮使用 46 4 SolrJ的用法 46 4.1 搜索接口的调用实例 46 4.2 Solrj的使用说明 47 4.2.1 Adding Data to ...

    Solr入门教程-solr学习入门经典教程

    solr学习入门经典教程,赶紧学习吧,从solr的搭建讲起,中文分词器的配置

    solr7.5官方文档

    solr7.5官方文档

    solr详细配置教程与solrj的使用

    solr详细配置教程与solrj的使用

    solr中文教程

    solr中文教程,solr帮助文档,快速搭建solr

    solr开发应用教程

    Solr 3.5开发应用教程,偏实战

    开源企业搜索引擎SOLR的应用教程

    开源企业搜索引擎SOLR的应用教程 Apache Solr 是一个开源的搜索服务器,Solr 使用 Java 语言开发,主要基于 HTTP 和 Apache Lucene 实现。定制 Solr 索引的实现方法很简单,用 POST 方法向 Solr 服务器发送一个描述...

    solr入门教程

    solr入门教程:solr安装发布,数据库索引,定时增量索引等等

    开源企业搜索引擎SOLR的应用教程.pdf

    开源企业搜索引擎SOLR的应用教程, Apache Solr 是一个开源的搜索服务器,Solr 使用 Java 语言开发,主要基于 HTTP 和 Apache Lucene 实现。定制 Solr 索引的实现方法很简单,用 POST 方法向 Solr 服务器发送一个描述...

    solr 7.2官方文档

    solr7.2官方文档,花费1个月时间整理出来的,绝对正版! 至于solr是干什么用的呢。。。 度娘知道吧、Google知道吧、包括淘宝、京东,你想找东西,就需要用到搜索,也就需要学习solr。

    [Solr] Solr 管理教程 (英文版)

    [Packt Publishing] Solr 管理教程 (英文版) [Packt Publishing] Administrating Solr (E-Book) ☆ 图书概要:☆ Master the use of Drupal and associated scripts to administrate, monitor, and optimize Solr...

    tomcat-8.0.28+solr5.3.1安装教程.doc

    tomcat-8.0.28+solr5.3.1安装教程.doc

Global site tag (gtag.js) - Google Analytics