【问题标题】:Django Haystack - How to boost a field?Django Haystack - 如何提升领域?
【发布时间】:2012-01-12 04:14:06
【问题描述】:

我在 Django Haystack 1.2.5 中遇到了一些问题。我需要提升一个领域,但显然它不起作用。我正在使用 Solr 1.4.1。

我的索引:

class JobsTextIndex(indexes.SearchIndex):
    text            = indexes.CharField(document=True, use_template=True)
    job_title       = indexes.CharField(model_attr='job_title', boost=1.50)
    job_description = indexes.CharField(model_attr='job_description')
    country_ad      = indexes.CharField(model_attr='country_ad')
    zone_ad         = indexes.CharField(model_attr='zone_ad', faceted=True)
    location_ad     = indexes.CharField(model_attr='location_ad', faceted=True)
    date_inserted   = indexes.DateTimeField(model_attr='date_inserted')

    def index_queryset(self):
    """Used when the entire index for model is updated."""
    return JobsadsText.objects.filter(date_inserted__lte=datetime.datetime.now())

我在 job_title 中有“boost=1.50”,但这显然不起作用,这是 Solr 生成的:

INFO: [core0] webapp=/solr path=/select/ params={facet=on&sort=date_inserted+desc&fl=*+score&start=0&q=arquiteto&facet.field=location_ad_exact&facet.field=zone_ad_exact&wt=json&fq=django_ct:(myapp.jobstext)&rows=20} hits=65 status=0 QTime=5 

我正在做的查询是这个:

sqs = SearchQuerySet().facet('zone_ad').facet('location_ad').order_by('-date_inserted')

谁能告诉我我需要什么才能让 Haystack Boost 工作?

最好的问候,


更新 1:我需要更加重视“job_title”字段。例如,如果我正在搜索“programmer”这个词,我需要首先显示“job_title”字段中按日期排序的“programmer”的结果,然后显示“programmer”这个词的结果“job_description”字段。 Haystack boost 是实现这一目标的正确工具吗?

【问题讨论】:

  • 我遇到了完全相同的问题:我想提升一个字段,但提升参数没有做任何事情。在查询集上调用 .boost() 方法只会给出非常不可预测的结果。你找到解决办法了吗?
  • @mixedCase,我还没有增强功能。在我的情况下,我唯一的选择是使用“dismax”Solr 功能进行原始查询,但我没有时间阅读有关 Solr 的更多信息......

标签: django solr django-haystack solr-boost


【解决方案1】:

我遇到了同样的问题——在模型中添加了“boost”参数后,“schema.xml”没有改变。作为一种解决方案,我开始使用 DisMax 查询模式。像这样的东西对我有用:

SearchQuerySet().filter(text=Raw("{!dismax qf='field1^3 field2^2 text'}" + query))

我希望这会对某人有所帮助。

【讨论】:

  • 任何好的资源来阅读如何实现这一点?或者您找到了更好的解决方案?
  • 我不确定你的意思。我读过haystack docsdismax wiki。我还将代码更改为:SearchQuerySet().filter(text=AltParser( 'dismax', q, qf='field1^3 field2^2 text', ))
  • SearchQuerySet().boost('"%s"' % number, 2.0)
【解决方案2】:

在字段定义中指定 boost=1.5 是告诉 Haystack 在该特定字段上使用“字段提升”的方式。来自 Haystack 文档:

提升分为三种类型:

  • 词条提升

  • 文档提升

  • 场增强

词条提升发生在查询时(搜索查询运行时)并且是 基于增加分数是看到某个单词/短语。

另一方面,文档和字段的提升发生在索引时 (当文档被添加到索引中时)。文档提升原因 整个结果的相关性上升,其中字段提升导致 只在该领域内进行搜索才能做得更好。

您在代码中指定了字段提升,这将在模型被索引时提升字段,而不是在您进行查询时。好消息是,当对该字段进行搜索时,仍将使用您指定的提升,但将隐式应用,而不是在对 Solr 的查询中显式指定。

我认为您指定的查询不会对其应用提升,因为您尚未搜索任何字段。

【讨论】:

  • 感谢您的回复。我已经重建了索引,但搜索结果与在模型中添加“boost”参数之前相同。我注意到的另一件事是,在模型中有“boost”参数后,“schema.xml”没有改变,我运行了命令“build_solr_schema”,但是模型上的“boost”没有任何效果。有人对此有更多线索吗?谢谢。
猜你喜欢
  • 1970-01-01
  • 2012-04-07
  • 1970-01-01
  • 2015-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多