2

我已将关联字段映射为多字段。我已将“名称”属性设置为使用雪球分析仪进行分析,并将“精确”设置为未分析。我也可以搜索该字段并进行过滤。我无法在此字段上进行排序。尝试排序时,elastic 返回错误“无法对每个文档具有多个值或每个字段多个标记的字符串类型进行排序”。

我尝试创建一个名为“raw”的附加字段,类似于精确,但这也不起作用。下面是我的映射以及我如何尝试通过轮胎宝石执行排序:

    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

您收到该错误的原因基本上有两个:

  • 每个字段有多个值:分析您的字段,并且标记器从其内容中生成多个标记,您的name.exact字段不是这种情况,因为它not_analyzed在您的映射中
  • 每个文档有多个值:向name字段添加多个值,例如在索引时提供一组值。

我会检查你的文件是什么样子的。为了快速完成此操作,您可以基于返回字段中包含的项目数的脚本创建术语方面name.exact,如下所示。如果您返回至少一个 term 大于 1 的 facet 条目,这意味着您至少向该字段添加了多个值,因此您无法对其进行排序。

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

恕我直言,它应该工作。只是想知道您的映射是否已应用。你可以用 curl 命令检查它吗?

就像是:

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

于 2012-10-14T06:02:17.990 回答
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 回答