XSLTRequestHandler

配置文件中默认配置了 update 请求的处理,同时这个配置设置了 lazy load 的标示。

XSLTRequestHandler 允许索引任何带 XML <tr> command 的 XML 数据。同时需要在 solr/conf/xslt 目录下有 XSLT 样式文件。
&lt;requestHandler name=&quot;/update/xslt&quot; startup=&quot;lazy&quot;/&gt;

这里是一个 XSLT 样式表的例子:
<br />
&lt;xsl:stylesheet xmlns:xsl=&quot;http://www.w3.org/1999/XSL/Transform&quot;<br />
	version=&quot;1.0&quot;&gt;<br />
	&lt;xsl:template match=&quot;/&quot;&gt;<br />
		&lt;add&gt;<br />
			&lt;xsl:apply-templates select=&quot;/random/document&quot; /&gt;<br />
		&lt;/add&gt;<br />
	&lt;/xsl:template&gt;<br />
	&lt;xsl:template match=&quot;document&quot;&gt;<br />
		&lt;doc boost=&quot;5.5&quot;&gt;<br />
			&lt;xsl:apply-templates select=&quot;*&quot; /&gt;<br />
		&lt;/doc&gt;<br />
	&lt;/xsl:template&gt;<br />
	&lt;xsl:template match=&quot;node&quot;&gt;<br />
		&lt;field name=&quot;{@name}&quot;&gt;<br />
			&lt;xsl:if test=&quot;@enhance!=''&quot;&gt;<br />
				&lt;xsl:attribute name=&quot;boost&quot;&gt;&lt;xsl:value-of select=&quot;@enhance&quot; /&gt;&lt;/xsl:attribute&gt;<br />
			&lt;/xsl:if&gt;<br />
			&lt;xsl:value-of select=&quot;@value&quot; /&gt;<br />
		&lt;/field&gt;<br />
	&lt;/xsl:template&gt;<br />
&lt;/xsl:stylesheet&gt;<br />

跨平台提交工具

为了演示,在 example/exampledocs 下有一个 post.jar 的工具,这个工具是一个跨平台的 Java POST 提交 XML 文档的工具,打开一个窗口运行:

java -jar post.jar <list of files with messages>

默认情况下,这个工具将跟 localhost:8983 这个服务器通讯。-help 这个可选选项可以输出以下信息:

SimplePostTool: version 1.2

这个简单的命令行工具用于提交 XML 信息到 Solr 的接口。XML 数据可以来自文件、字符串和 STDIN(标准输入):

