2013-06-30 2 views
2

У меня проблема с выполнением поиска фасетки на вложенном объекте.not_analyzed для вложенного типа на ElasticSearch?

Возьмем, к примеру у меня есть следующий документ:

tags: [ 
    { 
     tag: "tag0", 
     tag_url: "http://xxxxxxx.com/tag/tag0/" 
    }, 
    { 
     tag: "tag1", 
     tag_url: "http://xxxxxx.com/tag/tag1/" 
    } 
], 

categories: [ 
    { 
     category: "cat0", 
     category_url: "http://xxxxxx.com/category/cat0/" 
    }, 
    { 
     category: "cat1", 
     category_url: "http://xxxxxx.com/category/cat1/" 
    } 
], 

и я хочу, чтобы выполнить фаску на tags.tag и tags.tag_url

И так я, что отображение этого я использую для того, чтобы создать index:not_analyzed для вложенные поля?

Я попытался это отображение:

mapping_data[mapping_name]["properties"] = { 
     "tags.tag" : { 
      "type": "multi_field", 
       "fields" : { 
        "tags.tag": {"type" : "string", "index" : "analyzed", "store": "yes"}, 
        "untouched" : {"type" : "string", "index" : "not_analyzed"} 
       } 
     }, 
     "tags.tag_url" : { 
      "type": "multi_field", 
       "fields" : { 
        "tags.tag_url": {"type" : "string", "index" : "analyzed", "store": "yes"}, 
        "untouched" : {"type" : "string", "index" : "not_analyzed"} 
       } 
     }, 
     "categories.category" : { 
      "type": "multi_field", 
       "fields" : { 
        "categories.category": {"type" : "string", "index" : "analyzed", "store": "yes"}, 
        "untouched" : {"type" : "string", "index" : "not_analyzed"} 
       } 
     }, 
     "categories.category_url" : { 
      "type": "multi_field", 
       "fields" : { 
        "categories.category_url": {"type" : "string", "index" : "analyzed", "store": "yes"}, 
        "untouched" : {"type" : "string", "index" : "not_analyzed"} 
       } 
     }, 

} 

и

mapping_data[mapping_name]["properties"] = { 
     "tags" : { 
      "type": "nested" 
     }, 

     "categories" : { 
      "type": "nested" 
     }, 
} 

Но это не дает мне нужный результат.

Использование type:nested, все еще токенизирует вложенное поле, а type: multi_field не может быть выражено так, чтобы вложенное поле было not_analyzed. (учтите, что я использовал tags.tag в варианте multi_field, но безрезультатно.)

Итак, как выразить отображение для достижения грани для вложенных документов?

PS: http://www.elasticsearch.org/guide/reference/mapping/nested-type/ и http://www.elasticsearch.org/guide/reference/mapping/nested-type/ не дали результата, который мне нужен, поскольку у меня нет значения_поля.

ответ

5

Ниже отображение JSON, что вы должны использовать для вложенной области tags:

{ 
    "type" : { 
     "properties" : { 
      "tags" : { 
       "type": "nested", 
       "properties" : { 
        "tag" : { 
         "type": "multi_field", 
         "fields" : { 
          "tag": {"type" : "string", "index" : "analyzed", "store": "yes"}, 
          "untouched" : {"type" : "string", "index" : "not_analyzed"} 
         } 
        }, 
        "tag_url" : { 
         "type": "multi_field", 
         "fields" : { 
          "tag_url": {"type" : "string", "index" : "analyzed", "store": "yes"}, 
          "untouched" : {"type" : "string", "index" : "not_analyzed"} 
         } 
        } 
       } 
      } 
     } 
    } 
} 

Это прекрасно, чтобы определить вложенный объект, содержащий свойства, которые могут быть любого типа, в вашем случае multi_field.

Вы можете сделать нужную огранку на tags.untouched поле, как это:

{ 
    "query" : { 
     "match_all" : {} 
    }, 
    "facets": { 
     "tags": { 
     "terms": { 
      "field": "tags.tag.untouched", 
      "size": 10 
     }, 
     "nested" : "tags" 
     } 
    } 
} 

Я проверил это с последней версией elasticsearch. Имейте в виду, что способ создания вложенных граней изменился с 0.90. Посмотрите на this issue, чтобы узнать больше.

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