2013-07-03 4 views
2

Je veux chercher dans elasticsearch mais je me fais toucher même si la condition ne correspond pas. Pour exemple: -Recherche dans array par elasticsearch

 { 
     tweet: [ 
       { 
        firstname: Lav 
        lastname: byebye 
      } 
      { 
        firstname: pointto 
        lastname: ihadcre 
      } 
      { 
        firstname: letssearch 
        lastname: sarabhai 
      } 
      ] 
     } 
    } 

Maintenant il y a la condition suivante: -

1) doit: - prenom: Lav doit: - Nom: byebye nécessaire: il devrait être frappé

obtenir: Hit

2) doit: - prenom: Lav doit: - Nom: ihadcre requi rouge: il ne doit pas être touché

obtenir: Hit

je ne devrais pas être frappé en 2ème condition qui est le problème

grâce à l'aide

+0

pouvez-vous décrire la requête exacte que vous avez essayée? – Sai

Répondre

4

Pour obtenir le comportement que vous décrivez, Les tweets doivent être indexés comme nested objects et recherchés en utilisant nested query ou filter. Par exemple:

curl -XDELETE localhost:9200/test-idx 
curl -XPUT localhost:9200/test-idx -d '{ 
    "settings": { 
     "index.number_of_shards": 1, 
     "index.number_of_replicas": 0 
    }, 
    "mappings": { 
     "doc": { 
      "properties": { 
       "tweet": {"type": "nested"} 
      } 
     } 
    } 
}' 
curl -XPUT "localhost:9200/test-idx/doc/1" -d '{ 
    "tweet": [{ 
     "firstname": "Lav", 
     "lastname": "byebye" 
    }, { 
     "firstname": "pointto", 
     "lastname": "ihadcre" 
    }, { 
     "firstname": "letssearch", 
     "lastname": "sarabhai" 
    }] 
} 
' 
echo 
curl -XPOST "localhost:9200/test-idx/_refresh" 
echo 
curl "localhost:9200/test-idx/doc/_search?pretty=true" -d '{ 
    "query": { 
     "nested" : { 
      "path" : "tweet", 
      "score_mode" : "avg", 
      "query" : { 
       "bool" : { 
        "must" : [ 
         { 
          "match" : {"tweet.firstname" : "Lav"} 
         }, 
         { 
          "match" : {"tweet.lastname" : "byebye"} 
         } 
        ] 
       } 
      } 
     } 
    } 
}' 
echo 
curl "localhost:9200/test-idx/doc/_search?pretty=true" -d '{ 
    "query": { 
     "nested" : { 
      "path" : "tweet", 
      "score_mode" : "avg", 
      "query" : { 
       "bool" : { 
        "must" : [ 
         { 
          "match" : {"tweet.firstname" : "Lav"} 
         }, 
         { 
          "match" : {"tweet.lastname" : "ihadcre"} 
         } 
        ] 
       } 
      } 
     } 
    } 
}' 
+0

J'ai essayé cette requête mais je n'ai pas pu obtenir le résultat requis. – Lav

+0

Il ne s'agit pas seulement d'utiliser des requêtes imbriquées au moment de la requête. Assurez-vous de modifier votre mappage pour prendre en charge l'imbrication à l'index. Lisez [les es docs sur la cartographie imbriquée] (http://www.elasticsearch.org/guide/reference/mapping/nested-type/) – ramseykhalaf

+0

J'espère que l'exemple vous aidera à le comprendre. – imotov

Questions connexes