我试图在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
}
}
]
}
}
]
}
}
}
}
}
谢谢!
答案 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
}
}
}