Почему я не могу правильно запросить поле HashMap в Elasticsearch?

Я использую Elasticsearch v1.5.2. У меня есть документ JSON, который выглядит следующим образом.

{
    "id": "RRRZe32",
    "metadata": {
        "published": "2010-07-29T18:11:43.000Z",
        "codeId": "AChdUxnsuRyoCo7roK6gqZSg",
        "codeTitle": "something"
    }
}

Мой объект Java POJO, поддерживающий этот JSON, выглядит следующим образом. Обратите внимание, что я использую Spring-Boot v1.3.0.M2 с зависимостью spring-boot-starter-data-elasticsearch.

@Document(indexName="ws", type="vid")
public class Video {
 @Id 
 private String id;


 @Field(type=FieldType.Object, index=FieldIndex.not_analyzed)
 private Map<String, Object> metadata;
}

Мое отображение определяется следующим образом.

{
    "ws": {
        "mappings": {
            "vid": {
                "properties": {
                    "id": {
                        "type": "string"
                    },
                    "metadata": {
                        "properties": {
                            "codeId": {
                                "type": "string"
                            },
                            "codeTitle": {
                                "type": "string"
                            }
                        }
                    }
                }
            }
        }
    }
}

Я могу успешно запросить документ (используя Sense) с помощью metadata.codeTitle, но не metadata.codeId. Мой запрос для metadata.codeTitle выглядит следующим образом.

{
    "query": {
        "bool": {
            "must": [
                {
                    "term": {
                        "metadata.codeTitle": {
                            "value": "something"
                        }
                    }
                }
            ]
        }
    }
}

Мой запрос для metadata.codeId выглядит следующим образом.

{
    "query": {
        "bool": {
            "must": [
                {
                    "term": {
                        "metadata.codeId": {
                            "value": "AChdUxnsuRyoCo7roK6gqZSg"
                        }
                    }
                }
            ]
        }
    }
}

Любые идеи о том, что я делаю неправильно?


person Jane Wayne    schedule 17.08.2015    source источник


Ответы (1)


Это связано с тем, что ваше поле codeId имеет значение analyzed, а значение в нижнем регистре во время индексации. Итак, у вас есть два решения:

Вы можете запросить так (т.е. все в нижнем регистре)

{
    "query": {
        "bool": {
            "must": [
                {
                    "term": {
                        "metadata.codeId": {
                            "value": "achduxnsuryoco7rok6gqzsg"
                        }
                    }
                }
            ]
        }
    }
}

Или вы можете объявить свое поле codeId как not_analyzed и оставить свой запрос как есть.

В вашем случае похоже, что случай 1 будет проще реализовать.

person Val    schedule 17.08.2015
comment
Да, это ответ. Но если вы заметили, используя аннотации Spring, я думал, что указал not_analyzed с FieldIndex.not_analyzed. Я приму ваш ответ через некоторое время (ТАК хочет, чтобы я подождал 8 минут). - person Jane Wayne; 17.08.2015
comment
Указанный вами not_analyzed предназначен для поля metadata и не распространяется каскадом на внутренние поля metadata. Вы можете увидеть это при получении сгенерированного сопоставления для вашего типа vid с помощью curl -XGET localhost:9200/ws/_mapping/vid - person Val; 17.08.2015