2015-03-31 1 views
0

Я очень новичок в поиске elastics, и документация действительно просто смущает меня, поэтому, пожалуйста, несите меня немного здесь.Elasticsearch: Соответствующие документы с массивом в нем

У меня есть индекс называется zproducts и под ним тип, называемый item, который сопоставляется несколько выглядит следующим образом:

{ 
    "item_name" : "Product A", 
    "category_ids" : [ "id1", "id2" ] 
}, 
{ 
    "item_name" : "Product B", 
    "category_ids" : [ "id1" ] 
}, 
{ 
    "item_name" : "Product C", 
    "category_ids" : [ "id2" ] 
} 

Я хочу, чтобы иметь возможность запрашивать товары, которые соответствуют по меньшей мере, одно из из категории. то есть. запрос на id2 вернет продукты A и C.

Казалось бы, у меня есть та же самая проблема, что и у this.

Но решение, предлагаемое там, просто не работает для меня.

Это мой текущий запрос:

/zproducts/items/_search

{ 
    "query": { 
     "bool": { 
      "must": [ 
       { 
        "term": { 
         "category_ids": "id2" 
        } 
       } 
      ] 
     } 
    } 
} 

Последующий тест запрос:

{ 
    "query": { 
     "filtered": { 
      "filter": { 
       "term": { 
        "category_ids": "id2" 
       } 
      } 
     } 
    } 
} 

Оба запроса возвращает все элементы в магазине, а не только те, которые я пытаюсь для запроса.

Был также оригинальный запрос, который по какой-то причине работал, но полностью прекратил работу.

{ 
    "query": { 
     "bool": { 
      "must": [ 
       { 
        "match": { 
         "category_ids": { 
          "query": "id2", 
          "operator": "or" 
         } 
        } 
       } 
      ] 
     } 
    } 
} 

Так что же я делаю неправильно здесь? Может ли кто-нибудь пролить свет?

+0

Все ваши запросы должны давать ожидаемые результаты, если тип 'category_ids' является' string'. Я просто попробовал их на своей локальной установке. Можете ли вы поделиться результатами «GET zproducts/item/_mapping»? – bittusarkar

+0

@ baskar- позвольте мне поместить его в [pastebin] (http://pastebin.com/K9bv6vNp), поскольку он довольно длинный. Я уверен, что 'category_ids' имеет тип' string'. – rgin

ответ

1

Этот запрос:

{ 
    "query": { 
     "filtered": { 
      "filter": { 
       "term": { 
        "category_ids": "id2" 
       } 
      } 
     } 
    } 
} 

правильно. Убедитесь, что вы делаете свой запрос как POST /zproducts/items/_search, а не GET /zproducts/items/_search - получение всех документов в индексе назад для запроса - это хороший намек на то, что тело запроса игнорируется, что является хорошим советом о том, что вы используете GET; многие клиенты не отправят тело запроса с запросом GET, который ES интерпретирует как пустой запрос.

+0

Почти упал с моего кресла с лица. Я использую 'GET' все время, я не понимал, что вам нужно использовать' POST' для запросов. Но теперь я получаю другую проблему, используя этот запрос с 'POST' возвращает пустой набор. – rgin

+0

Попробуйте расширить запрос, пока он не начнет возвращать результаты, а затем обрезает его. Вы также можете попробовать просто «POST/zproducts/_search», если у вас есть только один тип документа. –

+0

Как ни странно, запрос не работал, но исходный (см. Последний запрос по вопросу) снова начал работать. Я думаю, что я примерно на расстоянии в дюйм от сумасшествия. Спасибо за помощь, и этот указатель на предмет 'GET' vs' POST'. Надеюсь, это помогает кому-то другому. – rgin

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

  • Нет связанных вопросов^_^