我正在将 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 增强文档本身非常薄。
有没有什么方法可以解决这个问题而不涉及以这种方式破坏我的索引数据?