簡體   English   中英

在查詢上使用Elasticsearch進行方面的麻煩

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM