在查询上使用Elasticsearch进行方面的麻烦

在我的查询中添加一个术语而不是filter时,我得到了0个方面。 仅供参考我正在使用Ruby的轮胎gem。

这是我的模型代码及其映射:

class Property  '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分面。 但是,如果我将小平面移动到filter,即下方,我会得到完整的方面。

  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 

虽然这没关系但是不想要,当点击构面filter时我想从我的构面filter中删除不可用的标签并更新新的构面计数。

如果它有帮助,那么查询的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 } 

真的希望有人可以提供建议。 开始把这头发拉出来。

您应该使用筛选查询进行构面搜索以获得准确的结果:

 query do filtered do query {  } filter  (pass in facet values) end 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 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。

搜索请求通常由两部分组成:查询和filter。 如果搜索请求仅包含查询部分,则基于完整的搜索结果计算构面。 换句话说,如果搜索结果包含10个带有“Pet Friendly”标签的记录和5个带有“No Pets Allowed”标签的记录,则facet响应将包含两个方面:“Pet Friendly”和“No Pets Allowed”。 现在让我们假设用户通过选择“Pet Friendly”标签来限制结果。 如果将“Pet Friendly”子句添加到请求的查询部分,则搜索结果将限制为带有“Pet Friendly”标记的10条记录,并且只返回一个方面:“Pet Friendly”。 但是,如果将“Pet Friendly”子句添加为filter,则搜索结果仍将限制为10条记录,但将返回两个方面。 之所以会发生这种情况,是因为方面是仅根据搜索请求的查询部分计算的,而查询部分没有改变 – 它仍会产生具有15个具有两个不同方面的记录的搜索结果。

要回答您的问题,如果查询未返回任何结果(例如,用户同时选择了“Pet Friendly”和“No Pets Allowed”标签),则结果中没有任何方面,因此不会返回任何方面。