ThinkingSphinx中的字段特定搜索无法正常工作

时间:2011-08-19 08:33:41

标签: ruby-on-rails thinking-sphinx

我正在尝试使用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
=> []

1 个答案:

答案 0 :(得分:1)

啊,我想我知道这个问题 - 问题不是波特兰的城市过滤器,而是你在扩展查询中使用连字符的事实。 A.search 'portland是否会返回记录?并A.search '@city portland', :match_mode => :extended

为了解决这个问题,您可以使用Riddle.escape来转义查询 - 只需将\放在特殊字符前面。此外,值得注意的是,您可以使用:conditions指定以字段为中心的搜索,并自动将匹配模式设置为扩展。

A.search Riddle.escape('7-11'), :conditions => {:city => 'Portland'}