elasticsearch中的布尔OR查询

时间:2014-05-21 08:27:17

标签: php elasticsearch

我试图在ElasticSearch中创建一个包含AND和OR条件的查询。

这是一些示例数据:

 {
            "_index": "vins",
            "_type": "vin",
            "_id": "1389",
            "_score": 0.4667464,
            "_source": {
               "sNameLngFr": "LE PUITS DU MOINE CREMANT D'ALSACE BRUT",
               "sNameLngNl": "LE PUITS DU MOINE CREMANT D'ALSACE BRUT",
               "pPrix": 9.19,
               "iPromotion": 1,
               "pPromotion": 5.99,
               "sColor": "pétillant",
               "sColorLngFr": "Pétillant",
               "sColorLngNl": "Mousserende wijn",
               "sProducerUrl": "",
               "iVintage": 0,
               "sPackageType": "6bouteilles",
               "sPackageTypeLngFr": "6 bouteilles",
               "sPackageTypeLngNl": "6 flessen",
               "sKeepingPotentialLngFr": "1 AN",
               "sKeepingPotentialLngNl": "",
               "sVolume": "75 cl",
               "pays": {
                  "iPays": 10,
                  "sNameLngFr": "France",
                  "sNameLngNl": "Frankrijk"
               },
               "region": {
                  "iRegion": 29,
                  "sNameLngFr": "Alsace",
                  "sNameLngNl": "Alsace"
               },
               "appellation": {
                  "iAppelation": 53,
                  "sNameLngFr": "Crémant d'Alsace",
                  "sNameLngNl": "Crémant d'Alsace"
               },
               "sProducer": "CAVE ORSCHWILLER",
               "iKeepingPotential": 0,
               "sCommentaireLngFr": "",
               "sCommentaireLngNl": "",
               "sExternalRef": "717160",
               "sFood1": "2",
               "sFood2": "7",
               "sFood3": "7",
               "sEanBarcode": "",
               "iFamilyId": 71,
               "sFullExternalRef": "00717160",
               "iProduct": 1398,
               "iLot": 6,
               "sUrlLngFr": "http://mestdagh/admin/vins/vinPromoSave?lng=fr",
               "sUrlLngNl": "http://mestdagh/admin/vins/vinPromoSave?lng=nl",
               "sImgUrl": "http://mestdagh/files/library/Vins/Large/16242.jpg",
               "dDateDebut": "08-05-2014",
               "dDateFin": "18-05-2014",
               "bDateEnd": false
            }
         },
         {
            "_index": "vins",
            "_type": "vin",
            "_id": "1380",
            "_score": 0.4643425,
            "_source": {
               "sNameLngFr": "CREMANT D'ALSACE DEMI-SEC LE PUITS DU MOINE",
               "sNameLngNl": "CREMANT D'ALSACE DEMI-SEC LE PUITS DU MOINE",
               "pPrix": 8.39,
               "iPromotion": 0,
               "pPromotion": 8.39,
               "sColor": "pétillant",
               "sColorLngFr": "Pétillant",
               "sColorLngNl": "Mousserende wijn",
               "sProducerUrl": "",
               "iVintage": 0,
               "sPackageType": "6bouteilles",
               "sPackageTypeLngFr": "6 bouteilles",
               "sPackageTypeLngNl": "6 flessen",
               "sKeepingPotentialLngFr": "2 ANS",
               "sKeepingPotentialLngNl": "",
               "sVolume": "75cl",
               "pays": {
                  "iPays": 10,
                  "sNameLngFr": "France",
                  "sNameLngNl": "Frankrijk"
               },
               "region": {
                  "iRegion": 29,
                  "sNameLngFr": "Alsace",
                  "sNameLngNl": "Alsace"
               },
               "appellation": {
                  "iAppelation": 53,
                  "sNameLngFr": "Crémant d'Alsace",
                  "sNameLngNl": "Crémant d'Alsace"
               },
               "sProducer": "CAVE LES FAITIERES",
               "iKeepingPotential": 0,
               "sCommentaireLngFr": "",
               "sCommentaireLngNl": "",
               "sExternalRef": "717050",
               "sFood1": "2",
               "sFood2": "15",
               "sFood3": "7",
               "sEanBarcode": "",
               "iFamilyId": 71,
               "sFullExternalRef": "00717050",
               "iProduct": 1389,
               "iLot": 6,
               "sUrlLngFr": "http://mestdagh/service/elasticsearch/indexVins?lng=fr",
               "sUrlLngNl": "http://mestdagh/service/elasticsearch/indexVins?lng=nl",
               "sImgUrl": "http://mestdagh/files/library/Vins/Large/6982.jpg",
               "dDateDebut": null,
               "dDateFin": null,
               "bDateEnd": null
            }
         },
         {
            "_index": "vins",
            "_type": "vin",
            "_id": "1115",
            "_score": 0.4521447,
            "_source": {
               "sNameLngFr": "SAINT MONT BOISERAIE",
               "sNameLngNl": "SAINT MONT BOISERAIE",
               "pPrix": 4.69,
               "iPromotion": 0,
               "pPromotion": 4.69,
               "sColor": "blancsec",
               "sColorLngFr": "Blanc Sec",
               "sColorLngNl": "Droge witte wijn",
               "sProducerUrl": "",
               "iVintage": 2012,
               "sPackageType": "6bouteilles",
               "sPackageTypeLngFr": "6 bouteilles",
               "sPackageTypeLngNl": "6 flessen",
               "sKeepingPotentialLngFr": "2015",
               "sKeepingPotentialLngNl": "",
               "sVolume": "75 cl",
               "pays": {
                  "iPays": 10,
                  "sNameLngFr": "France",
                  "sNameLngNl": "Frankrijk"
               },
               "region": {
                  "iRegion": 38,
                  "sNameLngFr": "Sud-Ouest",
                  "sNameLngNl": "Sud-Ouest"
               },
               "appellation": {
                  "iAppelation": 0,
                  "sNameLngFr": null,
                  "sNameLngNl": null
               },
               "sProducer": "PRODUCTEURS DE PLAIMONT",
               "iKeepingPotential": 0,
               "sCommentaireLngFr": "",
               "sCommentaireLngNl": "",
               "sExternalRef": "713304",
               "sFood1": "8",
               "sFood2": "7",
               "sFood3": "7",
               "sEanBarcode": "",
               "iFamilyId": 71,
               "sFullExternalRef": "00713304",
               "iProduct": 1124,
               "iLot": 6,
               "sUrlLngFr": "http://mestdagh/service/elasticsearch/indexVins?lng=fr",
               "sUrlLngNl": "http://mestdagh/service/elasticsearch/indexVins?lng=nl",
               "sImgUrl": "http://mestdagh/files/library/Vins/Large/16710.jpg",
               "dDateDebut": null,
               "dDateFin": null,
               "bDateEnd": null
            }
         },

