2016-02-26 2 views
1

мы имеем упругий индекс поиска со следующим картированием (с указанием только частичное отображение, имеющего отношение к данному вопросу)Эластичного тип поиска общего отображения и агрегация пробега в зависимости от типа данных

"instFields": { 
      "properties": { 
       "_index": { 
       "type": "object" 
       }, 
       "fieldValue": { 
       "fields": { 
        "raw": { 
        "index": "not_analyzed", 
        "type": "string" 
        } 
       }, 
       "type": "string" 
       }, 
       "sourceFieldId": { 
       "type": "integer" 
       } 
      }, 
      "type": "nested" 
      } 

как вы можете видеть fieldValue типа string : в исходных данных в базе данных для этого столбца fieldValue хранится в столбце типа JSON (в Postgresql). Прецедент такой, что, когда эти данные хранятся fieldValue может быть действительным JsNumber, JsString, JsBoolean (любой действительный [JsValue][1] Теперь вопрос в том, что при сохранении этого fieldValue в ES - это придется быть определенный тип - так мы преобразуем fieldValue в String . выдвигая данные в ElasticSearch

Ниже приведен пример данные из поиска эластичного

"instFields": [ 
     { 
      "sourceFieldId": 1233, 
      "fieldValue": "Demo Logistics LLC" 
     }, 
     { 
      "sourceFieldId": 1236, 
      "fieldValue": "169451" 
     } 
     ] 

это становится интересно, где сейчас мы хотим запустить различными metrics aggregations на fieldValue - например, если для sourceFieldId = 1236 затем выполните [avg][3] по адресу fieldValue - problem is fieldValue необходимо было сохранить как string в ES - изначально fieldValue был JsValue Тип поля в приложении. что это лучший способ создать отображение в упругом поиске таким образом, что fieldValue может быть сохранен с помощью соответствующего типа против string типа агрегация, так различных метрик может быть запущена из fieldValue которые типа long (хотя кодируются как string в ES)

ответ

0

One способов достижения этого - создать различные области в упругом поиске со всеми возможными type от JsValue (например, JsNumber, JsBoolean, JsString и т. д.). Теперь во время индексации - приложение может получить правильный тип JsValue поля, чтобы выяснить, является ли это JsString, JsNumber, JsBoolean и т.д.

на стороне приложения я могу расшифровать собственно type из fieldValue индексируется

value match{ 
     case JsString(s) => 
     case JsNumber(n) => 
     case JsBoolean(b) 
} 

теперь модифицируют отображение в эластичном поиске и добавлении большего количества полей - каждый из которых имеет надлежащий тип - как показано ниже

"instFields": { 
            "properties": { 
             "_index": { 
              "type": "object" 
             }, 
             "fieldBoolean": { 
              "type": "boolean" 
             }, 
             "fieldDate": { 
              "fields": { 
               "raw": { 
                "format": "dateOptionalTime", 
                "type": "date" 
               } 
              }, 
              "format": "dateOptionalTime", 
              "type": "date" 
             }, 
             "fieldDouble": { 
              "fields": { 
               "raw": { 
                "type": "double" 
               } 
              }, 
              "type": "double" 
             }, 
             "fieldLong": { 
              "fields": { 
               "raw": { 
                "type": "long" 
               } 
              }, 
              "type": "long" 
             }, 
             "fieldString": { 
              "fields": { 
               "raw": { 
                "index": "not_analyzed", 
                "type": "string" 
               } 
              }, 
              "type": "string" 
             }, 
             "fieldValue": { 
              "fields": { 
               "raw": { 
                "index": "not_analyzed", 
                "type": "string" 
               } 
              }, 
              "type": "string" 
             } 

сейчас у t IME индексации

value match{ 
     case JsString(s) => //populate fieldString 
     case JsNumber(n) => //populate fieldDouble (there is also fieldLong) 
     case JsBoolean(b) //populate fieldBoolean 
} 

таким образом, в настоящее время boolean значения сохраняется в fieldBoolean, number хранится в long и т.д. в настоящее время работает агрегацию метрик становится нормальным бизнесом, идя против fieldLong или fieldDouble поля (в зависимости от использования запроса случае) , поле fieldValue все еще присутствует в ES-сопоставлении и индексе, как и раньше. Приложение будет продолжать преобразовывать значение в string и хранить его в fieldValue, как и раньше, - таким образом, запросы, которые не заботятся о типах, могут запрашивать только поле fieldValue в индексе.

0

Похоже, что у вас должно быть два отдельных поля, одно для случая, когда значение является строкой, а другое - для случая, когда это экземпляр числа.

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

Независимо от того, что elasticsearch не сможет делать как в одном поле