Как добавить фильтр к более похожим на этот запрос в Elastic Search?

Я хочу использовать этот запрос в Elastic Search, чтобы найти похожие документы. Однако мне нужно отфильтровать документы, на которых выполняется запрос.

Пример ниже: я хочу найти элементы блога, похожие на блог с идентификатором 123456, но написанные автором 120 или автором 123.

При выполнении этого запроса я возвращаю похожие блоги от ВСЕХ авторов и, следовательно, не фильтруется...

{
  "query":{
    "more_like_this" : {

        "fields" : ["body" ],  
        "docs" : [
              {
                "_id" : "123456"
              }
            ],
        "percent_terms_to_match" : 0.4,
            "min_term_freq" : 1
      }
  }
 },

"filter":{
  "and":[            
          {
            "type":{ "value":"blog" }
          },
          {
            "terms":{ "authorId": ["120", "123"] }
          }
        ]
}
}

Ответ 1

Попробуйте отфильтрованный запрос следующим образом:

{
    "query": {
        "filtered": {
            "query": {
                "more_like_this": {
                    "fields": [
                        "body"
                    ],
                    "docs": [
                        {
                            "_id": "123456"
                        }
                    ],
                    "percent_terms_to_match": 0.4,
                    "min_term_freq": 1
                }
            },
            "filter": {
                "and": [
                    {
                        "type": {
                            "value": "blog"
                        }
                    },
                    {
                        "terms": {
                            "authorId": [
                                "120",
                                "123"
                            ]
                        }
                    }
                ]
            }
        }
    }
}

Надеюсь, это поможет...!

Ответ 2

Принятый ответ - для более ранних версий ElasticSearch. Это отлично работает на 2.x +, также не используя какие-либо обесцененные API

{
    "query": {
        "filtered": {
            "query": {
                "more_like_this": {
                    "fields": ["meta.keywords"],
                    "like": [{"_id": "5732759249d2b21f95641d50"}]
                }
            },
            "filter" : {
                "bool": {
                    "must": [                            
                        {"match": { "foo.bar": "A"}},
                        {"match": { "baz": "new"}}
                    ]
                }
            }
        }
    }
}