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

来源:互联网 发布:炮哥捏脸数据 编辑:程序博客网 时间:2024/06/06 05:27

文章来源: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\exampleC:\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 monitor.xmlSimplePostTool: version 1.4SimplePostTool: POSTing files to http://localhost:8983/solr/update..SimplePostTool: POSTing file solr.xmlSimplePostTool: POSTing file monitor.xmlSimplePostTool: 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 *.xmlSimplePostTool: version 1.4SimplePostTool: POSTing files to http://localhost:8983/solr/update..SimplePostTool: POSTing file gb18030-example.xmlSimplePostTool: POSTing file hd.xmlSimplePostTool: POSTing file ipod_other.xmlSimplePostTool: POSTing file ipod_video.xmlSimplePostTool: POSTing file mem.xmlSimplePostTool: POSTing file money.xmlSimplePostTool: POSTing file monitor.xmlSimplePostTool: POSTing file monitor2.xmlSimplePostTool: POSTing file mp500.xmlSimplePostTool: POSTing file sd500.xmlSimplePostTool: POSTing file solr.xmlSimplePostTool: POSTing file utf8-example.xmlSimplePostTool: POSTing file vidcard.xmlSimplePostTool: COMMITting Solr index changes..

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

  • video
  • name:video
  • +video +price:[* TO 400]

另外还有很多途径将数据导入到 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请求的 select URL 来执行,其中 URL 包含一个参数 q,其值为待查询字符串。你可以通过一系列 可选参数 来控制请求返回信息。例如你可以使用“fl”参数来控制返回什么字段、相关性指数(relevancy score)是否返回:

  • q=video&fl=name,id (仅返回 name 和 id 字段)
  • q=video&fl=name,id,score (同时返回相关性指数)
  • q=video&fl=*,score(返回所有字段和相关性指数)
  • q=video&sort=price desc&fl=name,id,price(添加了以价格递减的排序)
  • q=video&wt=json(以 JSON 格式返回)

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

排序

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

  • q=video&sort=price desc
  • q=video&sort=price asc
  • q=video&sort=inStock asc, price desc

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

  • q=video&sort=score desc
  • q=video&sort=inStock asc, score desc

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

  • q=video&sort=div(popularity,add(price,1)) desc

假如未指定排序方式,则默认为 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 overview 和 faceting parameters 这两个页面找到。

搜索 UI

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

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

文本分析

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

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

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

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

可以编辑 solr/example/solr/conf 目录下的 schema.xml 文件,来为 text 和 features 字段设置 fieldType 成 text_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 将自动匹配 PowerShot, adata 则将通过 WordDelimiterFilter 和 LowerCaseFilter 这两个过滤器自动匹配到 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 后后所得到的结果。注意, powershot 和 powershot 都被索引了。在同一个位置所生成的 Token 将展示在同一列中,例如 shot 和 powershot(可比较 在使用 text_general 类型时 token 生成情况)。

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

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

其他有意思的示例:

  • English stemming and stop-words 使用 text_en field 类型
  • Half-width katakana normalization with bi-graming 使用 text_cjk field 类型
  • Japanese morphological decomposition with part-of-speech filtering 使用  text_ja field 类型
  • Arabic stop-words, normalization and stemming 使用 text_ar field 类型

总结

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

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

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


0 0
原创粉丝点击