2015-03-06 4 views
3

У меня есть этот поисковый запрос, чтобы найти термин поиска запроса «красная собака» в корневом заголовке и описании, а также соответствовать документу вложенных комментариев.ElasticSearch только запрос вложен, если он существует

GET /_all/video/_search 
{ 
    "query":{ 
     "bool":{ 
     "should":[ 
      { 
       "multi_match":{ 
        "query":"red dog", 
        "fields":[ 
        "Title", 
        "Description" 
        ], 
        "type": "cross_fields", 
        "operator":"and" 
       } 
      }, 
     { 
     "nested":{ 
        "path":"Comments", 
        "query":{ 
        "multi_match":{ 
         "query":"red dog", 
         "fields":[ 
          "Comments.Description", 
          "Comments.Description.folded" 
         ], 
         "type": "cross_fields", 
         "operator":"and" 
        } 
        } 
       } 
      } 
     ] 
     } 
    } 
} 

К сожалению для меня, комментарии, иногда нулевые, когда я упорно их ElasticSearch, можно сделать какое-то «включает в себя, если документ существует» состояние?

Update

Я все еще получаю ту же ошибку

[nested] failed to find nested object under path [Comments] 

При попытке запроса с помощью существует

GET /_all/video/_search 
    { 
     "query":{ 
      "bool":{ 
      "should":[ 
       { 
        "multi_match":{ 
         "query":"lisa", 
         "fields":[ 
         "Title", 
         "Description" 
         ], 
         "type":"cross_fields", 
         "operator":"and" 
        } 
       }, 
       { 
        "nested":{ 
         "path":"Comments", 
         "query":{ 
         "filtered":{ 
          "query":{ 
           "match_all":{} 
          }, 
          "filter":{ 
           "exists":{ 
            "field":"Comments.Description" 
           } 
          } 
         } 
         } 
        } 
       } 
      ] 
      } 
     } 
    } 

Мое отображение для всего

{ 
    "en":{ 
     "mappings":{ 
     "video":{ 
      "properties":{ 
       "Comments":{ 
        "type":"nested", 
        "properties":{ 
        "Description":{ 
         "type":"string", 
         "analyzer":"english", 
         "fields":{ 
          "folded":{ 
           "type":"string", 
           "analyzer":"folding" 
          } 
         } 
        } 
        } 
       }, 
       "Description":{ 
        "type":"string", 
        "analyzer":"english", 
        "fields":{ 
        "folded":{ 
         "type":"string", 
         "analyzer":"folding" 
        } 
        } 
       }, 
       "Title":{ 
        "type":"string", 
        "analyzer":"english", 
        "fields":{ 
        "folded":{ 
         "type":"string", 
         "analyzer":"folding" 
        } 
        } 
       } 
      } 
     } 
     } 
    } 
} 

И мои настройки

{ 
    "settings": { 
     "analysis": { 
      "analyzer": { 
       "folding": { 
        "tokenizer": "standard", 
        "filter": [ 
         "lowercase", 
         "asciifolding" 
        ] 
       } 
      } 
     } 
    } 
} 
+1

существует фильтр должен делать то, что вы хотите. https://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-exists-filter.html#query-dsl-exists-filter – jhilden

+0

См. править –

+0

Марк, можете ли вы опубликовать полное сопоставление Пожалуйста. – jhilden

ответ

0

Оказывается, я имел индекс Марвел, который не имел отображения для моего типа. Я удалил плагин, и это было прекрасно поиск по всем показателям.

0

Самый простой способ сделать это - «денормализовать» ваши данные, чтобы у вас было свойство, содержащее счетчик и логическое значение, если оно существует или нет. Затем вы можете просто выполнить поиск по этим свойствам.

Например:

{ 
    "id": 31939, 
    "hasAttachments": true, 
    "attachmentCount": 2, 
    "attachments": [ 
     { 
     "type": "Attachment", 
     "name": "txt.txt", 
     "mimeType": "text/plain" 
     }, 
     { 
     "type": "Inline", 
     "name": "jpg.jpg", 
     "mimeType": "image/jpeg" 
     } 
    ] 
} 
Смежные вопросы