2015-09-07 4 views
0

Ниже приведен образец формата моих документов JSON, который хранится внутри elasticsearch.Возможно ли это с помощью поиска elastics?

{ 
    "_index": "in22", 
    "_type": "event", 
    "_id": "ET00009709", 
    "_version": 1, 
    "_score": 1, 
    "_source": { 
     "Group": "Event", 
     "Title": "Jurassic World", 
     "_boost": 3, 
     "inner_hits": [ 
      { 
      "Code": "ET00009709", 
      "IsDefault": "", 
      "Language": "English", 
      "Format": "3D", 
      "Region": "MUMBAI" 
     }, 
     { 
      "Code": "ET00009710", 
      "IsDefault": "Y", 
      "Language": "English", 
      "Format": "2D", 
      "Region": "CHEN" 
     }, 
     { 
      "Code": "ET00009713", 
      "IsDefault": "", 
      "Language": "Hindi", 
      "Format": "2D", 
      "Region": "MUMBAI" 
     }, 
     { 
      "Code": "ET00009714", 
      "IsDefault": "", 
      "Language": "Tamil", 
      "Format": "3D", 
      "Region": "MUMBAI" 
     }, 
     { 
      "Code": "ET00009715", 
      "IsDefault": "", 
      "Language": "Hindi", 
      "Format": "3D", 
      "Region": "MUMBAI" 
     }, 
     { 
      "Code": "ET00009716", 
      "IsDefault": "", 
      "Language": "Bengali", 
      "Format": "2D", 
      "Region": "MUMBAI" 
     } 
     ] 
    } 
} 

Теперь то, что я хочу достичь, это всякий раз, когда я ищу Title=Jurassic World and region=MUMBAI, я должен получить вышеупомянутый документ, но inner_hits не должен содержать

{ 
       "Code": "ET00009710", 
       "IsDefault": "Y", 
       "Language": "English", 
       "Format": "2D", 
       "Region": "CHEN" 
} 

Так это достижимо?

То, что я пытался до сих пор

{ 
    "query": { 
    "nested": { 
     "path": "inner_hits", 
     "query": { 
     "bool": { 
      "must": [ 
      { 
       "match": { 
       "inner_hits.Region": "MUMBAI" 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
} 

Но я не мог достичь того, чего я хотел, это вовсе не удаляется, что блок, который содержит Region: Chen

Если кто-нибудь знает, как работать вокруг с этим, пожалуйста, поделитесь. Спасибо

+0

какая версия elasticsearch? – keety

+0

@keety ES Версия: 1.5.2 – nm10

ответ

1

Одна работа вокруг - использовать функцию inner_hit, добавленную в elasticsearch 1.5. Это возвращает вложенные документы, которые соответствуют вложенному запросу.

Пример:

{ 
    "_source": { 
     "exclude": ["inner_hits.*"] 
    }, 
    "query": { 
     "nested": { 
     "path": "inner_hits", 
     "query": { 
      "bool": { 
       "must": [ 
        { 
        "match": { 
         "inner_hits.Region": "MUMBAI" 
        } 
        } 
       ] 
      } 
     }, 
     "inner_hits": { 
       "size" : 10 
      } 
     } 
    } 
} 

отклика

"hits": [ 
    { 
     "_index": "test", 
     "_type": "test", 
     "_id": "1", 
     "_score": 3.8630462, 
     "_source": { 
      "Group": "Event", 
      "_boost": 3, 
      "inner_hits": [], 
      "Title": "Jurassic World" 
     }, 
     "inner_hits": { 
      "inner_hits": { 
       "hits": { 
       "total": 2, 
       "max_score": 3.8630462, 
       "hits": [ 
        { 
         "_index": "test", 
         "_type": "test", 
         "_id": "1", 
         "_nested": { 
          "field": "inner_hits", 
          "offset": 2 
         }, 
         "_score": 3.8630462, 
         "_source": { 
          "Code": "ET00009713", 
          "IsDefault": "", 
          "Language": "Hindi", 
          "Format": "2D", 
          "Region": "MUMBAI" 
         } 
        }, 
        { 
         "_index": "test", 
         "_type": "test", 
         "_id": "1", 
         "_nested": { 
          "field": "inner_hits", 
          "offset": 0 
         }, 
         "_score": 3.8630462, 
         "_source": { 
          "Code": "ET00009709", 
          "IsDefault": "", 
          "Language": "English", 
          "Format": "3D", 
          "Region": "MUMBAI" 
         } 
        } 
       ] 
       } 
      } 
     } 
    } 
    ] 

Существует в ответ помимо _source, который содержит только вложенные документы, которые соответствовали дополнительным inner_hits. По умолчанию inner_hits возвращает 3 верхних вложенных документа. Вы можете настроить его с помощью опции size.

+0

Прежде всего спасибо, мы на один шаг ближе к нашей фактической цели, пожалуйста, рассмотрите обновленный документ (я отредактировал данный документ), проиндексируйте его, используйте свой поисковый запрос, он будет show hits total = 5 (что правильно, есть 5 субдоков, которые имеют 'Region = MUMBAI'), но когда вы будете запрашивать выведенный результат ES будет содержать только 3 вложенных документа, которые имеют Region = MUMBAI вместо 5, могу я знать причина такого рода работы? – nm10

+0

по умолчанию [inner_hits] (https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-inner-hits.html#_options) возвращает три лучших документа. вы можете использовать опцию 'size', чтобы настроить ее. Я отредактировал ответ, чтобы показать это – keety

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