0

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

{ 
    "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" 
         } 
        } 
       } 
      ] 
     } 
    } 
} 

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

ответ

1

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

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

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

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

В вашем случае это выглядит так, что случай 1 будет проще реализовать.

+0

Да, это ответ. Но если вы заметили, используя аннотации Spring, я думал, что я задал 'not_analyzed' с' FieldIndex.not_analyzed'. Я приму свой ответ немного (SO хочет, чтобы я подождал 8 минут). –

+0

Указанный 'not_analyzed' для поля' metadata' и не каскадируется во внутренние поля 'metadata'. Вы можете увидеть это при извлечении сгенерированного сопоставления для вашего типа 'vid' с помощью' curl -XGET localhost: 9200/ws/_mapping/vid' – Val

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