2016-09-12 2 views
0

Имея следующее простое отображение:Скопления в Elasticsearch резки строку вместо того, чтобы все,

curl -XPUT localhost:9200/transaciones/ -d '{ 
    "mappings": { 
     "ventas": { 
      "properties": { 
       "tipo": { "type": "string" }, 
       "cantidad": { "type": "double" } 
      } 
     } 
    } 
}' 

Добавление данных:

curl -XPUT localhost:9200/transaciones/ventas/1 -d '{ 
    "tipo": "Ingreso bancario", 
    "cantidad": 80 
}' 

curl -XPUT localhost:9200/transaciones/ventas/2 -d '{ 
    "tipo": "Ingreso bancario", 
    "cantidad": 10 
}' 

curl -XPUT localhost:9200/transaciones/ventas/3 -d '{ 
    "tipo": "PayPal", 
    "cantidad": 30 
}' 

curl -XPUT localhost:9200/transaciones/ventas/4 -d '{ 
    "tipo": "Tarjeta de credito", 
    "cantidad": 130 
}' 

curl -XPUT localhost:9200/transaciones/ventas/5 -d '{ 
    "tipo": "Tarjeta de credito", 
    "cantidad": 130 
}' 

Когда я пытаюсь получить aggs с:

curl -XGET localhost:9200/transaciones/ventas/_search?pretty=true -d '{ 
    "size": 0, 
    "aggs": { 
     "tipos_de_venta": { 
      "terms": { 
       "field": "tipo" 
      } 
     } 
    } 
}' 

Ответ:

"took" : 15, 
    "timed_out" : false, 
    "_shards" : { 
    "total" : 5, 
    "successful" : 5, 
    "failed" : 0 
    }, 
    "hits" : { 
    "total" : 5, 
    "max_score" : 0.0, 
    "hits" : [ ] 
    }, 
    "aggregations" : { 
    "tipos_de_venta" : { 
     "doc_count_error_upper_bound" : 0, 
     "sum_other_doc_count" : 0, 
     "buckets" : [ { 
     "key" : "bancario", 
     "doc_count" : 2 
     }, { 
     "key" : "credito", 
     "doc_count" : 2 
     }, { 
     "key" : "de", 
     "doc_count" : 2 
     }, { 
     "key" : "ingreso", 
     "doc_count" : 2 
     }, { 
     "key" : "tarjeta", 
     "doc_count" : 2 
     }, { 
     "key" : "paypal", 
     "doc_count" : 1 
     } ] 
    } 
    } 
} 

Как вы можете видеть, что это режет струны Tarjeta de credito Into Tarjeta, de, credit. Как я могу взять всю строку без использования на карте not_analyzed на tipo? Мой желаемый результат будет Ingreso bancario, PayPal и Tarjeta de crédito на ответ будет что-то вроде этого:

"aggregations" : { 
    "tipos_de_venta" : { 
     "doc_count_error_upper_bound" : 0, 
     "sum_other_doc_count" : 0, 
     "buckets" : [ { 
     "key" : "Ingreso bancario", 
     "doc_count" : 2 
     }, { 
     "key" : "PayPal", 
     "doc_count" : 1 
     }, { 
     "key" : "Tarjeta de credito", 
     "doc_count" : 2 
     } ] 
    } 
    } 

PS: Я использую ES 2.3.2

ответ

1

Это потому, что ваш tipo поля анализируемой строка , Правильный способ сделать это, чтобы создать not_analyzed поле для того, чтобы достичь того, чего вы хотите:

curl -XPUT localhost:9200/transaciones/_mapping/ventas -d '{ 
    "properties": { 
     "tipo": { 
      "type": "string", 
      "fields": { 
       "raw": { 
        "type": "string", 
        "index": "not_analyzed" 
       } 
      } 
     } 
    } 
}' 

Затем вам нужно индексировать документы и, наконец, вы будете иметь возможность запускать это и получить желаемые результаты:

curl -XGET localhost:9200/transaciones/ventas/_search?pretty=true -d '{ 
    "size": 0, 
    "aggs": { 
     "tipos_de_venta": { 
      "terms": { 
       "field": "tipo.raw" 
      } 
     } 
    } 
}' 

UPDATE

Если вы действительно не хотите, чтобы создать not_analyzed поле, то у вас есть другой путь, используя scriptterms агрегации, но это действительно может убить производительность вашего кластера

curl -XGET localhost:9200/transaciones/ventas/_search?pretty=true -d '{ 
    "size": 0, 
    "aggs": { 
     "tipos_de_venta": { 
      "terms": { 
       "script": _source.tipo" 
      } 
     } 
    } 
}' 
+0

Я знаю, что я могу сделать это с помощью 'not_analyzed' (как я утверждаю на посту). Я хочу знать, есть ли другая возможность достичь моей цели, не используя ее. –

+0

Я обновил свой ответ – Val

+0

Немного вопрос. Причина того, что вы не используете 'not_analyzed' в поле' tipo', - это то, что кто-то может захотеть выполнить поиск по самому термину. Используя этот 'tipo.raw', я могу сделать поиск непосредственно на' tipo' и получить aggs на 'tipo.raw' (например, две разные вещи)? –

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