簡體   English   中英

ElasticSearch / Tire:如何正確設置部分單詞搜索

[英]ElasticSearch/Tire: How to properly set partial word searches up

即使我已經看到很多關於它的描述都相對簡單,但我還是沒有設法使其正常運行。 假設我有這個:

class Car < ActiveRecord::Base
  settings analysis: {
    filter: {
      ngram_filter: { type: "nGram", min_gram: 3, max_gram: 12 }
    },
    analyzer: {
      partial_analyzer: {
        type: "snowball",
        tokenizer: "standard",
        filter: ["standard", "lowercase", "ngram_filter"]
      }
    }
  } do
    mapping do
      indexes :name,                    index_analyzer: "partial_analyzer"
    end
  end
end

假設我有一輛名為“福特”的汽車,並且更新了索引。 現在,如果我搜索“福特”:

Car.tire.search { query { string "Ford" } }

我的車在我的成績中。 現在,如果我尋找“ For”:

Car.tire.search { query { string "For" } }

找不到我的車了。 我以為nGram過濾器會自動為我處理它,但顯然不是。 作為一種臨時解決方案,我使用通配符(*)進行此類搜索,但這絕對不是最好的方法,因為min_gram和max_gram定義是搜索中的關鍵元素。 誰能告訴我他們是如何解決的?

我正在使用Rails 3.2.12和ruby 1.9.3。 ElasticSearch版本為0.20.5。

您想要使用定制分析器而不是雪球之一: Elasticsearch定制分析器

基本上,其他分析器都帶有一組預定義的過濾器和標記器。

您可能還想使用Edge-Ngram過濾器: Edge-Ngram過濾器

Edge-NGram和NGram之間的區別基本上是Edge-Ngram,基本上僅堅持術語的“邊緣”。 因此,它從前面或后面開始。 福特-> [For]代替-> [For,ord]

有關自動完成的一些更高級的鏈接:

自動補全,帶有模糊性(純彈性搜索,無疲勞感,但讀取效果非常好)

提供鏈接的另一個有用問題

編輯

基本上,我的設置與您的設置非常相似。 但是還有一個標題和多字段分析器。 由於具有多語言支持,因此這里是一個名稱數組,而不僅僅是一個名稱。

我還指定了search_analyzer,並且使用了字符串鍵而不是符號。 這是我實際擁有的:

settings "analysis" => {
    "filter" => {
        "name_ngrams"  => {
            "side"     => "front",
            "max_gram" => 20,
            "min_gram" => 2,
            "type"     => "edgeNGram"
        }
    },
    "analyzer" => {
        "full_name"     => {
            "filter"    => %w(standard lowercase asciifolding),
            "type"      => "custom",
            "tokenizer" => "letter"
        },
        "partial_name"        => {
            "filter"    => %w(standard lowercase asciifolding name_ngrams),
            "type"      => "custom",
            "tokenizer" => "standard"
        }
    }
} do
  mapping do
    indexes :names do
      mapping do
        indexes :name, :type => 'multi_field',
                :fields => {
                    "partial"           => {
                        "search_analyzer" => "full_name",
                        "index_analyzer"  => "partial_name",
                        "type"            => "string"
                    },
                    "title"      => {
                        "type"     => "string",
                        "analyzer" => "full_name"
                    }
                }
      end
    end
  end
end

暫無
暫無

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

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