Solr7中的learnin to rank使用

什么是learning to rank在此往篇文章不做介绍,这里只介绍如何使用。主要针对cloud模式启动的solr。使用的版本是solr-7.1.0,本文以外的请参考官方文档

安装

solr-ltr-7.1.0.jar已经自带在solr的发行包里面,只需要在solrconfig.xml配置即可,把下面的内容添加到solrconfig.xml

1
2
3
4
5
6
7
8
9
10
11
<lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-ltr-\d.*\.jar" />
<queryParser name="ltr" class="org.apache.solr.ltr.search.LTRQParserPlugin"/>
<cache name="QUERY_DOC_FV"
class="solr.search.LRUCache"
size="4096"
initialSize="2048"
autowarmCount="4096"
regenerator="solr.search.NoOpRegenerator" />
<transformer name="features" class="org.apache.solr.ltr.response.transform.LTRFeatureLoggerTransformerFactory">
<str name="fvCacheName">QUERY_DOC_FV</str>
</transformer>

添加了以上的配置后还需要把dist目录下的solr-ltr-7.1.0.jar拷贝到server/solr-webapp/webapp/WEB-INF/lib/目录下面,如果不添加的话,用rest api设置model的时候会报class not found exception。

上传feature

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
[
{
"store": "featureStore",
"name": "title",
"class": "org.apache.solr.ltr.feature.SolrFeature",
"params": {
"q": "{!func}query({!v=title:${query}})"
}
},
{
"store": "featureStore",
"name": "content",
"class": "org.apache.solr.ltr.feature.SolrFeature",
"params": {
"q": "{!func}query({!v=content:${query}})"
}
},
{
"store": "featureStore",
"name": "originalScore",
"class": "org.apache.solr.ltr.feature.OriginalScoreFeature",
"params": {}
},
{
"store": "featureStore",
"name": "level",
"class": "org.apache.solr.ltr.feature.FieldValueFeature",
"params": {
"field": "level"
}
},
{
"store": "featureStore",
"name": "year",
"class": "org.apache.solr.ltr.feature.FieldValueFeature",
"params": {
"field": "year"
}
}
]

上面是四个feature:

  1. 取标题的score,使用query函数,通过参数的形式传入查询词,External Feature Information。${query}是一个占位符,传参数是这样的efi.query=’YOUR KEYWORD’
  2. 取内容字段content的score,同上
  3. originalScore是不使用ltr的原来默认的score值
  4. 直接取level字段的值
  5. 同上3,取year字段的值

使用下面的命令上传feature

1
curl -XPUT 'http://localhost:8983/solr/collection_name/schema/feature-store' -d "your json string" -H 'Content-type:application/json'

查看feature可以使用下面的url
http://host:port/solr/collection_name/schema/feature-store

查看具体的feature
http://host:port/solr/collection_name/schema/feature-store/featureStore

提取feature的值

上传完feature,就可以通过下面的url查看每个文档各个feature的值。

1
http://host:port/solr/collection_name/query?q=YOUR_KEYWORD&fl=id,score,[features store=featureStore efi.query='YOUR_KEYWORD']

上传model

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
"class": "org.apache.solr.ltr.model.LinearModel",
"store": "featureStore",
"name": "modelStore",
"features": [
{"name": "title"},
{"name": "content"},
{"name": "originalScore"},
{"name": "level"},
{"name": "year"}
],
"params": {
"weights": {
"title": 0.420081550114,
"content": -0.054514139045,
"originalScore": 0.0413832540555,
"level": -0.0150990612159,
"year": 1.0
}
}
}

这个模型配置使用一个线性函数来对搜索结果进行再次打分

查找模型
http://host:port/solr/collection_name/model-store

打分

在查询的时候指定rq参数使用ltr,然后指定使用的model,传入需要的参数即可。针对上面的feature和model使用下面的url进行查询

1
http://host:port/solr/collection_name/query?q=YOUR_KEYWORD&rq={!ltr model=modelStore reRankDocs=100 efi.query='YOUR_KEYWORD'}&fl=id,score,[features store=featureStore efi.query='YOUR_KEYWORD']

这个url可以使用ltr进行打分,同时还可以取到各个feature的值。