У меня есть коллекция в 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