2012-03-27 13 views
2

Wenn ich einen Begriff zu meiner Abfrage anstelle eines Filters hinzufügen, bekomme ich 0 Facetten. FYI Ich benutze den Reifen Juwel mit Ruby.Facet Probleme mit Elasticsearch auf Abfrage

Hier ist mein Modell-Code mit Mapping:

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 

Dann ist hier die Suchmethode

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 

I 0 Facets bekommen. Aber wenn ich Facetten zu einem Filter verschiebe, dh unten bekomme ich volle Facetten.

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 

Während dies in Ordnung ist es nicht wollen, wenn eine Facette Filter klickte ich nicht verfügbaren Tags aus meiner Facette Filter und aktualisieren Sie die neue Facette Zahl entfernen möchten.

Wenn es hier hilft, ist der JSON für die Abfrage, die funktioniert und nicht.

## 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 
} 

Wirklich hoffe jemand kann beraten. Ich fing an, mir die Haare auszuziehen.

+0

Nur um sicherzustellen, gibt die Abfrage ohne Facetten keine Ergebnisse zurück? – imotov

+0

Wenn ich die Begriffe Filter für Tags auskommentiere, dann werden Ergebnisse zurückgegeben. Und ich bekomme Facetten. Also ist es ein Fehler mit dem Begriff Facettenabfrage? – Lee

+0

Ich meinte, Sie erhalten jedes Suchergebnis (nicht Facetten), wenn Sie nicht auskommentieren müssen "must {term 'tags.name.exact', params [: tag]}". Facetten werden basierend auf den Ergebnissen berechnet, die durch den Abfrageteil der Anfrage begrenzt sind. Wenn also die Abfrage keine Ergebnisse liefert, erhalten Sie keine Facetten. – imotov

Antwort

3

Ich war eigentlich ganz in der Nähe. Da meine Tags mehrere haben kann ich brauchte Begriffe verwenden nicht das heißt Begriff

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 

Sie aber imotov für Ihre beraten danken, Hoang.

2

Eine Suchanfrage besteht normalerweise aus zwei Teilen: einer Abfrage und einem Filter. Wenn eine Suchanfrage nur einen Abfrageteil enthält, werden Facetten basierend auf dem vollständigen Suchergebnis berechnet. Mit anderen Worten, wenn ein Suchergebnis 10 Datensätze mit dem Tag "Pet Friendly" und 5 Datensätze mit dem Tag "No Pets Allowed" enthält, enthält die Facettenantwort zwei Facetten: "Pet Friendly" und "No Pets Allowed". Nehmen wir nun an, ein Benutzer schränkt die Ergebnisse ein, indem er das Tag "Pet Friendly" auswählt. Wenn die "Pet Friendly" -Klausel zum Abfrageteil der Anfrage hinzugefügt wird, wird das Suchergebnis auf 10 Datensätze mit dem Tag "Pet Friendly" beschränkt und es wird nur eine Facette zurückgegeben: "Pet Friendly". Wenn die "Pet Friendly" -Klausel jedoch als Filter hinzugefügt wird, ist das Suchergebnis immer noch auf 10 Datensätze beschränkt, es werden jedoch zwei Facetten zurückgegeben. Dies liegt daran, dass Facetten nur auf der Grundlage des Abfrageteils der Suchanforderung berechnet werden und sich der Abfrageabschnitt nicht ändert. Es werden weiterhin Suchergebnisse mit 15 Datensätzen mit zwei unterschiedlichen Facetten generiert.

Um Ihre Frage zu beantworten, wenn eine Abfrage keine Ergebnisse zurückgibt (z. B. hat der Benutzer sowohl "Pet Friendly" - als auch "No Pets Allowed" -Tags ausgewählt), haben die Ergebnisse keine Facetten, sodass keine Facetten zurückgegeben werden.

3

Sie sollten für Facette Suchanfrage verwenden gefilterten Abfrage exakte Ergebnisse zu erhalten:

query do   
    filtered do 
    query { <search keywords> } 
    filter <your filter> (pass in facet values) 
    end 
end 
<facet> 
... 
<facet>