3

假设我有 5 部电影片名:

  • 无太阳
  • 珊莎
  • 这也是
  • 索尔古德
  • 唯一的幸存者

我想实现一个具有这种预期行为的自动完成搜索字段:

  • “Sans” > Sans Soleil,珊莎
  • “Sans so” > Sans Soleil
  • “所以” > 这就是这样,索尔·古德,唯一的幸存者
  • “原来如此” > 这也是
  • “Sol” > Sol Goode,Sole Survivor,Sans Soleil

这个用例似乎很明显,必须被许多人使用,但我就是无法让它正常工作,而且我似乎找不到任何答案或文档来帮助。这是我目前的模型:

class Film < Media
  include Tire::Model::Search
  include Tire::Model::Callbacks

  settings  :analysis => {
              :filter => {
                :title_ngram  => {
                  "type"      => "edgeNGram",
                  "min_gram"  => 2,
                  "max_gram"  => 8,
                  "side"      => "front" }
              },
              :analyzer => {
                :title_analyzer => {
                  "tokenizer"    => "lowercase",
                  "filter"       => ["title_ngram"],
                  "type"         => "custom" }
              }
            } do
    mapping do
      indexes :title, :type => 'string', :analyzer => 'title_analyzer'
      indexes :int_english_title, :type => 'string', :analyzer => 'title_analyzer'
    end
  end
end

以及如何在我的 search_controller 中处理查询:

search = Tire.search ['books', 'films', 'shows'], :load => true, :page => 1, :per_page => 10 do |s|
    s.query do |query|
        query.string "title:#{params[:search]}"
    end
end
@results = search.results

这会产生一些奇怪的行为:

  • “Sans so”按此顺序返回“Sansa,Sans Soleil,So Is This”。
  • “So is”按此顺序返回“Sol Goode,Sans Soleil,Sole Survivor,So Is This”。
4

2 回答 2

4

我认为您可以通过将match查询设置为type:"phrase_prefix". 您的大多数示例(但不是全部)都可以使用。

使用 Ngrams,您可以更好地控制流程,但它们的召回率相当高(它们通常返回比您想要的更多的数据),您必须与之抗争。这是您使用多个查询词(“Sans so”)观察到的“奇怪行为”,因为它们作为Sans OR so查询有效地执行。

尝试使用default_operator: "AND"选项(参见轮胎的query_string_test.rb),或者更确切地说是带有选项的match查询(参见轮胎的match_query_test.rboperator: "AND"

有一些关于自动完成、Tire 和 Ngrams 的文章:

于 2013-01-03T08:44:58.933 回答
0

尝试关注

search = Tire.search ['books', 'films', 'shows'], :load => true, :page => 1, :per_page => 10 do |s|
      s.query do |q|
        q.boolean do |b|
          b.must {|m| m.string params[:search]} 
        end
      end
end
于 2013-01-02T10:16:24.880 回答