1

次のpyelasticsearchコードを使用して作成されたインデックスがあります:

編集: 再度更新 11/12/13 18:31 GMT

    entry_mapping = {
        'product': {
            'properties': {
                '_advertiser_id': {'type': 'integer'},
                'advertiser': {'type': 'string'},
                'category': {'type': 'string'},
                'created_at': {'type': 'date'},
                'description': {'type': 'string'},
                'fields': {
                    'type': 'nested',
                    'properties': {
                        'gender': {'type': 'string'},
                        'short_type': {'type': 'string'}
                    }
                },
                'id': {'type': 'string'},
                'name': {'type': 'string'},
                'price': {'type': 'float'},
                'product_type': {'type': 'string'},
                'updated_at': {'type': 'date'},
                'variations': {'type': 'nested'},
            }
        }
    }

    es.create_index('product', settings={'mappings': entry_mapping})

curl -XGET localhost:9200/products/_mappingデータがインポートされた後に返されるクエリ マッピング:

{
  "product" : {
    "product" : {
      "properties" : {
        "_advertiser_id" : {
          "type" : "integer"
        },
        "advertiser" : {
          "type" : "string"
        },
        "category" : {
          "type" : "string"
        },
        "created_at" : {
          "type" : "date",
          "format" : "dateOptionalTime"
        },
        "description" : {
          "type" : "string"
        },
        "fields" : {
          "type" : "nested",
          "properties" : {
            "gender" : {
              "type" : "string"
            },
            "short_type" : {
              "type" : "string"
            }
          }
        },
        "id" : {
          "type" : "string"
        },
        "images" : {
          "properties" : {
            "id" : {
              "type" : "string"
            },
            "url" : {
              "type" : "string"
            }
          }
        },
        "name" : {
          "type" : "string"
        },
        "price" : {
          "type" : "float"
        },
        "product_type" : {
          "type" : "string"
        },
        "updated_at" : {
          "type" : "date",
          "format" : "dateOptionalTime"
        },
        "variations" : {
          "type" : "nested",
          "properties" : {
            "colour" : {
              "type" : "string"
            },
            "female_tops" : {
              "type" : "string"
            },
            "image" : {
              "type" : "string"
            },
            "length" : {
              "type" : "string"
            },
            "size" : {
              "type" : "string"
            },
            "sleeve_length" : {
              "type" : "string"
            },
            "type" : {
              "type" : "string"
            },
            "zip_type" : {
              "type" : "string"
            }
          }
        }
      }
    }
  }
}

次のクエリを使用して正常にクエリを実行しています。

curl -XGET 'http://127.0.0.1:9200/products/_search?size=100' -d '{"query": {"filtered": {"query": {"query_string": {"query": "t-shirt"}}}}}'

以下は結果の例です。

{
   "_index":"product",
   "_type":"product",
   "_id":"525adf3fd1f4677e32d0f996",
   "_score":0.034907393,
   "_source":{
      "category":"T-Shirts",
      "advertiser":"string",
      "product_type":"Clothing",
      "description":"string",
      "fields":{
         "gender":"M"
      },
      "created_at":"2013-10-07T13:24:03.182000",
      "variations":[
         {
            "colour":"Grey",
            "sleeve_length":"Short sleeved",
            "size":"S"
         },
         {
            "colour":"Grey",
            "sleeve_length":"Short sleeved",
            "size":"M"
         },
         {
            "colour":"Grey",
            "sleeve_length":"Short sleeved",
            "size":"L"
         }
      ],
      "updated_at":"2013-10-19T13:54:29.796000",
      "price":12.0,
      "images":[
         {
            "url":"https://s3-eu-west-1.amazonaws.com/...",
            "id":"525adf23d1f4677e32d0f994",
            "resource_uri":""
         },
         {
            "url":"https://s3-eu-west-1.amazonaws.com/...",
            "id":"525adf30d1f4677e32d0f995",
            "resource_uri":""
         }
      ],
      "_advertiser_id":4,
      "id":"525adf3fd1f4677e32d0f996",
      "name":"Fresh Charcoal"
   }
}

