【问题标题】:Haystack boosting based on specific value in specific fieldHaystack Boosting 基于特定领域的特定值
【发布时间】:2013-09-08 17:58:22
【问题描述】:

我正在将 Haystack 与 ElasticSearch 结合使用,我希望执行的提升不仅仅是提升一般术语,而是仅在特定字段中找到术语时提升它。

例如,在我的 UserIndex 上,我想优先考虑(提升)用户被标记为活动的搜索结果。 is_active 是索引模型上的 BooleanField。我知道如何过滤,以便只获取活跃用户,但我怎样才能提升活跃用户而不是彻底过滤掉非活跃用户?我可以对 UserIndex 中的字段应用提升,但除了直接过滤器来搜索该 BooleanField 之外,如果没有其他方式,它似乎无法工作(因为否则没有字段提升会影响的搜索词)。我可以对 SearchQuerySet 应用 boost,但是 boost() 函数采用的字符串似乎只是一个直接的搜索词,您不能指定该词出现的字段。

我或许可以使用 order_by 单独解决这个问题,但我还有很多其他复杂的提升要做:

  • 如果匹配用户在运行时由应用程序指定的列表中有 ID,我希望能够提升匹配的用户(这样我就可以提升用户相对于按下搜索按钮的页面的上下文) .我可以简单地提升包含用户 ID 的搜索词,但如果该数字恰好在另一个字段中,它也会提升该字段,从而产生非常奇怪的结果。

  • 我希望能够增加搜索用户的朋友。我目前在搜索索引模型的 MultiValueField 中有每个用户朋友的列表。我想将搜索用户的 ID 与搜索查询一起传递,并提升索引中在好友列表中具有搜索用户 ID 的所有用户。同样,我遇到了与上述相同的问题 - 我可以提升 ID,但我不能指定我只想提升该 ID 在该特定字段中的出现次数。

  • 我有第二个想要提升的 BooleanField,类似于 is_active 但提升的量较小。

如果我可以通过一个术语和一个字段的组合来提升所有这一切都很容易,但如果我只能提升一个术语而不是一个字段,这似乎非常困难。

到目前为止,我唯一能想到的基本上是一个 hack:代替 BooleanFields,使用其中包含魔术字符串的 CharFields。然后将这些魔术字符串提升为搜索词,并指望没有人会在输入的文本中意外使用魔术字符串。同样,在我的 MultiValueFields 中不要使用原始 id,而是使用带有魔术字符串的 id。考虑到 ElasticSearch 标准标记器的行为可能因无意义的“魔术字符串”而无法预测,这很尴尬、脆弱且可能存在错误。

我考虑的另一个选项是使用Raw 输入类型并添加特定于 ElasticSearch 的语法,但是将 Raw 与 ElasticSearch 一起使用几乎完全没有文档记录,而且 ElasticSearch 增强文档本身非常薄。

有什么方法可以解决这个问题,而不涉及以这种方式修改我的索引数据?

【问题讨论】:

    标签: elasticsearch django-haystack


    【解决方案1】:

    在您的映射中,您可以添加:

    "is_active":{
      "type":"boolean",
      "boost":10.0
    }
    

    "friends":{
      "type":"int",
      "index":"not_analyzed",
      "boost":5.0
    }
    

    然后将您的原始查询包装在一个布尔查询中,在您的原始查询上使用 MUST,在 is_active:true 上使用 SHOULD,在 Friends:1234 上使用 SHOULD

    【讨论】:

    • 好的,我试试这个。但是,应该将这些东西放入原始输入中,对吗?在 Haystack API 中没有办法做到这一点?
    • 不熟悉 haystack 专用 API,这里是我说的弹性搜索 API elasticsearch.org/guide/reference/query-dsl/bool-query
    • 好的,我最终使用自定义 Lucene 查询字符串实现了稍微不同的实现(更容易使其与 Haystack 一起使用),但这个答案有助于实现,所以我接受它。谢谢!
    猜你喜欢
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    • 2013-02-20
    • 1970-01-01
    相关资源
    最近更新 更多