9

TLDR;

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

我无法让最明显的搜索结果首先出现。如果我搜索caring for others并获得 10 个结果,带有标题的对象caring for otherscaring for yourself.

文档提升

我已经记录了提升Category对象的因子,factor = 2.0 - ((the mptt tree level)/10)根节点为 1.9,二级为 1.8,三级为 1.7,依此类推。(或 190%、180%、170%……等等)

场增强

标题被boost=1.5150% 的正因素提升 内容被boost=.5负因素 50%提升

术语提升

我目前没有增加任何搜索词。

我的目标

我想获得结果类别和文章的列表(在我直接获得类别结果之前,我会忽略文章)。类别的权重高于文章,标题的权重高于内容。此外,我正在尝试将根类别节点的权重高于子节点。

我觉得我在某处遗漏了一个关键概念。

信息

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

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

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 }}从搜索模板中取出时,这些记录开始以预期的顺序出现。为什么是这样?

4

2 回答 2

2

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

于 2012-09-20T08:46:37.420 回答
0

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

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

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

{{ object.title }}
{{ object.title }}
{{ object.content }}
于 2012-09-12T20:33:36.083 回答