[英]Facet Troubles with Elasticsearch on Query
在我的查詢中添加一個術語而不是過濾器時,我得到了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
}
真的希望有人可以提供建議。 開始把這頭發拉出來。
您應該使用篩選查詢進行構面搜索以獲得准確的結果:
query do
filtered do
query { <search keywords> }
filter <your filter> (pass in facet values)
end
end
<facet>
...
<facet>
我其實很親密。 因為我的標簽可以有多個我需要使用術語而不是術語,即,
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。
搜索請求通常由兩部分組成:查詢和過濾器。 如果搜索請求僅包含查詢部分,則基於完整的搜索結果計算構面。 換句話說,如果搜索結果包含10個標記為“Pet Friendly”的記錄和5個標記為“No Pets Allowed”的記錄,則facet響應將包含兩個方面:“Pet Friendly”和“No Pets Allowed”。 現在讓我們假設用戶通過選擇“Pet Friendly”標簽來限制結果。 如果將“Pet Friendly”子句添加到請求的查詢部分,則搜索結果將限制為帶有“Pet Friendly”標記的10條記錄,並且只返回一個方面:“Pet Friendly”。 但是,如果將“Pet Friendly”子句添加為過濾器,則搜索結果仍將限制為10條記錄,但將返回兩個方面。 之所以會發生這種情況,是因為構面只是根據搜索請求的查詢部分計算而且查詢部分沒有改變 - 它仍然會生成包含15個記錄和兩個不同構面的搜索結果。
要回答您的問題,如果查詢未返回任何結果(例如,用戶同時選擇了“Pet Friendly”和“No Pets Allowed”標簽),則結果中沒有任何方面,因此不會返回任何方面。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.