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 进行硬编码,而是内置了一些空值检查,但你明白了。