簡體   English   中英

EdgeNGram與Tire和ElasticSearch

[英]EdgeNGram with Tire and ElasticSearch

如果我有兩個字符串:

  • 母鹿,喬
  • 美國能源部喬納森

我想實現這樣的搜索:

  • “ Doe”>“ Doe,Joe”,“ Doe,Jonathan”
  • “ Doe J”>“ Doe,喬”,“ Doe,喬納森”
  • “喬恩·多伊(Jon Doe)”>“喬伊·多恩(Doon,Jonathan)”
  • “喬納(Jona Do)”>“喬(Dona)喬納森(Doe,Jonathan)”

這是我的代碼:

settings analysis: {
    filter: {
      nameNGram: {
        type: "edgeNGram",
        min_gram: 1,
        max_gram: 20,
      }
    },
    tokenizer: {
      non_word: {
        type: "pattern",
        pattern: "[^\\w]+"
      }
    },
    analyzer: {
      name_analyzer: {
        type: "custom",
        tokenizer: "non_word",
        filter: ["lowercase", "nameNGram"]
      },
    }
  } do
  mapping do
    indexes :name, type: "multi_field", fields: {
      analyzed:   { type: "string", index: :analyzed, index_analyzer: "name_analyzer" }, # for indexing
      unanalyzed: { type: "string", index: :not_analyzed, :include_in_all => false } # for sorting
    }
  end
end

def self.search(params)
  tire.search(:page => params[:page], :per_page => 20) do
    query do
      string "name.analyzed:" + params[:query], default_operator: "AND"
    end
    sort do
      by "name.unanalyzed", "asc"
    end
  end
end

不幸的是,這似乎不起作用...標記化效果很好,對於“ Doe,Jonathan”,我得到類似“ d”,“ do”,“ doe”,“ j”,“ jo”,“ jon”的信息”,“ jona”等,但是如果我搜索“ do AND jo”,則一無所獲。 但是,如果我搜索“ jona”,則會返回“ Doe,Jonathan”。 我究竟做錯了什么?

如果您要創建自動完成功能,則應該只使用EdgeNGram。 我懷疑您想使用模式過濾器來分隔逗號。

像這樣:

"tokenizer": {
    "comma_pattern_token": {
         "type": "pattern",
         "pattern": ",",
         "group": -1
     }
 }

如果我弄錯了,並且由於其他原因而需要edgeNGrams,那么您的問題是索引分析器忽略了停用詞(例如AND),而搜索分析器則沒有。 您需要為您的search_analyzer創建一個不包含停用詞過濾器的自定義分析器。

暫無
暫無

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

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