Problemer med forskellige mapping på forskellige typer i et index

Vi løb ind i et lidt underligt problem, som vi endte med at konstatere var en “feature” i Elasticsearch.

Neden for ses mapping for et index med to typer: product1 og product2

curl -s -XPOST localhost:9200/test_index -d'
{
    "mappings": {
        "product1": {
            "_source": {
                "enabled": true
            },
            "properties": {
                "name": {
                    "type": "string"
                },
                "size": {
                    "type": "integer"
                }
            }
        },
        "product2": {
            "_source": {
                "enabled": true
            },
            "properties": {
                "name": {
                    "type": "string"
                },
                "size": {
                    "type": "long"
                }
            }
        }
    }
}'

Lig mærke til at name og type forekommer i begge typer. I begge typer er name sat til string, men type er sat til henholdsvis integer og long.

Lad os smide noget data ind og opdater for en sikkerhedskyld

curl -XPUT localhost:9200/test_index/product1/1 -d'{"name":"vare 1","size":100}'
curl -XPUT localhost:9200/test_index/product2/1 -d'{"name":"vare 2","size":20}'
curl -XPOST localhost:9200/test_index/_refresh

Så kan vi prøve at hente det ud og se om det ser rigtigt ud. Da vi kun har 2 dokumenter kan behøver vi ikke lave noget fancy search.

curl -XGET localhost:9200/test_index/_search?pretty

Så vil du få de 2 dokumenter ud. Ikke noget problem der.

Men hvis du vil prøve at lave aggregations elle facets går det galt.

curl -XPOST http://localhost:9200/test_index/_search\?search_type\=count -d '{
    "facets": {
        "size_stats": {
            "statistical": {
                "field": "size"
            }
        }
    },
    "query": {
        "match_all": {}
    }
}'

Her vil du få som forventet en fejl:

{"error":"SearchPhaseExecutionException[Failed to execute phase [query], total failure; shardFailures {[Tg-ScdoaQzKAzuuBtV3VTw][test_index][0]: QueryPhaseExecutionException[[ftest][0]: query[ConstantScore(*:*)],from[0],size[10]: Query Failed [Failed to execute main query]]; nested: ElasticSearchException
; nested: UncheckedExecutionException

; nested: NumberFormatException[Invalid shift value in prefixCoded bytes (is encoded value really an INT?)]; }]”,”status”:500}

Det skyldes at vi søger i begge typer, men de har 2 forskellige mappings på size.

Det næste er dog mere overraskende.

Hvis du lave den samme søgning på kun en type.

curl -XPOST http://localhost:9200/test_index/product1/_search\?search_type\=count -d '{
    "facets": {
        "size_stats": {
            "statistical": {
                "field": "size"
            }
        }
    },
    "query": {
        "match_all": {}
    }
}'

Her ville man jo forvente der ikke skulle være noget problem. Men alligevel kommer fejlen igen!

Efter en del søgning på Google har vi konstateret at man ikke kan have et felt med det samme navn i et index med to forskellige mappgins/typer.
Så med andre ord er det vigtigt at man har styr på sin mapping, så dette ikke sker hvis Elasticsearch selv definere typen på feltet.

Leave a comment

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *

This site uses Akismet to reduce spam. Learn how your comment data is processed.