0

在我的 Rails 应用程序中,我从 mysql 数据库中获取数据,部分代码:

@search = ArtLookup.find(:all, :conditions => ['MATCH (ARL_SEARCH_NUMBER) AGAINST(? IN BOOLEAN MODE) and ARL_KIND = 1', search_condition.gsub(/[^0-9A-Za-z]/, '')])

但主要问题是我有不同的供应商价目表,并且我在 db 中对相同的变量有不同的编码,例如:

LEMFÖRDER

但是我怎样才能为我设置字典search_condition,如果我search_condition是例如:

LEM?FORDER or
LEMFOERDER or
LEMFÖRDER

它会LEMFÖRDER在数据库中找到我的吗?

我知道这听起来很奇怪,对不起我的英语,但我在我的例子中解释了一切......

4

3 回答 3

1

我认为,在这种情况下,您应该开始使用库来处理全文搜索和其他搜索功能,例如 Solr 或 Sphinx。

看看http://pat.github.com/ts/en/searching.html

这种复杂性很常见,并且已经在许多算法中实现。

希望能帮助到你!

于 2012-12-14T16:27:00.277 回答
0

如果我正确理解了您的问题,您希望 Mysql 将这三个值视为同一事物。现在,假设它们在特定语言中被认为是相同的东西(例如,德语中的 ß = ss),Mysql 将根据您的排序规则设置自动处理这个问题,因此选择正确的排序规则应该会为您修复它。

于 2012-11-29T13:59:00.877 回答
0

您可以通过使用 ActiveRecord 的AREL引擎来做到这一点,如下所示:

def lookup(*alternatives)
  match_condition = 'MATCH (ARL_SEARCH_NUMBER) AGAINST(? IN BOOLEAN MODE)'

  or_conditions = alternatives.map do |alternative|
    ArtLookup.where(match_condition, alternative).
    where_values.reduce(:and)
  end

  and_condition = ArtLookup.where('ARL_KIND = 1').where_values.reduce(:and)

  # Build a disjunction
  conditions = or_conditions.shift

  or_conditions.each do |condition|
    conditions = conditions.or(condition)
  end

  # Build the final conjunction
  conditions = conditions.and(and_condition)

  ArtLookup.where(conditions)
end

然后你可以找到如下对象:

@search = lookup('LEM?FORDER', 'LEMFOERDER', 'LEMFÖRDER')

或者直接提供一个数组:

alternatives = [
  'LEM?FORDER',
  'LEMFOERDER',
  'LEMFÖRDER'
]

@search = lookup(*alternatives)

我知道这对于它正在做的简单事情来说代码太多了。但它应该这样做,我不知道有更好的方法。我没有测试该代码,因此它可能包含一些小错误。

于 2012-12-12T04:49:19.480 回答