pyelticsearch を使用して次のクエリを実行しようとしています。

    self.query = {
        'query': {
            'filtered': {
                'query': {
                    'query_string': {'query': self.query_str}
                },
                'filter': {
                    'and': [
                        {
                            'range': {
                                'price': {
                                    'gte': self.min_price,
                                    'lte': self.max_price
                                }
                            },
                        },
                        {
                            'terms': {
                                '_advertiser_id': self.advertisers,
                            },
                        },
                        {
                            'term': {
                                'fields.gender': self.gender.lower(),
                            },
                        },
                        {
                            'nested': {
                                'path': 'variations',
                                'query': {'match_all': {}},
                                'filter': {
                                    'and': [
                                        {
                                            'terms': {
                                                'variations.size': [s.lower() for s in self.sizes]
                                            },
                                        },
                                        {
                                            'term': {
                                                'variations.colour': self.colour.lower(),
                                            }
                                        }
                                    ]
                                }
                            }
                        },
                    ]
                },
            }
        }
    }

残念ながら、クエリに一致するデータがある場合、結果は返されません。どんな助けでも大歓迎です。

更新: 12/12/13 11:40 GMT

以下は、上記のクエリ コードによって生成された JSON の例です。

curl -XGET 'http://127.0.0.1:9200/product/_search?size=100' -d '
{
   "query":{
      "filtered":{
         "filter":{
            "and":[
               {
                  "range":{}
               },
               {
                  "terms":{
                     "_advertiser_id":[
                        7,
                        4
                     ]
                  }
               },
               {
                  "term":{
                     "fields.gender":"m"
                  }
               },
               {
                  "nested":{
                     "filter":{
                        "and":[
                           {
                              "terms":{
                                 "variations.size":[
                                    "xs",
                                    "s",
                                    "m",
                                    "l",
                                    "xl",
                                    "xxl"
                                 ]
                              }
                           },
                           {
                              "term":{
                                 "variations.colour":"black"
                              }
                           }
                        ]
                     },
                     "path":"variations",
                     "query":{
                        "match_all":{

                        }
                     }
                  }
               }
            ]
         },
         "query":{
            "query_string":{
               "query":"t-shirt"
            }
         }
      }
   }
}'

更新: 2013 年 12 月 12 日 11:51 GMT

物事は奇妙になります。クエリを削除すると、次の結果が得られます。

curl -XGET 'http://127.0.0.1:9200/product/_search?size=100' -d '{
   "query":{
      "filtered":{
         "filter":{
            "and":[
               {
                  "nested":{
                     "filter":{
                        "an":[
                           {
                              "terms":{
                                 "variations.size":[
                                    "xs",
                                    "s",
                                    "m",
                                    "l",
                                    "xl",
                                    "xxl"
                                 ]
                              }
                           },
                           {
                              "term":{
                                 "variations.colour":"black"
                              }
                           }
                        ]
                     },
                     "path":"variations",
                     "query":{
                        "match_all":{

                        }
                     }
                  }
               }
            ]
         },
         "query":{
            "query_string":{
               "query":"t-shirt"
            }
         }
      }
   }
}'

上記のクエリの結果データの例:

{
   "_index":"product",
   "_type":"product",
   "_id":"525ade5ad1f4677e32d0f993",
   "_score":0.10493462,
   "_source":{
      "category":"T-Shirts",
      "advertiser":"...",
      "product_type":"Clothing",
      "description":"...",
      "fields":{
         "gender":"M"
      },
      "created_at":"2013-10-07T13:24:03.182000",
      "variations":[
         {
            "colour":"Black",
            "sleeve_length":"Short sleeved",
            "size":"S"
         },
         {
            "colour":"Black",
            "sleeve_length":"Short sleeved",
            "size":"M"
         },
         {
            "colour":"Black",
            "sleeve_length":"Short sleeved",
            "size":"L"
         }
      ],
      "updated_at":"2013-10-19T14:05:34.299000",
      "price":0.0,
      "images":[
         {
            "url":"...",
            "id":"525ade50d1f4677e30a2cb3a",
            "resource_uri":""
         }
      ],
      "_advertiser_id":4,
      "id":"525ade5ad1f4677e32d0f993",
      "name":"..."
   }
}

