2015-12-29 2 views
0

У меня есть коллекция в MongoDB со следующей структурой:Elasticsearch фильтрация по размеру поля массива

[ 
    { 
     "Name" : "A", 
     "CustomerInfo" : [ 
      { 
       "CustomerCompany" : "abc", 
       "CustomerEmail" : "[email protected]", 
       "SubmissionDate" : 1415070090 
      }, 
      { 
       "CustomerCompany" : "xyz", 
       "CustomerEmail" : "[email protected]", 
       "SubmissionDate" : 1438820000 
      } 
     ] 
    }, 
    { 
     "Name" : "B", 
    }, 
    { 
     "Name" : "C", 
     "CustomerInfo" : [ 
      { 
       "CustomerCompany" : "mno", 
       "CustomerEmail" : "[email protected]", 
       "SubmissionDate" : 1412590000 
      } 
     ] 
    } 
    ... 
] 

Я создал реку для этой коллекции в elasticsearch с помощью Elasticsearch-river-plugin

curl -XPUT 'http://localhost:9200/_river/product_custinfo/_meta' -d '{ 
    "index": { 
    "name": "CustomerInfo", 
    "type": "CustomerInfo" 
    }, 
    "mongodb": { 
    "db": "MyDB", 
    "collection": "CustInfo" 
    }, 
    "type": "mongodb" 
}' 

картированию по реке:

"CustomerInfo" : { 
    "properties" : { 
     "CustomerCompany" : { 
      "type" : "string" 
     }, 
     "CustomerEmail" : { 
      "type" : "string" 
     }, 
     "SubmissionDate" : { 
      "type" : "long" 
     } 
    } 
} 

Теперь я хочу запросить документы, содержащие более 2 custo меры. (Примечание: это может быть любое значение). я был в состоянии получить результаты в MongoDB используя следующий запрос:

db.CustInfo.find({'$where' : 'this.CustomerInfo.length > 2'}) 

Основываясь на this вопрос, я попробовал этот elasticsearch запрос:

{ 
    "query": { 
     "filtered": { 
      "filter": { 
       "bool": { 
        "must": [ 
         {"exists" : { 
          "field" : "CustomerInfo" 
          } 
         }, 
         {"script" : { 
          "script" : "doc['CustomerInfo'].size() > 2" 
          } 
         } 
        ] 
       } 
      } 
     } 
    } 
} 

, что привело к ошибке:

nested: GroovyScriptExecutionException[ElasticsearchIllegalArgumentException[No field found for [CustomerInfo] in mapping with types []]];

Использование _source вместо doc дает правильный результат, но очень медленный.

"script" : { 
    "script" : "_source.CustomerInfo.size() > 2" 
} 

Есть ли другой способ фильтрации результата на основе размера поля массива? Я не хочу создавать новое поле с количеством клиентов.


MongoDB: 3.0.7

ElasticSearch: 1.4.2

Elasticsearch-Ривер-Plugin: 2.0.9

ответ

1

CustomerInfo Поле не существует в Lucent, поля, существуют CustomerInfo.CustomerCompany, CustomerInfo.CustomerEmail и CustomerInfo.SubmissionDate. Таким образом, вы можете использовать "script" : "doc['CustomerInfo.CustomerCompany'].size() > 2"

Смежные вопросы