如何在使用/solr/update进行索引时提高SOLR文档的性能

4
为了索引我的网站,我有一个Ruby脚本,它生成一个shell脚本,将我的文档根目录中的每个文件上传到Solr。这个shell脚本有很多行看起来像这样:
  curl -s \
 "http://localhost:8983/solr/update/extract?literal.id=/about/core-team/&commit=false" \
 -F "myfile=@/extra/www/docroot/about/core-team/index.html"

...并以以下内容结束:

curl -s http://localhost:8983/solr/update --data-binary \
'<commit/>' -H 'Content-type:text/xml; charset=utf-8'

这将上传我文档根目录中的所有文档到Solr。我使用tika和ExtractingRequestHandler来上传各种格式的文档(主要是PDF和HTML)到Solr。

在生成此shell脚本的脚本中,我希望根据其id字段(又名url)是否与某些正则表达式匹配来提升某些文档的权重。

假设这些是提升规则(伪代码):

boost = 2 if url =~ /cool/
boost = 3 if url =~ /verycool/
# otherwise we do not specify a boost

如何在我的 http 请求中添加索引时间加速?

我尝试过:

curl -s \
 "http://localhost:8983/solr/update/extract?literal.id=/verycool/core-team/&commit=false" \
 -F "myfile=@/extra/www/docroot/verycool/core-team/index.html" \
 -F boost=3

并且:

curl -s \
 "http://localhost:8983/solr/update/extract?literal.id=/verycool/core-team/&commit=false" \
 -F "myfile=@/extra/www/docroot/verycool/core-team/index.html" \
 -F boost.id=3

这两种方式都无法改变搜索结果的排序。我想要的是,在搜索结果中,被提升的结果应该排在前面,不管用户搜索什么(当然,前提是文档包含他们的查询)。

我知道如果我以XML格式POST请求,我可以为整个文档或特定字段指定提升值。但如果我这样做,就不清楚如何指定文件作为文档内容了。实际上,tika页面提供了一个部分示例:

curl "http://localhost:8983/solr/update/extract?literal.id=doc5&defaultField=text" \
--data-binary @tutorial.html -H 'Content-type:text/html'

但是我仍然不清楚在哪里/如何指定我的boost。我尝试过:

curl \ 
"http://localhost:8983/solr/update/extract?literal.id=mydocid&defaultField=text&boost=3"\
--data-binary @mydoc.html -H 'Content-type:text/html'

并且

curl \ 
"http://localhost:8983/solr/update/extract?literal.id=mydocid&defaultField=text&boost.id=3"\
--data-binary @mydoc.html -H 'Content-type:text/html'

这两者都不会改变搜索结果。

有没有一种方法可以更新文档的boost属性(而不是特定字段),而不改变文档内容?如果可以,我可以通过以下两个步骤实现我的目标: 1)按照我一直在做的那样上传/索引文档 2)为某些文档指定boost。

1个回答

3
要在Solr中索引文档,您需要将其POST到/update处理程序。要索引的文档放在POST请求的正文中。通常情况下,您必须使用Solr的xml格式。使用该xml,您可以为特定字段或整个文档添加提升值。

1
我到目前为止一直没有使用XML格式。如果我使用XML格式,如何将文件(PDF或HTML)作为文档正文上传? - Dan Tenenbaum
抱歉,我没有注意到您正在使用ExtractingHandler... 您用于指定字段加权的语法是正确的(boost.field=value)。但是我注意到您正在提高id字段的权重。为了有效,索引时间加权应该在您将要查询的字段上(请参见http://wiki.apache.org/solr/SolrRelevancyFAQ#index-time_boosts)。 - Pascal Dimassimo
谢谢。我终于通过这样的方式让它工作了: curl -s "http://localhost:8983/solr/update/extract?literal.id=/mydoc.html&commit=false&boost.text=3" -F "myfile=@mydoc.html" 我还必须更改我的搜索表单,以明确搜索'text'字段,这是tika放置PDF等所有内容的地方。谢谢。 - Dan Tenenbaum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接