*更新: 2012 年 12 月 21 日 10:48 GMT *

クエリ全体と組み合わせると、問題のあるクエリの部分 (つまり、結果が返されない) を分離しました。

{
    'term': {
        'fields.gender': self.gender.lower(),
    },
}

作業クエリの例:

curl -XGET 'http://127.0.0.1:9200/product/_search?size=100' -d '{
   "query":{
      "filtered":{
         "filter":{
            "and":[
               {
                  "range":{
                     "price":{
                        "gte":0.0,
                        "lte":200.0
                     }
                  }
               },
               {
                  "terms":{
                     "_advertiser_id":[
                        7,
                        4
                     ]
                  }
               },
               {
                  "nested":{
                     "filter":{
                        "and":[
                           {
                              "terms":{
                                 "variations.size":[
                                    "xs",
                                    "s",
                                    "m",
                                    "l",
                                    "xl",
                                    "xxl"
                                 ]
                              }
                           },
                           {
                              "term":{
                                 "variations.colour":"black"
                              }
                           }
                        ]
                     },
                     "path":"variations",
                     "query":{
                        "match_all":{

                        }
                     }
                  }
               }
            ]
         },
         "query":{
            "query_string":{
               "query":"t-shirt"
            }
         }
      }
   }
}'

うまくいかないクエリの例:

curl -XGET 'http://127.0.0.1:9200/product/_search?size=100' -d '{
   "query":{
      "filtered":{
         "filter":{
            "and":[
               {
                  "range":{
                     "price":{
                        "gte":0.0,
                        "lte":200.0
                     }
                  }
               },
               {
                  "terms":{
                     "_advertiser_id":[
                        7,
                        4
                     ]
                  }
               },
               {
                  "term":{
                     "fields.gender":"m"
                  }
               },
               {
                  "nested":{
                     "filter":{
                        "and":[
                           {
                              "terms":{
                                 "variations.size":[
                                    "xs",
                                    "s",
                                    "m",
                                    "l",
                                    "xl",
                                    "xxl"
                                 ]
                              }
                           },
                           {
                              "term":{
                                 "variations.colour":"black"
                              }
                           }
                        ]
                     },
                     "path":"variations",
                     "query":{
                        "match_all":{

                        }
                     }
                  }
               }
            ]
         },
         "query":{
            "query_string":{
               "query":"t-shirt"
            }
         }
      }
   }
}'
4

2 に答える 2

0

次のように、ネストされたフィールドを type として設定する必要があると思いますnested

{
   "products":{
      "product":{
         "properties":{
            "_advertiser_id":{
               "type":"long"
            },
            "advertiser":{
               "type":"string"
            },
            "category":{
               "type":"string"
            },
            "created_at":{
               "type":"date",
               "format":"dateOptionalTime"
            },
            "description":{
               "type":"string"
            },
            "fields":{
               "type" : "nested",
               "properties":{
                  "gender":{
                     "type":"string"
                  },
                  "short_type":{
                     "type":"string"
                  }
               }
            },
            "id":{
               "type":"string"
            },
            "images":{
               "type" : "nested",
               "properties":{
                  "id":{
                     "type":"string"
                  },
                  "url":{
                     "type":"string"
                  }
               }
            },
            "name":{
               "type":"string"
            },
            "price":{
               "type":"double"
            },
            "product_type":{
               "type":"string"
            },
            "updated_at":{
               "type":"date",
               "format":"dateOptionalTime"
            },
            "variations":{
               "type" : "nested", 
               "properties":{
                  "colour":{
                     "type":"string"
                  },
                  "female_tops":{
                     "type":"string"
                  },
                  "image":{
                     "type":"string"
                  },
                  "length":{
                     "type":"string"
                  },
                  "size":{
                     "type":"string"
                  },
                  "sleeve_length":{
                     "type":"string"
                  },
                  "type":{
                     "type":"string"
                  },
                  "zip_type":{
                     "type":"string"
                  }
               }
            }
         }
      }
   }
}
于 2013-11-27T12:34:59.007 に答える