次の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"
}
}
}
}
}'