我需要一个字段来搜索必须匹配的字段和另外三个可以选择的字段。

它看起来像:

必须是iPromotion = 1

范围,dDateDebut< =今天

范围,dDateFin> =今天

OR

匹配,bDateEnd == true

因此,这将选择当前促销中与促销日期相对应的所有葡萄酒,或者总是处于促销状态的葡萄酒(bDateEnd设置为true)。

我到目前为止所做的事情,适用于基本日期检查,但不是永久性促销:

"query": {
      "bool": {
         "must": [
            {
               "fuzzy": {
                  "sNameLngFr": {
                     "value": "moine",
                     "boost": 1,
                     "fuzziness": 10,
                     "prefix_length": 0,
                     "max_expansions": 100
                  }
               }
            },
            {
               "match": {
                  "iPromotion": 1
               }
            },
            {
               "range": {
                  "dDateDebut": {
                     "lte": "14-05-2014"
                  }
               }
            },
            {
               "range": {
                  "dDateFin": {
                     "gte": "14-05-2014"
                  }
               }
            }
         ],
         "should": [
            {
                "match": {
                  "bDateEnd": true
               }
            }
         ]
      }
   }

还试过这个,它返回一个错误(SearchPhaseExecutionException):

GET _search
{
   "query": {
      "filtered": {
         "query": {},
         "filter": {
            "and": {
               "filters": [
                  {
                     "fuzzy": {
                        "sNameLngFr": {
                           "value": "moine",
                           "boost": 1,
                           "fuzziness": 10,
                           "prefix_length": 0,
                           "max_expansions": 100
                        }
                     }
                  },
                  {
                     "match": {
                        "iPromotion": 1
                     }
                  },
                  {
                     "and": {
                        "filters": [
                           {
                              "range": {
                                 "dDateDebut": {
                                    "lte": "14-05-2014"
                                 }
                              }
                           },
                           {
                              "range": {
                                 "dDateFin": {
                                    "gte": "14-05-2014"
                                 }
                              }
                           }
                        ]
                     },
                     "or": {
                        "filters": [
                           {
                              "match": {
                                 "bDateEnd": true
                              }
                           }
                        ]
                     }
                  }
               ]
            }
         }
      }
   }
}

谢谢!

2 个答案:

答案 0 :(得分:0)

你应该尝试这样的事情

 {
"query": {
  "bool": {
     "must": [
        {
           "match": {
              "iPromotion": "1"
           }
        },
        {
           "fuzzy": {
              "sNameLngFr": {
                 "value": "moine",
                 "boost": 1,
                 "fuzziness": 10,
                 "prefix_length": 0,
                 "max_expansions": 100
              }
           }
        }
     ],
     "should": [
        {
           "range": {
              "dDateDebut": {
                 "lte": "14-05-2014"
              }
           }
        },
        {
           "range": {
              "dDateFin": {
                 "gte": "14-05-2014"
              }
           }
        },
        {
           "match": {
              "bDateEnd": true
           }
        }
     ]
    }
  }
}

它有帮助......!

答案 1 :(得分:0)

经过相当多的试验和错误后,这个工作:

GET _search
{
   "query": {
      "bool": {
         "must": [
            {
               "fuzzy": {
                  "sNameLngFr": {
                     "value": "chateau",
                     "boost": 1,
                     "fuzziness": 10,
                     "prefix_length": 0,
                     "max_expansions": 100
                  }
               }
            },
            {
               "match": {
                  "iPromotion": 1
               }
            }

         ],
         "should": [
            {
                "match": {
                  "bDateEnd": true
               }
            },
            {
                "bool": {
                    "must": [
                       {
                           "range": {
                              "dDateDebut": {
                                 "lte": "14-05-2014"
                              }
                           }
                        },
                        {
                           "range": {
                              "dDateFin": {
                                 "gte": "14-05-2014"
                              }
                           }
                        }
                    ]
                }
            }
         ],
         "minimum_number_should_match": 1
      }
   }
}