1

这与基于 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)"

谢谢,马克斯

顺便说一句,如果它是相关的,我在 Rails 上的 ruby​​ 中使用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)" 

这行得通,但是就像我说的那样,我仍然想知道是否可以在查询中执行此操作,而无需创建新字段:如果我想为许多不同的字段执行此方法,则这种方法将是不可接受的。谢谢

4

1 回答 1

1

根据 ?*应该匹配任何非空字符串,所以你可以尝试这样做:

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

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

于 2015-02-17T00:10:44.947 回答