java -Ddata=files -jar post.jar *.xml
java -Ddata=args -jar post.jar '<delete><id>42</id></delete>'
java -Ddata=stdin -jar post.jar < hd.xml
其他选项控制了包括 Solr URL 和是否 commit 这些系统属性。这些是默认的系统属性:
-Ddata=files
-Durl=[http://localhost:8983/solr/update|http://localhost:8983/solr/update]
-Dcommit=yes

使用 curl 执行更新命令

可以使用 curl 这个工具执行之前的几个指令,通过它的 –data-binary 参数,可以添加 XML 消息到 curl 命令中,然后发送一个 HTTP POST 请求,示例:
curl http://localhost:8983/update -H "Content-Type: text/xml" --data-binary '
<add>
<doc>
<field name="authors">Patrick Eagar</field>
<field name="subject">Sports</field>
<field name="dd">796.35</field>
<field name="isbn">0002166313</field>
<field name="yearpub">1982</field>
<field name="publisher">Collins</field>
</doc>
</add>'
发送包含文件的 XML 消息时,可以使用以下例子:
curl http://localhost:8983/update -H "Content-Type: text/xml"
--data-binary @myfile.xml
也可以通过 HTTP GET 命令发送短的请求,GET 发送请求时,需要对命令中的特殊字符进行 URL 编码,如:”<” 和 “>”
curl http://localhost:8983/update?stream.body=%3Ccommit/%3E
从 Solr 返回的结果类似以下所示显示:

&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;<br />
&lt;response&gt;<br />
&lt;lst name=&quot;responseHeader&quot;&gt;<br />
&lt;int name=&quot;status&quot;&gt;0&lt;/int&gt;<br />
&lt;int name=&quot;QTime&quot;&gt;127&lt;/int&gt;<br />
&lt;/lst&gt;<br />
&lt;/response&gt;

如果状态失败时,status 字段会显示一个非 0 的值。servlet 容器将产生一个 HTML 格式的错误消息。

回滚指令

回滚指令可以撤回从最后一次提交到当前时间点所有的添加和删除的索引。它不会促发任何时间监听,也不会产生一个新的 searcher,它的语法很简单:

&lt;rollback/&gt;

删除索引指令

删除文档有两种方式,一个是通过制定 ID 来删除,另一个通过查询条件来删除,一个删除的消息可以包含多个删除指令的操作。

&lt;delete&gt;<br />
&lt;id&gt;0002166313&lt;/id&gt;<br />
&lt;id&gt;0031745983&lt;/id&gt;<br />
&lt;query&gt;subject:sport&lt;/query&gt;<br />
&lt;query&gt;publisher:penguin&lt;/query&gt;<br />
&lt;/delete&gt;

提交和优化操作

<commit> 操作会将上一次 commit 之后的文档写到磁盘的一个或多个 segment 文件里。在一个提交之前,最近索引的内容是搜不到的。commit 操作打开了一个新的 searcher,并且促发所有配置的监听。
<optimize> 操作要求 Solr 合并内部的数据结构,这样可以提高搜索性能。一个大的索引库,索引优化会持续一段时间,优化过程,会合并一些小的 segment 文件成一个大的文件,这样减少IO,搜索性能会有所提升。如果使用 Solr 的复制机制来实现多个系统的分布式搜索,需要注意的是,索引优化之后,需要分发一个完整的索引库。
 <commit> 和<optimize> 元素接受以下可选属性:

可选属性

描述

maxSegments 默认是 1。指定将现有索引碎片合并成多少个segment
waitFlush 默认是 true,在将索引写到硬盘过程,线程阻塞。
waitSearcher 默认是 true。线程阻塞,直到一个新的searcher 打开并注册成住 searcher,这样最近修改的数据可以被搜索到。
expungeDeletes Default is false. Merges segments and removes deleted documents.默认是 false。合并 segments 并且移除删除的索引。

这里是一个 commit 和 optimize 使用可选属性的例子:

&lt;commit waitFlush=&quot;false&quot; waitSearcher=&quot;false&quot;/&gt;<br />
&lt;commit waitFlush=&quot;false&quot; waitSearcher=&quot;false&quot; expungeDeletes=&quot;true&quot;/&gt;<br />
&lt;optimize waitFlush=&quot;false&quot; waitSearcher=&quot;false&quot;/&gt;

使用 XMLUpdateRequestHandler 处理 xml 数据

配置:

默认配置文件中配置了更新请求处理类:

&lt;requestHandler name=&quot;/update&quot; /&gt;

添加文档:
通过发送 xml 消息给更新请求的处理类可以添加文件到索引库。
更新请求处理识别的 xml schema 非常明了:
<add> 元素描述有一个或多个文档需要添加
<doc> 元素描述单个文档
<field> 元素描述文档具体字段和值
以下是个范例:
<br />
&lt;add&gt;<br />
	&lt;doc&gt;<br />
		&lt;field name=&quot;authors&quot;&gt;Patrick Eagar&lt;/field&gt;<br />
		&lt;field name=&quot;subject&quot;&gt;Sports&lt;/field&gt;<br />
		&lt;field name=&quot;dd&quot;&gt;796.35&lt;/field&gt;<br />
		&lt;field name=&quot;numpages&quot;&gt;128&lt;/field&gt;<br />
		&lt;field name=&quot;desc&quot;&gt;&lt;/field&gt;<br />
		&lt;field name=&quot;price&quot;&gt;12.40&lt;/field&gt;<br />
		&lt;field name=&quot;title&quot; boost=&quot;2.0&quot;&gt;Summer of the all-rounder: Test and<br />
			championship<br />
			cricket in England 1982&lt;/field&gt;<br />
		&lt;field name=&quot;isbn&quot;&gt;0002166313&lt;/field&gt;<br />
		&lt;field name=&quot;yearpub&quot;&gt;1982&lt;/field&gt;<br />
		&lt;field name=&quot;publisher&quot;&gt;Collins&lt;/field&gt;<br />
	&lt;/doc&gt;<br />
	&lt;doc boost=&quot;2.5&quot;&gt;<br />
		...<br />
&lt;/doc&gt;<br />
&lt;/add&gt;<br />

如果文档 schema 中定义了一个唯一主键,更新处理类会去索引库中替换相同唯一主键文档的值,除非 <add> 元素设置了 allowDups 属性值为 true。如果唯一主键没有定义,索引的性能会好一点,因为在插入前不用去查询文档是否已存在。
每个元素有一些可选的属性可以设置:

命令

可选参数

参数描述

<add>

commitWithin=

number

提交文档能等待的毫秒数
<doc> boost=float 文档的权重,默认为1.0
<field> boost=float 字段的权重,默认为1.0

使用 Index Handlers 上传数据

Index Handlers 是更新的 Handlers,它设计成用来添加、删除和更新文档到索引库,Solr 的文档支持这几种格式:XML、CSV 和 JSON。

涉及到的相关 Handlers 有:
  • XMLUpdateRequestHandler for XML-formatted Data
  • XSLTRequestHandler to Transform XML Content
  • CSVRequestHandler for CSV Content
  • Using the JSONRequestHandler for JSON Content
  • Indexing Using SolrJ

在 Solr 示例目录中尝试 Tika

首先启动 Solr 示例的服务:

java -jar start.jar

新开一个命令行窗口,定位到 docs 目录下,通过 HTTP POST 向 Solr 发送一个文件。

cd docs
curl “http://localhost:8983/solr/update/extract?literal.id=doc1&commit=true” -F “myfile=@tutorial.html

curl 的安装请参看前面的章节,在windows下,建议将 curl 安装目录放入环境变量的 Path 中。

上面的 URL 调用了 Extraction Request Handler,上传了 tutorial.html 这个文件,并制定它的 ID 为 doc1.以下是这个命令各个部分的解释:
  • literal.id=doc1 参数为被索引的文档提供必需的唯一 ID
  • commit=true 这个参数发送了一个提交请求(commit),让数据马上就能被搜索到。为了性能考虑,在提交大量文档时,不要每个文档都发送提交请求。
  • -F 参数提示 curl POST 数据时使用 multipart/form-data 这个 Content-Type,这样能支持二进制文件上传。
  • myfile=@tutorial.html 参数需要一个正确的路径。
现在可以通过这个链接查询刚刚上传的文档:

Solr Cell 主要概念

在使用 Solr Cell 框架式,需要注意以下几个有用的点:
  • Tika 会自动尝试解析输入文档(Word、PDF、HTML)的类型,并正确的抽取文本。如果你愿意,你可以使用 St.rema.typ 参数给 Tika 明确设置一个 MIME 类型
  • Tika 运行时产生一个 XHTML 流提供给 SAX ContentHandler。SAX 是通用的 XML 解析器。
  • Solr 回应 Tika 的 SAX 事件,然后创建字段给索引库。
  • Tika 依照像 DubinCore 这样的规格,产生如标题、主题和作者这样的元数据
  • Tika 添加所有抽取出来的文本放入 content 字段
  • 可以把 Tika 的元数据字段和 Solr 的字段做映射,也可以设置这些字段的 boost。
  • 可以传递一些常量给字段的值
  • Tika 的 XTML 支持 XPath 表达式,可以通过表达式限制其内容的产生

Copyright © All Rights Reserved · Green Hope Theme by Sivan & schiy · Proudly powered by WordPress   闽ICP备18020075号-1