当在查询中添加术语而不是过滤器时,我得到0个方面。仅供参考,我在Ruby中使用轮胎宝石。
这是我的模型代码及其映射:
class Property < ActiveRecord::Base include Tire::Model::Search include Tire::Model::Callbacks has_and_belongs_to_many :tags mapping do indexes :id, type: 'integer' indexes :status indexes :refno, type: 'integer' indexes :name, :analyzer => 'snowball', :boost => 100 indexes :description indexes :tags, type: 'object', properties: { name: { type: 'multi_field', fields: { name: { type: 'string', analyzer: 'snowball' }, exact: { type: 'string', index: 'not_analyzed' } } } } end def to_indexed_json to_json( include: { tags: { only: [:name] }, }) end
然后这是搜索方法
def self.search(params={}) tire.search(page: params[:page], per_page: 2, load: true) do query do boolean do must { string params[:name], default_operator: "AND" } if params[:name].present? must { term :status, 'live' } must { term :refno, params[:refno]} if params[:refno].present? # must { term :tag, params[:tag]} if params[:tag].present? ## does not work either must { term 'tags.name.exact', params[:tag]} if params[:tag].present? end end facet "tags" do terms 'tags.name.exact' end raise to_json # raise to_curl end end
我得到0个构面。 但是,如果我将构面移到过滤器(即下方),则会得到完整的构面。
def self.search(params={}) tire.search(page: params[:page], per_page: 2, load: true) do query do boolean do must { string params[:name], default_operator: "AND" } if params[:name].present? must { term :status, 'live' } must { term :refno, params[:refno]} if params[:refno].present? end end filter :term, 'tags.name.exact' => params[:tag] if params[:tag].present? facet "tags" do terms 'tags.name.exact' end raise to_json # raise to_curl end end
没关系,这是不需要的,当单击构面过滤器时,我想从构面过滤器中删除不可用的标签并更新新的构面计数。
如果有帮助,这里是查询的json,它可以工作,而不能。
## No Factes { "query":{ "bool":{ "must":[ { "query_string":{ "query":"England", "default_operator":"AND" } }, { "term":{ "status":"live" } }, { "term":{ "tags.name.exact":[ "Pet Friendly" ] } } ] } }, "facets":{ "tags":{ "terms":{ "field":"tags.name.exact", "size":10, "all_terms":false } } }, "size":2 } ## Facets working { "query":{ "bool":{ "must":[ { "query_string":{ "query":"England", "default_operator":"AND" } }, { "term":{ "status":"live" } } ] } }, "facets":{ "tags":{ "terms":{ "field":"tags.name.exact", "size":10, "all_terms":false } } }, "filter":{ "term":{ "tags.name.exact":[ "Pet Friendly" ] } }, "size":2 }
真希望有人能提供建议。开始把我的头发拉出来。
我实际上非常接近。由于我的标签可以有多个,因此我需要使用术语而不是术语,即
def self.search(params={}) tire.search(page: params[:page], per_page: 2, load: true) do query do boolean do must { string params[:name], default_operator: "AND" } if must { term :status, 'live' } must { term :refno, params[:refno]} if params[:refno].present? must { terms 'tags.name.exact', params[:tag]} if params[:tag].present? end end facet "tags" do terms 'tags.name.exact' end # raise to_json # raise to_curl end end
感谢您的建议,尽管imotov,Hoang。