这与基于lucene的搜索引擎Ferret有关。https://github.com/dbalmain/ferret
假设我有一个有两个字段的模型,myfield1
和myfield2
。我想得到myfield等于"foo"的记录,或者myfield有null
(或空字符串)但myfield2设置为"foo"的记录。
例如,我不想得到myfield="bar"和myfield2="foo"的记录。所以,这并不是说"myfield:foo||myfield2:foo"那么简单——我只想在myfield为空的情况下查看myfield2。
sql等价物将是where (myfield = 'foo') or ((myfield is null or myfield = '') and myfield2 = 'foo')
。与之相当的雪貂搜索字符串是什么?
以下不起作用,但它是我所追求的东西的一个例子:
"myfield:foo || (myfield:<blank> && myfield2:foo)"
谢谢,Max
顺便说一句,如果相关的话,我在ruby on rails中使用acts_as_ferret,但我认为我的问题实际上只是与一个搜索字符串有关。我用的是雪貂宝石,v=0.1.6
编辑:下面有点脏的感觉解决方案,仍然想知道是否有可能只使用上面的查询字符串。
好吧,我通过添加一个新方法"myfield_blank"来解决这个问题:
def myfield_blank
myfield_blank?.to_s
end
然后将CCD_ 5添加到我的acts_。所以现在我可以说
"myfield:foo || (myfield_blank:true && myfield2:foo)"
这是可行的,但正如我所说,我仍然想知道我是否可以在查询中这样做,而不生成新的字段:如果我想对很多不同的字段这样做,这种方法将是不可接受的。感谢
根据源?*
应该匹配任何非空字符串,所以你可以尝试这样做:
'myfield:"foo" || (-myfield:"?*" && myfield2:"foo")'
而且我真的不明白为什么'myfield:"foo" || (myfield:"" && myfield2:"foo")'
不应该工作,但你可能已经尝试过了…