簡體   English   中英

Elasticsearch with Tire:edgeNgram有多個單詞

[英]Elasticsearch with Tire: edgeNgram with multiple words

假設我有5部電影片名:

  • Sans Soleil
  • 的Sansa
  • 這就是這個
  • Sol Goode
  • 唯一的幸存者

我想用這個預期的行為實現一個自動完成的搜索字段:

  • “Sans”> Sans Soleil,Sansa
  • “Sans so”> Sans Soleil
  • “所以”>這就是這個,Sol Goode,Sole Survivor
  • “所以是”>這就是這樣
  • “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”。
  • “所以是”按順序返回“Sol Goode,Sans Soleil,Sole Survivor,So Is This”。

我認為您可以通過match查詢集來實現您想要的type:"phrase_prefix" 大多數(但不是全部)示例都可以使用。

使用Ngrams,你可以更好地控制這個過程,但是它們有一個相當大的召回(它們通常會返回你想要的更多數據),你必須對抗它。 這是你用多個查詢術語(“Sans so”)觀察到的“奇怪行為”,因為它們被有效地執行為Sans OR so查詢。

嘗試使用default_operator: "AND"選項(參見輪胎的query_string_test.rb ),或者更確切地說, match查詢(見輪胎的match_query_test.rb )與operator: "AND"選項。

有一些關於自動完成,Tire和Ngrams的文章可用:

試試以下

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM