ferret / acts_as_ferret:指定字段应为空

时间:2015-02-13 16:58:41

标签: ruby-on-rails ferret acts-as-ferret

这与基于lucene的搜索引擎Ferret有关。 https://github.com/dbalmain/ferret

假设我的模型包含两个字段myfield1myfield2。我想得到myfield等于“foo”的记录,或者myfield有null(或空字符串)但myfield2设置为“foo”的记录。

我不想获得具有例如myfield =“bar”和myfield2 =“foo”的记录。所以,它并不像只说“myfield:foo || myfield2:foo”那么简单 - 我只想查看myfield2,如果myfield为空。

sql等价物将是where (myfield = 'foo') or ((myfield is null or myfield = '') and myfield2 = 'foo')。雪貂搜索字符串相当于什么?

以下有效,但这是我所追求的事情的一个例子:

"myfield:foo || (myfield:<blank> && myfield2:foo)"

谢谢,Max

顺便说一句,如果相关我在轨道上的红宝石中使用acts_as_ferret,但我认为我的问题实际上只与雪貂搜索字符串有关。我正在使用雪貂宝石,v = 0.11.6

编辑:下面有一点点肮脏的感觉解决方案,仍然想知道是否可以使用上面的查询字符串。

好的,我通过添加一个新方法“myfield_blank”来解决这个问题:

def myfield_blank
  myfield_blank?.to_s
end

然后将myfield_blank => {},添加到我的acts_as_ferret索引定义中。所以现在我可以说

"myfield:foo || (myfield_blank:true && myfield2:foo)" 

这有效,但就像我说我仍然想知道我是否可以在查询中做到这一点,而不需要创建新的字段:如果我想为许多不同的领域做这个方法,那么这种方法会令人无法接受。感谢

1 个答案:

答案 0 :(得分:1)

根据source ?*应匹配任何非空字符串,因此您可以尝试这样做:

'myfield:"foo" || (-myfield:"?*" && myfield2:"foo")'

而且我也不明白为什么'myfield:"foo" || (myfield:"" && myfield2:"foo")'不应该工作,但你可能已经尝试过了......