1

マッピング:

include Tire::Model::Search
mapping do
  indexes :name, :boost => 10
  indexes :account_id
  indexes :company_name
  indexes :email, :index => :not_analyzed
end

def to_indexed_json
  to_json( :only => [:name, :account_id, :email, :company_name], 
         )
end

上記のマッピングから、電子メールフィールドがnot_analyzed(壊れたトークンなし)に設定されていることがわかります。メールvamsikrishna@gmail.comのユーザーがいます。

vamsikrishnaを検索すると、結果にユーザーが表示されます...デフォルトのアナライザーを使用していると思います。なぜ?

ただし、完全な電子メールが指定されている場合にのみ表示されるはずです(vamsikrishna@gmail.com)。この場合、:not_analyzedが考慮されないのはなぜですか?助けてください。

電子メールフィールドのみをnot_analyzedとして設定する必要があります。他のフィールドは、標準のアナライザーを使用する必要があります(デフォルトで実行されます)。

4

3 に答える 3

2

フィールドを使用して検索してい_allます。_allこれは、ではなく、に指定されたアナライザーを使用していることを意味しますemail。このため、指定されたアナライザーはemail検索に影響を与えません。

この問題を解決するには、いくつかの方法があります。まず、フィールドのアナライザーを変更して、_all電子メールを異なる方法で処理できます。たとえば、トークナイザーuax_url_emailとして機能するstandardが、電子メールをトークンに分割しないトークナイザーに切り替えることができます。

curl -XPUT 'http://localhost:9200/test-idx' -d '{
  "settings" : {
    "index": {
      "analysis" :{
        "analyzer": {
          "default": {
            "type" : "custom",
            "tokenizer" : "uax_url_email",
            "filter" : ["standard", "lowercase", "stop"]
          }
        }
      }
    }
  }
}
'

email2番目の方法は、フィールドを除外_allし、クエリを使用して両方のフィールドを同時に検索することです。

于 2012-11-01T14:23:39.143 に答える
1

:index =>:not_analyzedの代わりに:analyzer=>'keyword'を試してください

文字列をトークン化することであるため、全体としてのみ検索可能になります。インデックスを再作成することを忘れないでください!

参照-http ://www.elasticsearch.org/guide/reference/index-modules/analysis/keyword-analyzer.html

それでも、vamsikrishnaを検索して結果を取得している場合は、同じ値を持つ他の検索可能なフィールドがあるかどうかを確認してください(たとえば、名前/会社)

于 2012-11-01T08:58:31.160 に答える
0

そうです、特定のフィールドが分​​析されていない場合に一致するように、フィールドのコンテンツ全体を検索する必要があります。

2つのオプションがあります。

  • マッピングが正しく送信されていません。get mapping apiを使用して現在のマッピングを確認できます:'localhost:9200 / _mapping'は、すべてのインデックスのマッピングを提供します。タイヤの専門家ではありませんが、not_analyzedを文字列として提供するべきではありませんか??'not_analyzed'の代わりに:not_analyzed
  • マッピングがそこにあることがわかった場合、それは一致する他のいくつかのフィールドを検索していることを意味します。クエリでフィールドの名前を指定していますか?
于 2012-11-01T08:49:03.373 に答える