文章来源:http://alexhi.sinaapp.com/archives/500
【1:开始及建立索引】
在了解 Solr 前推荐先了解一下 Lucene,Solr 基于 Lucene。
内容是官方教程,原文链接见:Solr
Tutorial。我对其进行了简单的翻译。
文中使用的是 Linux 系统,我针对 Win 系列在翻译上做了些调整。例如文中提到的部分命令行在 UNIX,Cygwin 或者 MacOS 中的 shell 运行的语句,我就直接写对应的我在 CMD 下的语句了,如果想看 shell 命令,可以去英文原文中找找。
概览
本文档通过使用示例程序和示例数据来运行 Solr ,展示了一系列基础的操作。
需要
在开始这个教程前,你需要准备:
Java 1.5 或更新,你可以从这几个地方拿到:Oracle,Open
JDK,IBM,你也可以在命令行中运行java
-version 来看看自己机器上的版本。Gnu 的 GCJ 不支持 Solr。
一个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 查询语法的超集)来搜索任何各种东西了,好比这些:
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 ,并且指定高亮字段为name ,features 。高亮代码区域将被加入到返回文档中,高亮的文字将会以<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 和power ,shot 都被索引了。在同一个位置所生成的
Token 将展示在同一列中,例如shot 和powershot (可比较在使用
text_general 类型时 token 生成情况)。
勾选verbose
output将会展示更多细节,例如链中每一个分析主键的名字、token 所在位置以及其在原始文本中的开始和结束位置。
勾选highlight
matches将同时提供索引和查询的值,并会在Index Analyzer 区域中高亮显示所有在Query
Analyzer 区域中所匹配到的字段。
其他有意思的示例:
English
stemming and stop-words使用text_enfield 类型
Half-width
katakana normalization with bi-graming使用 text_cjkfield 类型
Japanese
morphological decomposition with part-of-speech filtering使用 text_jafield 类型
Arabic
stop-words, normalization and stemming使用 text_arfield 类型
总结
恭喜你!你已经成功的运行了一个小的 Solr 示例,为索引中增加了一些文档,并在索引和 schema.xml 中进行了一些改变。你已经了解了查询、文本分析以及 Solr 管理员界面。你已经准备好开始在自己的项目中使用 Solr 了!你可以继续一下几个步骤:
订阅 Solr邮件列表!
将这个 Solrexample 目录复制到你的项目中作为一个模板。
在solr/conf/ 目录下自定义 schema 和其他配置以满足你的需求。
Solr 还有大量的特性我们没有在这里提到,包括分布式搜索(distributed
search)来处理大量的文档集合,函数式查询(function
queries)、数值字段统计(numeric
field statistics)和搜索结果集群(search
results clustering)。请访问Solr
Wiki以了解更多 Solr 的特性。
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com