2

関連フィールドを複数フィールドとしてマップしました。'name' プロパティを雪玉アナライザーを使用して分析するように設定し、'exact' を分析しないように設定しました。このフィールドを検索してフィルターすることもできます。このフィールドでソートできません。ソートしようとすると、エラスティックは「ドキュメントごとに複数の値、またはフィールドごとに複数のトークンを持つ文字列型でソートできません」というエラーを返します。

正確に似た「生」と呼ばれる追加のフィールドを作成しようとしましたが、これも機能しませんでした。以下は私のマッピングと、タイヤの宝石を介してソートを実行しようとしている方法です:

    mapping do
    indexes :sectors, :type => 'object',
      :properties => { :name => { :type => 'multi_field',
                                  :fields => {
                                    :name =>  { :type => 'string', :analyzer => 'snowball' },
                                    :exact => { :type => 'string', :index => 'not_analyzed' , :include_in_all => false }
                                  }
                                  }
                       }
end

def to_indexed_json
    to_json( :include => {
               ...
               :sectors => { :only => ["name"] },
               ...
    })
end

def self.search(params)
  tire.search(:load => true, :page=>params[:page], :per_page => 12) do

    if params[:query].present?
      query { string params[:query], :default_operator => "OR" }
    else
      query { all }
    end

    filter :term, "sectors.name.exact" => params[:sector] if params[:sector].present?
    sort { by 'sectors.name.exact','asc' } if !params[:sort][:sector].blank?
  end
end
4

3 に答える 3

5

基本的に、このエラーが発生する理由は 2 つあります。

  • フィールドごとに複数の値があります。フィールドが分​​析され、トークナイザーがそのコンテンツから複数のトークンを生成します。これは、name.exactフィールドがnot_analyzedマッピングにあるため、フィールドには当てはまりません。
  • ドキュメントごとに複数の値があります。nameたとえば、インデックス作成中に値の配列を提供するなど、フィールドに複数の値を追加しています。

私はあなたの文書がどのように見えるかをチェックします。これを迅速に行うために、次のように、フィールドに含まれるアイテムの数を返すスクリプトに基づいて、 Terms ファセットを作成できます。name.exactタームが 1 より大きいファセット エントリが少なくとも 1 つ返された場合は、フィールドに複数の値を少なくとも 1 回追加したことを意味するため、並べ替えることができません。

{
    "query" : {
        "match_all" : {}
    },
    "facets" : {
        "my_facet" : {
            "terms" : {
                "script_field" : "doc['name.exact'].values.length"
            }
        }
    }
}
于 2012-10-14T10:59:02.523 に答える
0

私も同じ問題を抱えていました。エラスティックサーチを更新したところ、問題は解決しました。

brew update
brew upgrade elasticsearch

および指示に従って:

アップグレード後にelasticsearchをリロードするには:

launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.elasticsearch.plist
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.elasticsearch.plist
于 2013-09-23T17:42:54.133 に答える
0

私見、それはうまくいくはずです。マッピングが適用されているかどうか疑問に思っています。curl コマンドで確認できますか?

何かのようなもの:

$ curl -XGET 'http://localhost:9200/twitter/tweet/_mapping'

于 2012-10-14T06:02:17.990 に答える