2016-03-11 2 views
2

Я пытаюсь использовать свойства нескольких полей для поддержки нескольких языков. Я создал следующее отображение для этого:Обновление и поиск в свойствах нескольких полей в ElasticSearch

{ 
    "mappings": { 
    "product": { 
     "properties": { 
     "prod-id": { 
      "type": "string" 
     }, 
     "prod-name": { 
      "type": "string", 
      "fields": { 
      "en": { 
       "type": "string", 
       "analyzer": "english" 
      }, 
      "fr": { 
       "type": "string", 
       "analyzer": "french" 
      } 
      } 
     } 
     } 
    } 
    } 
} 

Я создал тестовую запись:

{ 
    "prod-id": "1234567", 
    "prod-name": [ 
     "Test product", 
     "Produit d'essai" 
    ] 
} 

и попытался запросить с помощью некоторых языков:

{ 
    "query": { 
     "bool": { 
      "must": [ 
       {"match": { 
        "prod-name.en": "Produit" 
       }} 
      ] 
     } 
    } 
} 

В результате я получил мой документ. Но я ожидал, что у меня будет пустой результат, когда я буду использовать французский, но выберете английский. Кажется, ElasticSearch игнорирует, какое поле я указал в запросе. Нет никакой разницы в результатах поиска, когда я использую «prod-name.en» или «prod-name.fr» или просто «prod-name». Ожидается ли такое поведение? Должен ли я делать какие-то особые вещи, чтобы искать только на одном языке?

Другая проблема с обновлением свойства нескольких полей. Я не могу обновить только одно поле.

{ 
    "doc" : { 
     "prod-name.en": "Test" 
    } 
} 

Я получил следующее сообщение об ошибке:

{ 
    "error": { 
     "root_cause": [ 
     { 
      "type": "mapper_parsing_exception", 
      "reason": "Field name [prod-name.en] cannot contain '.'" 
     } 
     ], 
     "type": "mapper_parsing_exception", 
     "reason": "Field name [prod-name.en] cannot contain '.'" 
    }, 
    "status": 400 
} 

Есть ли способ, чтобы обновить только одно поле в нескольких местах собственности?

ответ

3

В вашем картографии поле prod-name.en будет просто проанализировано с использованием анализатора english и того же для французского поля. Тем не менее, ES не выберет для вас значение, которое нужно указать в этом поле.

Вместо этого, вам нужно изменить ваше отображение как этот

{ 
    "mappings": { 
    "product": { 
     "properties": { 
     "prod-id": { 
      "type": "string" 
     }, 
     "prod-name": { 
      "type": "object", 
      "properties": { 
      "en": { 
       "type": "string", 
       "analyzer": "english" 
      }, 
      "fr": { 
       "type": "string", 
       "analyzer": "french" 
      } 
      } 
     } 
     } 
    } 
    } 
} 

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

{ 
    "prod-id": "1234567", 
    "prod-name": { 
     "en": "Test product", 
     "fr": "Produit d'essai" 
    } 
} 

Что касается части обновления, то ваш частичный документ должен быть таким, как это.

{ 
    "doc" : { 
     "prod-name": { 
      "en": "Test" 
     } 
    } 
} 
+0

Большое спасибо Val! Вы действительно помогли мне! Ваше решение отлично работает! –

+0

Удивительный, рад, что это помогло! – Val

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