ElasticSearch соединяется с function_score - PullRequest
0 голосов
/ 05 июля 2018

Я пытаюсь исключить дублирующиеся документы, которые имеют одинаковые параметры slug, чтобы сделать это, я использую aggs в ElasticSearch (версия 2.4). Я использую - этот запрос:

 {
  "fields":[
    "id",
    "score"],
  "size":0,
  "query":{
    "function_score":{
      "query":{
        "bool":{
          "should":[
            {
              "match":{
                "main_headline.en":{
                  "query":"headline_for_search"
                }
              }
            },
            {
              "match":{
                "body.en":"body for search"
              }
            }],
          "must_not":{
            "term":{
              "id":75333
            }
          },
          "filter":[
            {
              "term":{
                "status":3
              }
            },
            [
              {
                "term":{
                  "sites":6
                }
              }]]
        }
      },
      "functions":[
        {
          "gauss":{
            "published_at":{
              "scale":"140w",
              "decay":0.3
            }
          }
        }
      ]
    },
    "aggs":{
      "postslug":{
        "terms":{
          "field":"slug",
          "order":{
            "top_score":"desc"
          }
        },
        "aggs":{
          "grouppost":{
            "top_hits": {
              "_source": {
                "include": [
                  "id",
                  "slug",
                ]
              },
              "size" : 10
            }
          }
        }
      }
    }
  }
}

Когда я запускаю его, я получаю сообщение об ошибке

не удалось проанализировать источник поиска. ожидаемое имя поля, но получено [START_OBJECT] Я не могу понять, где ошибка.

Без сечения aggs все отлично работает (кроме существующих дубликатов)

1 Ответ

0 голосов
/ 05 июля 2018

Я вижу одну проблему, которая связана с тем, что в разделе фильтрации исходного кода include должно читаться как includes. Кроме того, раздел aggs находится не в нужном месте, он есть в разделе запросов, и он должен быть на верхнем уровне:

{
  "fields": [
    "id",
    "score"
  ],
  "size": 0,
  "query": {
    "function_score": {
      "query": {
        "bool": {
          "should": [
            {
              "match": {
                "main_headline.en": {
                  "query": "headline_for_search"
                }
              }
            },
            {
              "match": {
                "body.en": "body for search"
              }
            }
          ],
          "must_not": {
            "term": {
              "id": 75333
            }
          },
          "filter": [
            {
              "term": {
                "status": 3
              }
            },
            [
              {
                "term": {
                  "sites": 6
                }
              }
            ]
          ]
        }
      },
      "functions": [
        {
          "gauss": {
            "published_at": {
              "scale": "140w",
              "decay": 0.3
            }
          }
        }
      ]
    }
  },
  "aggs": {
    "postslug": {
      "terms": {
        "field": "slug",
        "order": {
          "top_score": "desc"
        }
      },
      "aggs": {
        "grouppost": {
          "top_hits": {
            "_source": {
              "includes": [
                "id",
                "slug"
              ]
            },
            "size": 10
          }
        }
      }
    }
  }
}
...