2015-10-23 3 views
1

У меня есть запрос в elasticsearch, который работает просто отлично:Фильтрация по BOOL и has_child с elasticsearch

body = 
    size: opts.size 
    query:   
    fuzzy_like_this: 
    fields: ['title', 'content'] 
     like_text: opts.search 
     fuzziness: 1 
    filter: 
    has_child: 
     type: 'sku' 
     filter: 
     bool: 
      must: 
      range: 
       regular_price: 
       gte: opts.min_price 
       lte: opts.max_price 
    highlight: 
    pre_tags: ['<strong>'] 
    post_tags: ['</strong>'] 
    fields: 
     title: 
     force_source: true 
     fragment_size: 150 
     number_of_fragments: 1 

Это получает products чье название или содержание нечетким матч opts.search и которые имеют skus с указанным диапазоном цен. Оно работает.

Я хотел бы дополнительно исключить любые products, у которых есть hide_from_catalog boolean, установленный в true. Однако сделать небольшое изменение не работает, как я ожидал:

body = 
    size: opts.size 
    query:   
    fuzzy_like_this: 
    fields: ['title', 'content'] 
     like_text: opts.search 
     fuzziness: 1 
    filter: 
    ### Adding this causes an error ### 
    bool:       
     must_not:     
     term:      
      hide_from_catalog: true 
    has_child: 
     type: 'sku' 
     filter: 
     bool: 
      must: 
      range: 
       regular_price: 
       gte: opts.min_price 
       lte: opts.max_price 
    highlight: 
    pre_tags: ['<strong>'] 
    post_tags: ['</strong>'] 
    fields: 
     title: 
     force_source: true 
     fragment_size: 150 
     number_of_fragments: 1 

Я играл немного и не могу заставить его работать. Неисправность выглядит так:

SearchPhaseExecutionException[Failed to execute phase [query_fetch],... 
ElasticsearchParseException[Expected field name but got START_OBJECT \"has_child\"] 

Я предполагаю, что фильтрация отформатирована неправильно.

Каким будет подходящий способ для добавления этого дополнительного фильтра?

ответ

3

Вам необходимо включить has_child фильтр в bool фильтр в пункте must, как это:

body = 
    size: opts.size 
    query:   
    fuzzy_like_this: 
    fields: ['title', 'content'] 
     like_text: opts.search 
     fuzziness: 1 
    filter: 
    bool:       
     must_not:     
     term:      
      hide_from_catalog: true 
     must:     
     has_child: 
      type: 'sku' 
      filter: 
      bool: 
       must: 
       range: 
        regular_price: 
        gte: opts.min_price 
        lte: opts.max_price 
    highlight: 
    pre_tags: ['<strong>'] 
    post_tags: ['</strong>'] 
    fields: 
     title: 
     force_source: true 
     fragment_size: 150 
     number_of_fragments: 1 
Смежные вопросы