根据特定领域的具体价值提高干草堆

时间:2013-09-05 03:21:39

标签: elasticsearch django-haystack

我正在使用Haystack和ElasticSearch,我想执行的提升不仅仅是提升一个术语,而是仅在特定字段上找到一个术语。

例如,在我的UserIndex上,我想优先(提升)用户被标记为活动的搜索结果。 is_active是索引模型上的BooleanField。我知道如何过滤以便我只获取活跃用户,但是如何提升活跃用户但不能直接过滤掉非活动用户?我可以在UserIndex中对该字段应用一个提升,但看起来似乎没有其他方法可以使用除了直接过滤器来搜索该BooleanField(因为否则没有字段提升会影响的搜索项)。我可以对SearchQuerySet应用一个提升,但boost()函数接受一个字符串,它看起来只是一个直接的搜索词,你不能指定该术语出现的字段。

我或许能够与order_by分开解决这个问题,但我还有其他一些复杂的提升:

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

  • 我希望能够提升搜索用户的朋友。我目前在搜索索引模型的MultiValueField中有每个用户的朋友列表。我想通过搜索查询传递搜索用户的ID,并提升索引中拥有搜索用户ID的朋友列表中的所有用户。同样,我遇到与上面相同的问题 - 我可以提升ID,但我无法指定我只想在该特定字段中增加该ID的出现。

  • 我有第二个我希望提升的布尔字段,类似于is_active,但提升量较小。

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

到目前为止,我唯一能想到的就是hack:而不是BooleanFields,使用带有魔术字符串的CharFields。然后将这些魔术字符串作为搜索词增加,并指望没有人意外地在输入的文本中使用魔术字符串。同样,使用前面带有魔术字符串的ID代替我的MultiValueFields中的原始ID。考虑到无意义的“魔术字符串”,ElasticSearch标准标记器的行为可能是不可预测的,这是笨拙,脆弱和潜在的错误。

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

有没有办法解决这个问题,不会以这种方式破坏我的索引数据?

1 个答案:

答案 0 :(得分:1)

在您的地图中,您可以添加:

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

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

然后将原始查询包装在一个布尔查询中,并且必须在原始查询上,并且应该在is_active:SHOULD on the thing:1234