Solr comment affiner la recherche à une marque spécifique et également obtenir tous les frères et sœurs de cette marque en une seule requête ?


Anton Klichkov

Quand j'entre dans cette URL

http://localhost:8983/solr/shop/select?facet.field=brand&facet=on&facet.mincount=1&fl=name,brand,cat&q=mobile

j'ai suivi

response {
  "responseHeader":{
    "status":0,
    "QTime":0,
    "params":{
      "q":"mobile",
      "facet.field":"brand",
      "fl":"name,brand,cat",
      "facet.mincount":"1",
      "facet":"on"}},
  "response":{"numFound":7,"start":0,"docs":[
      {
        "name":"moto g",
        "brand":"motorola",
        "cat":["mobile"]},
      {
        "name":"moto x",
        "brand":"motorola",
        "cat":["mobile"]},
      {
        "name":"iphone 5",
        "brand":"apple",
        "cat":["mobile"]},
      {
        "name":"iphone 4",
        "brand":"apple",
        "cat":["mobile"]},
      {
        "name":"iphone 5c",
        "brand":"apple",
        "cat":["mobile"]},
      {
        "name":"iphone 4s",
        "brand":"apple",
        "cat":["mobile"]},
      {
        "name":"iphone 5s",
        "brand":"apple",
        "cat":["mobile"]}]
  },
  "facet_counts":{
    "facet_queries":{},
    "facet_fields":{
      "brand":[
        "apple",5,
        "motorola",2]},
    "facet_ranges":{},
    "facet_intervals":{},
    "facet_heatmaps":{}}}

Maintenant, je souhaite restreindre la recherche aux téléphones mobiles de la marque Apple . Pour cela, j'utilise une requête de filtrage comme celle-ci :

http://localhost:8983/solr/shop/select?facet.field=brand&facet=on&facet.mincount=1&fl=name,brand,cat&q=mobile&fq=brand:apple

et j'obtiens ce résultat :

{
  "responseHeader":{
    "status":0,
    "QTime":1,
    "params":{
      "q":"mobile",
      "facet.field":"brand",
      "fl":"name,brand,cat",
      "facet.mincount":"1",
      "fq":"brand:apple",
      "facet":"on"}},
  "response":{"numFound":5,"start":0,"docs":[
      {
        "name":"iphone 5",
        "brand":"apple",
        "cat":["mobile"]},
      {
        "name":"iphone 4",
        "brand":"apple",
        "cat":["mobile"]},
      {
        "name":"iphone 5c",
        "brand":"apple",
        "cat":["mobile"]},
      {
        "name":"iphone 4s",
        "brand":"apple",
        "cat":["mobile"]},
      {
        "name":"iphone 5s",
        "brand":"apple",
        "cat":["mobile"]}]
  },
  "facet_counts":{
    "facet_queries":{},
    "facet_fields":{
      "brand":[
        "apple",5]},
    "facet_ranges":{},
    "facet_intervals":{},
    "facet_heatmaps":{}}}

Je suis content du résultat. Mais je veux aussi que facet_fields contienne à la fois apple et motorola. En un mot, j'ai besoin du résultat suivant:

{
  "responseHeader":{
    "status":0,
    "QTime":1,
    "params":{
      "q":"mobile",
      "facet.field":"brand",
      "fl":"name,brand,cat",
      "facet.mincount":"1",
      "fq":"brand:apple",
      "facet":"on"}},
  "response":{"numFound":5,"start":0,"docs":[
      {
        "name":"iphone 5",
        "brand":"apple",
        "cat":["mobile"]},
      {
        "name":"iphone 4",
        "brand":"apple",
        "cat":["mobile"]},
      {
        "name":"iphone 5c",
        "brand":"apple",
        "cat":["mobile"]},
      {
        "name":"iphone 4s",
        "brand":"apple",
        "cat":["mobile"]},
      {
        "name":"iphone 5s",
        "brand":"apple",
        "cat":["mobile"]}]
  },
  "facet_counts":{
    "facet_queries":{},
    "facet_fields":{
      "brand":[
        "apple",5,
        "motorola",2]},
    "facet_ranges":{},
    "facet_intervals":{},
    "facet_heatmaps":{}}}

Merci pour la réponse à l'avance.

MatsLindh

Vous pouvez utiliser le balisage de filtre et l'exclusion de filtre pour toujours obtenir la liste complète des facettes, quels que soient les filtres spécifiques.

q=mobile&fq={!tag=brand}brand:apple&facet=on&facet.field={!ex=brand}brand

Articles connexes