Solr初级教程

预览

本文档简要介绍如何运行solr,如何进行数据操作。

环境

本教程使用solr 4.9,需要。。。
1. Java 1.7或者更高。 2. 下载solr,地址

开始

解压solr压缩包,并且进入到"example"文件夹中。

Solr可以在很多Java容器中运行,本教程使用jetty。

运行example文件夹中的start.jarjava -jar start.jar,就可以使用jetty运行solr的war包,配置文件使用的是example中的configs。
上面的命令会启动jetty服务器,端口默认是8983,并且会将日志打印到控制台。
可以通过http://localhost:8983/solr/来打开solr的管理员页面

数据索引

Solr服务器已经起开了,但是没有任何数据。我们可以通过post命令来向其中add(update、delete、pending adds and deletes)文档来修改solr的索引。实现的方式详情

exampledocs目录中包含了一些样例文件,这些文档可以通过命令post到solr中。在此我们使用java -jar post.jar -h这种方式。

java -jar post.jar solr.xml monitor.xml

现在Solr中索引了两篇文档,并且事物已经提交。我们可以打开http://localhost:8983/solr/#/collection1/query这个链接,来进行实验,在"q"这个输入框中输入“solr”,点击“Excute Query”,浏览器会跳到http://localhost:8983/solr/collection1/select?q=solr&wt=xml页面。

我们可以将所有的xml文档都添加到Solr中,java -jar post.jar *.xml

现在我们可以使用Solr Query Syntax来查询数据。

还有很多种方式将数据导入到Solr中:
+ 通过Data Import Handler(DIH)从数据库中导入数据 + 加载CSV文件(文件中的数据用逗号分隔),csv文件可以是Excel和Mysql导出的。 + Post json文档+ 通过Solr Cell索引二进制文档,如word或者pdf。 + 通过java或者solr支持的其他语言,用程序创建并导入到solr中。

Update数据

我们注意到即使solr.xml这个文档被导入了两次,但是我们在搜索solr关键字时,仍旧得到一个结果。这是因为每个文档都有一个唯一性的字段"id"。向solr中添加文档时,如果id相同,solr就会更新这篇文档。我们可以通过http://localhost:8983/solr/#/collection1/plugins/core?entry=searcher这个页面中的numDocs和maxDoc来验证。

numDocs代表索引中的document的数目(这个数目可能比solr中xml文件的数目大,因为单个xml文件可能包含多个document)。numDocs可能比maxDocs还要大,因为某些文档可能被删除了,但是索引还没有更新。即使我们多次post同一份xml文件,numDocs也不会增加,因为id相同,solr做的是update动作。

编辑这些xml文件,修改其中的内容,然后重新运行java -jar post.jar命令,再进行搜索,我们就可以看到刚才修改的内容。

Delete数据

我们可以向solr post删除命令,如果指定了id就是删除某篇document;如果这个命令中的query可以匹配多个document,那就删除多个document(小心)。下面的命令会删除指定的document。

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

上面的命令,我们指定了commit=false,所以我们还可能会检索到刚刚删除的document,因为索引还没有更新。
通过statistics page这个updateHandler页面,我们可以看到删除document生效的过程,deletesById这个值降为0,cumulative_deletesByIdautocommit这两个增加。

下面是使用query批量删除document的示例。

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

如果我们想让之前的变化立即生效,我们可以通过命令强制solr使用新的searcher:

    Java -jar post.jar -

现在,再次执行之前的query,可以发现已经删除的document,不会再被搜索出来了。我们可以再次通过statistics page来看updateHandlercommit的个数,和searcher中的numDocs。

使用新的searcher,可能会花费很高的代价(时间、内存等),所以最好是积攒很多changes,然后批量提交给solr,再让solr重建索引。还有一个命令optimize,它和commit命令完成同样的操作,但是它会强制所有的索引分片都merge到同一个分片中,这样很耗费资源,但能提高检索速度,如果你的索引不经常变化,可以试试。

所有的update命令,都可以使用xmljson两个格式。

为了下面的教程,再把exampledocs文件夹中的xml文件,post到solr中。

    java -jar post.jar *.xml

query数据

在前台,我们通过http get请求获取solr的索引的内容,参数q可以指定一些条件。我们可以指定一些可选的参数给request handler,来控制返回的内容。比如,我们可以使用"fl"这个参数来控制返回的字段。

Solr提供一个查询界面,我们可以通过它来设置各种参数,查看结果,方便我们调试,地址http://localhost:8983/solr/#/collection1/query

排序

Solr中可以对一个或者多个字段进行排序。我们可以在get请求中的"sort"参数中具体指定排序规则。

  • q=video&sort=price_desc 按价格降序
  • q=video&sort=price_asc 按价格升序
  • q=video&sort=inStock asc, price desc 首先按instock升序,然后按价格降序。

"Score"这个字段也可以用来排序:

还可以使用一些复杂的函数:

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

如果没有指定排序规则,结果默认按score降序排序。

高亮

Hit highlighting returns relevant snippets of each returned document, and highlights terms from the query within those context snippets.

下面的例子,搜索关键词video card,并且高亮namefeatures字段。这样solr在返回的数据中,会将namefeatures字段包含在标签里面,产生高亮效果。更多关于高亮的信息,点击此处

Faceted Search(分面搜索,也有翻译成垂直搜索的)

faceted search检索出符合query的document,并且把document按照不同的属性或者策略进行计数。这种搜索常用于在检索结果中再进行分配检索。

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

上面返回10条document,这10条数据是根据我们的query分面(垂直)搜索出来的。

我们也可以同时指定多种条件,如下面添加了inStock这个条件:

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

Solr也支持区间条件查询。下面的例子,指定了price的区间。

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

Solr甚至可以通过数值范围(包括日期)进行分面。下面的例子,计算从Document中,2004和2010年每年的制造日期(manufacturedate_dt字段)

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

更多信息,faceting overviewfaceting parameters

版权声明

本站文章、图片、视频等(除转载外),均采用知识共享署名 4.0 国际许可协议(CC BY-NC-SA 4.0),转载请注明出处、非商业性使用、并且以相同协议共享。

© 空空博客,本文链接:https://www.yeetrack.com/?p=930