我正在尝试使用Thinking Sphinx在Rails中进行字段特定搜索。
我有三个名为a,b,c的表,其中包含模型A,B,C。
表格内容: 表A,B,C
mysql> select * from a;
+----+--------+----------+
| id | name | city |
+----+--------+----------+
| 1 | 7-11 | Portland |
| 2 | Costco | Bend |
| 3 | Costco | Astoria |
+----+--------+----------+
3 rows in set (0.00 sec)
mysql> select * from b;
+----+--------+---------+
| id | name | city |
+----+--------+---------+
| 1 | 7-11 | Bend |
| 2 | Costco | Astoria |
| 3 | Costco | Bend |
+----+--------+---------+
3 rows in set (0.00 sec)
mysql> select * from c;
+----+--------+---------+
| id | name | city |
+----+--------+---------+
| 1 | 7-11 | Astoria |
| 2 | Costco | Astoria |
| 3 | Costco | Bend |
+----+--------+---------+
3 rows in set (0.00 sec)
这是我在我的控制台中使用Application Wide Searching所做的:
目标:显示波特兰市内所有7-11的
irb(main):021:0> @a = ThinkingSphinx.search "7-11 @city Portland", :match_mode=>:extended
=> []
我知道表A中有一个7-11的波特兰市。所以试试吧:
irb(main):022:0> @a = A.search "7-11 @city Portland", :match_mode=>:extended
=> []
使用 Astoria 查找 Costco 。
irb(main):023:0> @a = ThinkingSphinx.search "costco @city Astoria", :match_mode=>:extended
=> [#<B id: 2, name: "Costco", city: "Astoria">, #<A id: 3, name: "Costco", city: "Astoria">, #<C id: 2, name: "Costco", city: "Astoria">]
使用弯曲查找 Costco :
irb(main):023:0> @a = ThinkingSphinx.search "costco @city Astoria", :match_mode=>:extended
=> [#<B id: 2, name: "Costco", city: "Astoria">, #<A id: 3, name: "Costco", city: "Astoria">, #<C id: 2, name: "Costco", city: "Astoria">]
我不知道为什么特定于字段的搜索使用文本值,而不是某个地方的名称包含所有数字和短划线。我已经阅读了文档,我只是不知道自己做错了什么。
这是有效的:
irb(main):026:0> @a = A.search "7-11"
=> [#<A id: 1, name: "7-11", city: "Portland">]
这不是
irb(main):027:0> @a = A.search "7-11 @city Portland", :match_mode=>:extended
=> []
答案 0 :(得分:1)
啊,我想我知道这个问题 - 问题不是波特兰的城市过滤器,而是你在扩展查询中使用连字符的事实。 A.search 'portland
是否会返回记录?并A.search '@city portland', :match_mode => :extended
?
为了解决这个问题,您可以使用Riddle.escape来转义查询 - 只需将\
放在特殊字符前面。此外,值得注意的是,您可以使用:conditions
指定以字段为中心的搜索,并自动将匹配模式设置为扩展。
A.search Riddle.escape('7-11'), :conditions => {:city => 'Portland'}