Django,Haystack,Solr和Boosting

时间:2012-09-04 20:39:02

标签: django solr django-haystack pysolr

TLDR;

各种助推类型如何在django,django-haystack和solr中协同工作?

我无法将最明显的搜索结果首先显示出来。如果我搜索caring for others并获得10个结果,则标题为caring for others的对象在caring for yourself之后的结果中显示为第二位。

文件提升

我有文件提升Category个对象因子为factor = 2.0 - ((the mptt tree level)/10)因此对于根节点为1.9,对于第二级为1.8,对于第三级等为1.7,依此类推。 (或190%,180%,170%......等等)

Field Boosting

标题得到提升boost=1.5正面因子为150% 内容被boost=.5负面因素50%提升

学期提升

我目前没有提高搜索条件。

我的目标

我想得到一个结果列表类别和文章(我忽略文章,直到我得到我的类别结果直接)。类别加权高于文章,标题加权高于内容。另外,我正在尝试对根类别节点进行加权,而不是子节点。

我觉得我在某个地方错过了一个关键概念。

信息

我正在使用haystack的内置搜索表单和搜索视图。

我正在使用以下包/ lib版本:

Django==1.4.1
django-haystack==1.2.7
pysolr==2.1.0-beta

我的索引类

class CategoryIndex(SearchIndex):
    """Categorization -> Category"""
    text = CharField(document=True, use_template=True, boost=.5)
    title = CharField(model_attr='title', boost=1.5)
    content = CharField(model_attr='content', boost=.5)
    autocomplete = EdgeNgramField(model_attr='title')

    def prepare_title(self, object): 
        return object.title

    def prepare(self, obj):
        data = super(CategoryIndex, self).prepare(obj)
        base_boost = 2.0
        base_boost -= (float(int(obj.level))/10)
        data['boost'] = base_boost
        return data

templates/search/categorization/category_text.txt

上的搜索模板
{{ object.title }}
{{ object.content }}

更新

我注意到当我从搜索模板中取出{{ object.content }}时,该记录开始按预期顺序显示。这是为什么?

2 个答案:

答案 0 :(得分:2)

Dismax Parser(另外来自SOLR 3.1的ExtendedDismax)已经完全针对这些需求而创建。您可以配置要搜索的所有字段('qf'参数),为每个字段添加自定义提升,并指定短语命中特别有价值的字段(添加到匹配的分数;'pf'参数)。您还可以指定搜索中必须匹配的令牌数(通过灵活的规则模式;'mm'参数)。

e.g。配置看起来像这样(solrconfig.xml中请求处理程序配置条目的一部分 - 我不熟悉如何使用haystack,这是简单的SOLR):

<str name="defType">dismax</str>
<str name="q.alt">*:*</str>
<str name="qf">text^0.5 title^1.5 content^0.5</str>
<str name="pf">text title^2 content</str>
<str name="fl">*,score</str>
<str name="mm">100%</str>
<int name="ps">100</int>

我不知道干草堆,但它似乎会提供Dismax功能: https://github.com/toastdriven/django-haystack/pull/314

有关Dismax的信息,请参阅此文档(它也链接到ExtendedDismax): http://wiki.apache.org/solr/DisMaxQParserPlugin http://wiki.apache.org/solr/ExtendedDisMax

答案 1 :(得分:0)

似乎你只是试图在这里过于聪明,并且所有这些提升。

E.g。如果您使用默认搜索视图,那些字段中的那些是完全针。事实上,默认运行的auto_query只使用一个字段进行搜索 - 只有一个字段标记为document = true。而haystack实际上在内部命名了这个字段内容,所以我会sugegst在搜索索引中重命名它以避免任何可能的冲突。

如果它没有帮助(可能不会),你必须创建自定义搜索表单或使用简单的解决方法来实现你想要的东西,方法是在模板中放置你想多次提升的字段:

{{ object.title }}
{{ object.title }}
{{ object.content }}