使用 solr4 和 Haystack 查找重复对象

Find duplicates objects with solr4 and Haystack

我用的是solr的facet模式找重。它工作得很好,但我不知道如何获取对象 ID。

>>> from haystack.query import SearchQuerySet
>>> sqs = SearchQuerySet().facet('text_string', limit=-1)
>>> sqs.facet_counts()
{
    'dates': {},
    'fields': {
        'text_string': [
            ('the red ballon', 4),
            ('my grand pa is an alien', 2),
            ('be kind rewind', 12),
        ],
    },
    'queries': {}
}

如何获取对象的 ID 'the red ballon'、'my grand pa is an alien' 等,是否必须在 solr 的 schema.xml 中添加 id 字段?

我期待这样的事情:

>>> sqs.facet_counts()
{
    'dates': {},
    'fields': {
        'text_string': [
            (object_id, 'the red ballon', 4),
            (object_id, 'my grand pa is an alien', 2),
            (object_id, 'be kind rewind', 12),
        ],
    },
    'queries': {}
}

编辑:添加了 schema.xml 和 search_indexes.py

schema.xml 对于 solr

...
  <fields>
    <!-- general -->
    <field name="id" type="string" indexed="true" stored="true" multiValued="false" required="true"/>
    <field name="django_ct" type="string" indexed="true" stored="true" multiValued="false"/>
    <field name="django_id" type="string" indexed="true" stored="true" multiValued="false"/>
    <field name="_version_" type="long" indexed="true" stored ="true"/>
    <dynamicField name="*_i"  type="int"    indexed="true"  stored="true"/>
    <dynamicField name="*_s"  type="string"  indexed="true"  stored="true"/>
    <dynamicField name="*_l"  type="long"   indexed="true"  stored="true"/>
    <dynamicField name="*_t"  type="text_en"    indexed="true"  stored="true"/>
    <dynamicField name="*_b"  type="boolean" indexed="true"  stored="true"/>
    <dynamicField name="*_f"  type="float"  indexed="true"  stored="true"/>
    <dynamicField name="*_d"  type="double" indexed="true"  stored="true"/>
    <dynamicField name="*_dt" type="date" indexed="true" stored="true"/>
    <dynamicField name="*_p" type="location" indexed="true" stored="true"/>
    <dynamicField name="*_coordinate"  type="tdouble" indexed="true"  stored="false"/>

    <field name="text" type="text_en" indexed="true" stored="true" multiValued="false"  termVectors="true" />
    <field name="title" type="text_en" indexed="true" stored="true" multiValued="false"  />

    <!-- Used for duplicate content detection --> 
    <copyField source="title" dest="text_string" />
    <field name="text_string" type="string" indexed="true" stored="true" multiValued="false" />
    <field name="pk" type="long" indexed="true" stored="true" multiValued="false" />

  </fields>

  <!-- field to use to determine and enforce document uniqueness. -->
  <uniqueKey>id</uniqueKey>

  <!-- field for the QueryParser to use when an explicit fieldname is absent -->
  <defaultSearchField>text</defaultSearchField>

  <!-- SolrQueryParser configuration: defaultOperator="AND|OR" -->
  <solrQueryParser defaultOperator="AND"/>
...

searche_indexes.py

class VideoIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    pk = indexes.IntegerField(model_attr='pk')
    title = indexes.CharField(model_attr='title', boost=1.125)

    def index_queryset(self, using=None):
        return Video.on_site.all()

    def get_model(self):
            return Video

Faceting 是将搜索结果按类别排列(基于索引词)。在每个类别中,Solr 报告相关术语的命中数,这称为方面约束。 Faceting 使用户可以轻松地在电影网站和产品评论网站等网站上浏览搜索结果,这些网站有很多类别,一个类别中有很多项目。

这是一个很好的例子...

faceting example by Yonik

faceting example on solr wiki

在您的情况下,您可能需要再次触发查询以获取 ID 和其他详细信息....