Solrj:得到MoreLikeThis作为豆子

时间:2015-09-23 12:21:03

标签: java solr solrj

使用Solrj可以从QueryResponse作为(带注释的)bean读取文档:

List<Item> items = queryResponse.getBeans(Item.class)  

其中Item是映射到Solr文档的带注释的类。

现在我查询单个文档并要求提供10个MoreLikeThis文档:

?q=id:AZ133007&mlt=true&mlt.fl=technique,subject&mlt.mindf=1&mlt.mintf=1&mlt.count=10

这将返回标识为AZ133007的文档以及10&#39; MoreLikeThis&#39;文档(例如,更像AZ133007关于字段&#39;技术&#39;主题&#39;)。请参阅下面的(简化)回复:

<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>

AZ133007部分中请求的文档response可以作为Item bean返回,如下所示:

Item item = queryResponse.getBeans(Item.class).get(0);

但是我如何获得&#39; moreLikeThis&#39;下列出的文件?作为豆子?

1 个答案:

答案 0 :(得分:0)

经过大量的实验,浏览网页并深入了解Solrj API后,我提出了以下解决方案。可能有更好的方法,我真的很想知道。

首先从回复中提取moreLikeThis部分并将其投放到NamedList

NamedList mlt = (NamedList) queryResponse.getResponse().get("moreLikeThis");

在调试时检查NamedList mlt,它会显示AZ133007条目以及更多类似的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绑定到bean:

DocumentObjectBinder b = new DocumentObjectBinder();
List<Item> similarItems = b.getBeans(Item.class, mltDocList);

当然我没有对id进行硬编码,而且我已经在一些空检查中构建了,但你明白了。