Solrj:将 MoreLikeThis 作为 bean
Solrj: getting MoreLikeThis as beans
使用 Solrj 可以从 QueryResponse
读取文档作为(带注释的)bean:
List<Item> items = queryResponse.getBeans(Item.class)
其中 Item 是映射到 Solr 文档的注释 class。
现在我查询单个文档并请求 10 个 MoreLikeThis 文档:
?q=id:AZ133007&mlt=true&mlt.fl=technique,subject&mlt.mindf=1&mlt.mintf=1&mlt.count=10
这个 returns 带有 id AZ133007
的文档和 10 个 'MoreLikeThis' 文档(即更像 AZ133007
关于字段 'technique' 和 'subject').请参阅下面的(简化)回复:
<response>
<lst name="responseHeader">
...
</lst>
<result name="response" numFound="1" start="0">
<doc>
<str name="id">AZ133007</str>
<str name="title">Still I</str>
<str name="artist">A.R. Tist</str>
<str name="technique">Watercolor</str>
<str name="subject">Still life</str>
</doc>
</result>
<lst name="moreLikeThis">
<result name="AZ133007" numFound="84" start="0">
<doc>
<str name="id">AZ002001</str>
<str name="title">Cubes</str>
<str name="artist">John Doe</str>
<str name="technique">Watercolor</str>
<str name="subject">Landscape</str>
</doc>
<doc>
<str name="id">AZ002002</str>
<str name="title">Cats and Dogs</str>
<str name="artist">A. Nothername</str>
<str name="technique">Watercolor</str>
<str name="subject">Cityscape</str>
</doc>
...
</result>
</lst>
</response>
response
部分中请求的文档 AZ133007
可以作为 Item
bean 返回,如下所示:
Item item = queryResponse.getBeans(Item.class).get(0);
但是如何将 'moreLikeThis' 下列出的文档作为 beans?
经过大量试验、浏览网页并深入研究 Solrj API 我得出了以下解决方案。可能有更好的方法,我很想知道。
首先从响应中提取 moreLikeThis
部分并将其转换为 NamedList
:
NamedList mlt = (NamedList) queryResponse.getResponse().get("moreLikeThis");
在调试时检查 NamedList
mlt
,它显示 AZ133007
条目以及 'moreLikeThis'.
的 SolrDocuments
{
AZ133007={
numFound=295,
start=0,
docs=[
SolrDocument{
id=AZ002001,
title=Cubes,
artist=JohnDoe,
technique=Watercolor,
subject=Landscape
},
SolrDocument{
id=AZ002002,
title=CatsAndDogs,
artist=A.Nothername,
technique=Watercolor,
subject=Cityscape
},
...
]
}
}
现在得到一个 SolrDocumentList
提供 id:
SolrDocumentList mltDocList = (SolrDocumentList) mlt.get("AZ133007");
并将此 SolrDocumentList
绑定到 beans:
DocumentObjectBinder b = new DocumentObjectBinder();
List<Item> similarItems = b.getBeans(Item.class, mltDocList);
当然,我没有对 id 进行硬编码,而是内置了一些空值检查,但你明白了。
使用 Solrj 可以从 QueryResponse
读取文档作为(带注释的)bean:
List<Item> items = queryResponse.getBeans(Item.class)
其中 Item 是映射到 Solr 文档的注释 class。
现在我查询单个文档并请求 10 个 MoreLikeThis 文档:
?q=id:AZ133007&mlt=true&mlt.fl=technique,subject&mlt.mindf=1&mlt.mintf=1&mlt.count=10
这个 returns 带有 id AZ133007
的文档和 10 个 'MoreLikeThis' 文档(即更像 AZ133007
关于字段 'technique' 和 'subject').请参阅下面的(简化)回复:
<response>
<lst name="responseHeader">
...
</lst>
<result name="response" numFound="1" start="0">
<doc>
<str name="id">AZ133007</str>
<str name="title">Still I</str>
<str name="artist">A.R. Tist</str>
<str name="technique">Watercolor</str>
<str name="subject">Still life</str>
</doc>
</result>
<lst name="moreLikeThis">
<result name="AZ133007" numFound="84" start="0">
<doc>
<str name="id">AZ002001</str>
<str name="title">Cubes</str>
<str name="artist">John Doe</str>
<str name="technique">Watercolor</str>
<str name="subject">Landscape</str>
</doc>
<doc>
<str name="id">AZ002002</str>
<str name="title">Cats and Dogs</str>
<str name="artist">A. Nothername</str>
<str name="technique">Watercolor</str>
<str name="subject">Cityscape</str>
</doc>
...
</result>
</lst>
</response>
response
部分中请求的文档 AZ133007
可以作为 Item
bean 返回,如下所示:
Item item = queryResponse.getBeans(Item.class).get(0);
但是如何将 'moreLikeThis' 下列出的文档作为 beans?
经过大量试验、浏览网页并深入研究 Solrj API 我得出了以下解决方案。可能有更好的方法,我很想知道。
首先从响应中提取 moreLikeThis
部分并将其转换为 NamedList
:
NamedList mlt = (NamedList) queryResponse.getResponse().get("moreLikeThis");
在调试时检查 NamedList
mlt
,它显示 AZ133007
条目以及 'moreLikeThis'.
{
AZ133007={
numFound=295,
start=0,
docs=[
SolrDocument{
id=AZ002001,
title=Cubes,
artist=JohnDoe,
technique=Watercolor,
subject=Landscape
},
SolrDocument{
id=AZ002002,
title=CatsAndDogs,
artist=A.Nothername,
technique=Watercolor,
subject=Cityscape
},
...
]
}
}
现在得到一个 SolrDocumentList
提供 id:
SolrDocumentList mltDocList = (SolrDocumentList) mlt.get("AZ133007");
并将此 SolrDocumentList
绑定到 beans:
DocumentObjectBinder b = new DocumentObjectBinder();
List<Item> similarItems = b.getBeans(Item.class, mltDocList);
当然,我没有对 id 进行硬编码,而是内置了一些空值检查,但你明白了。