1

使用 Rails 3.2。我有下表:

name                 address
=======================================
Hilton Hotel         New York, USA
Hilton Hotel         Paris, France
Mandarin Hotel       Chicago, USA
Le Meridien Hotel    New York, USA

和以下查询:

term = "%#{params[:term]}%"
shops = Shop.limit(10).where("name LIKE ? OR address like ?", term, term)

我的预期结果是这样的:

Search - "Hilton"
Result - "Hilton Hotel, New York, USA"; "Hilton Hotel, Paris, France"

Search - "Hilton USA"
Result - "Hilton Hotel, New York, USA"

Search - "New York"
Result - "Hilton Hotel, New York, USA"; "Le Meridien Hotel, New York, USA"

我应该如何重写我的查询?

谢谢。

4

2 回答 2

1

你可以使用 MySQL 的 MATCH AGAINST。Rails 中没有直接支持,但您始终可以在 Rails 中使用自己的自定义查询

YourModel.find_by_sql("SELECT ... WHERE MATCH(...) AGAINST(...)")

或者更多的 Rails 风格(没有测试过):

YourModel.where("MATCH(...) AGAINST(...)")

有关更多信息,请查看此处:http ://dev.mysql.com/doc/refman/5.1/en/fulltext-boolean.html

编辑: 我会按空格、逗号、点等分割输入字符串,然后使用 MATCH AGAINST 来获得所有结果。所以如果你有这张桌子:

      col1 | col2
      -----------
row1: a c  | a
row2: a d  | b e
row3: b e  | a d
row4: b    | b c

用户类型a作为输入。你应该做

MATCH(col1, col2) AGAINST ('a')

这将返回:

row1: 'a c', 'a'
row2: 'a d', 'b e'
row3: 'b e', 'a d'
于 2013-02-17T16:45:24.317 回答
0

我为此使用了另一种解决方法。

I create another column for_autocomplete and concatenate the name and address into it. Every time a record is created/updated, it will create/update for_autocomplete accordingly. Then I just search through the for_autocomplete column.

于 2013-02-19T04:01:11.867 回答