Ruby:在反向索引中搜索部分匹配

Ruby:在反向索引中搜索部分匹配,ruby,full-text-search,Ruby,Full Text Search,我需要在反向索引中搜索部分匹配,下面的代码适用于精确匹配,但不适用于部分匹配。根据上的示例进行了修改(在Ruby1.9.3中不再适用) 请问如何以最有效的方式做到这一点? 请不要建议使用Lucene、Sphinx等,除非你知道一个轻量级的、简单的、纯Ruby的解决方案,想自己做 @data = {"contents"=>["1.txt", "2.txt"], "of"=>["1.txt", "2.txt"], "file"=>["1.txt", "2.txt"], "one"=

我需要在反向索引中搜索部分匹配,下面的代码适用于精确匹配,但不适用于部分匹配。根据上的示例进行了修改(在Ruby1.9.3中不再适用)

请问如何以最有效的方式做到这一点? 请不要建议使用Lucene、Sphinx等,除非你知道一个轻量级的、简单的、纯Ruby的解决方案,想自己做

@data = {"contents"=>["1.txt", "2.txt"], "of"=>["1.txt", "2.txt"], "file"=>["1.txt", "2.txt"], "one"=>["1.txt"], "two"=>["2.txt"]}

def search words
  result = []
  words.each do |word|
    result << @data[word] if @data[word] #should do a partial match
  end
  result
end

p search ['of'] #=> [["1.txt", "2.txt"]]
p search ['one'] #=> [["1.txt"]]
p search ['on']  #=> []                    <<should become [["1.txt"]]
@data={“contents”=>[“1.txt”,“2.txt”],“of”=>[“1.txt”,“2.txt”],“file”=>[“1.txt”,“2.txt”],“one”=>[“1.txt”],“two”=>[“2.txt”]}
def搜索词
结果=[]
单词。每个单词|
结果[[“1.txt”,“2.txt”]]
p搜索['one']#=>[[“1.txt”]]

p search['on']#=>[]定义
search
如下:

def search words
  words.map do |word|
    matches = @data.keys.select {|key| key.include?(word)}
    matches.map {|match| @data[match] }
  end      
end

p search ['of'] #=> [[["1.txt", "2.txt"]]]
p search ['one'] #=> [[["1.txt"]]]
p search ['on']  #=> [[["1.txt", "2.txt"], ["1.txt"]]] - note that "contents" contains "on" 

如果你不在乎空间的话,你可以很容易地为每个单词(在时间上)计算出一个O(1)算法;只需构建一个哈希,将所有子字符串作为具有相应值的键。这可能是最简单的方法,但不是最有效的方法。请注意,
flat\u map
将展平那些嵌套的数组。感谢Chowlett,这很奇怪,我不得不像这个p search(['of'])那样将数组嵌入括号中,否则错误@tokland,什么会更有效?想不想再回答一个问题?@peter:关于O(1)的解决方案,请参见我上面对问题的评论。这很容易实现,只需为所有子字符串构建一个哈希。