0

2 つの文字列がある場合:

  • ドウ、ジョー
  • ドウ、ジョナサン

次のような検索を実装したいと思います。

  • 「ドウ」 > 「ドウ、ジョー」、「ドウ、ジョナサン」
  • "Doe J" > "Doe, Joe", "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」が返されます。私は何を間違っていますか?

4

1 に答える 1

0

オートコンプリートを作成する場合は、EdgeNGram のみを使用する必要があります。コンマで単語を区切るためにパターン フィルターを使用したいと思われます。

このようなもの:

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

私が間違っていて、他の理由で edgeNGrams が必要な場合、問題は、インデックス アナライザーがストップ ワード (AND など) を無視していて、検索アナライザーが無視していないことです。ストップ ワード フィルターを含まない search_analyzer 用のカスタム アナライザーを作成する必要があります。

于 2013-03-06T21:59:35.640 に答える