【问题标题】:Django, Haystack, Solr and BoostingDjango、Haystack、Solr 和 Boosting
【发布时间】:2012-09-04 20:39:02
【问题描述】:

TLDR;

django、django-haystack 和 solr 中各种 boosting 类型如何协同工作?

我无法让最明显的搜索结果首先出现。如果我搜索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%……等等)

字段提升

标题由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 }} 时,这些记录开始按预期顺序出现。这是为什么呢?

【问题讨论】:

    标签: django solr django-haystack pysolr


    【解决方案1】:

    Dismax 解析器(从 SOLR 3.1 开始添加 ExtendedDismax)正是为满足这些需求而创建的。您可以配置所有要搜索的字段(“qf”参数),为每个字段添加自定义提升,并指定短语命中特别有价值的字段(添加到命中的分数;“pf”参数)。您还可以指定搜索中必须匹配多少个标记(通过灵活的规则模式;'mm' 参数)。

    例如配置可能看起来像这样(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>
    

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

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

    【讨论】:

    • 谢谢,这指出了一些我还没有听说过的关于提升的事情。
    【解决方案2】:

    看来你只是想在所有这些提升中变得太聪明了。

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

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

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

    【讨论】:

    • 将标题放入全文记录两次似乎是一个非常糟糕的主意。一旦你这样做了,如果你改变评分方案,你必须重新索引整个集合。此外,boost 是 solr 的内置部分。其目的是完成一个动态评分方案。我想知道如何使用该工具,而不是解决它。那就是感谢您的参与。
    • 正如我所写,当您搜索所有字段而不是默认字段时,您必须创建自定义 SearchForm。
    • 我要把赏金奖励给你,这样代表就不会消失在以太中。我不打算接受答案。我仍在等待解释 boost 的正确用法以及 boost 如何计算到 solr 分数的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    • 1970-01-01
    • 2012-11-28
    相关资源
    最近更新 更多