More Like This

Some search backends supports More Like This features. In order to take advantage of this, we have a mixin class drf_haystack.mixins.MoreLikeThisMixin, which will append a more-like-this detail route to the base name of the ViewSet. Lets say you have a router which looks like this:

router = routers.DefaultRouter()
router.register("search", viewset=SearchViewSet, base_name="search")  # MLT name will be 'search-more-like-this'.

urlpatterns = patterns(
    "",
    url(r"^", include(router.urls))
)

The important thing here is that the SearchViewSet class inherits from the drf_haystack.mixins.MoreLikeThisMixin class in order to get the more-like-this route automatically added. The view name will be {base_name}-more-like-this, which in this case would be for example search-more-like-this.

Serializing the More Like This URL

In order to include the more-like-this url in your result you only have to add a HyperlinkedIdentityField to your serializer. Something like this should work okay.

Example serializer with More Like This

class SearchSerializer(HaystackSerializer):

    more_like_this = serializers.HyperlinkedIdentityField(view_name="search-more-like-this", read_only=True)

    class Meta:
        index_classes = [PersonIndex]
        fields = ["firstname", "lastname", "full_name"]


class SearchViewSet(MoreLikeThisMixin, HaystackViewSet):
    index_models = [Person]
    serializer_class = SearchSerializer

Now, every result you render with this serializer will include a more_like_this field containing the url for similar results.

Example response

[
    {
        "full_name": "Jeremy Rowland",
        "lastname": "Rowland",
        "firstname": "Jeremy",
        "more_like_this": "http://example.com/search/5/more-like-this/"
    }
]