各种助推类型如何在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%......等等)
标题得到提升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 }}
时,该记录开始按预期顺序显示。这是为什么?
答案 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 }}