2015-08-05 7 views
13

Так что моя проблема в основном такая же, как описано here, однако она по-прежнему остается без ответа в группе.Эластичный поиск вложенного многопользовательского запроса

Мое отображение:

{ 
    "abstract": { 
     "properties": { 
      "summary": { 
       "type": "string" 
      } 
     } 
    }, 
    "authors": { 
     "type": "nested", 
     "properties": { 
      "first_name": { 
       "type": "string" 
      }, 
      "last_name": { 
       "type": "string" 
      } 
     } 
    } 
} 

И я хотел бы выполнить полнотекстовый поиск на обоих этих полей, вероятно, неодинаково взвешенная. Запрос, который приходит мне в голову, но, к сожалению, не работает, было бы это:

{ 
    "query": { 
     "bool": { 
      "should": [{ 
       "multi_match": { 
        "query": "higgs boson", 
        "fields": ["abstract.summary^5", "author.last_name^2"] 
       } 
      }] 
     } 
    } 
} 

Я не получаю никаких результатов от поля авторов, из-за его вложенном отображении. Я также не могу избавиться от вложенного свойства - я использую его для агрегации. Любая элегантная идея, как ее решить?

+0

В сопоставлении документов я не вижу связей между двумя объектами. Я считаю, что если вы используете «вложенный» объект, вам нужно сопоставить его как дочерний, внутри 'свойств', а также указать« вложенный запрос ». https://www.elastic.co/guide/en/elasticsearch/guide/current/nested-query.html – Jaider

ответ

5

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

"query": { 
    "bool": { 
     "should": [ 
      { 
       "nested": { 
        "path": "authors", 
        "query": { 
         "multi_match": { 
          "query": "higgs", 
          "fields": ["last_name^2"] 
         } 
        } 
       } 
      }, 
      { 
       "multi_match": { 
        "query": "higgs", 
        "fields": ["abstract.summary^5"] 
       } 
      } 
     ] 
    } 
} 

Я также не уверен, что повышение будет работать, как и ожидалось, обеспечивая его заданные в разных запросах. Любые предложения оценили.

+0

согласно https://www.elastic.co/guide/en/elasticsearch/guide/current/_boosting_query_clauses. html вам придется переписать вложенный многопоточный запрос в несколько простых вложенных запросов и добавить параметр 'boost'. поэтому в вашем простом случае с одним полем для вложенного мультимакса просто добавьте параметр 'boost' на том же уровне с помощью' query' как folows: – ulkas

+0

'" nested ": { " path ":" authors ", " запрос ": { "multi_match": { "запрос": "Хиггс", "полей": [" last_name "] }} , "наддува": 2}' – ulkas

7

Изменение отображения на следующий, которая использует include_in_root: true позволит использовать запрос, оригинал писал:

{ 
    "abstract": { 
     "properties": { 
      "summary": { 
       "type": "string" 
      } 
     } 
    }, 
    "authors": { 
     "type": "nested", 
     "include_in_root": true, 
     "properties": { 
      "first_name": { 
       "type": "string" 
      }, 
      "last_name": { 
       "type": "string" 
      } 
     } 
    } 
} 

Вы можете индексировать внутренние объекты как в виде вложенных полей и, как сплющенный полей объект , Этого можно добиться, установив include_in_parent в true. - Link

Примечание: include_in_root могут быть устаревшими в будущих версиях elasticsearch в пользу copy_to.