Исключить значительный термин агрегация с другим полем - PullRequest
0 голосов
/ 23 октября 2019

Можно ли отфильтровать результаты списка сегментов значительных совокупностей терминов, используя несколько полей для фильтрации? Я пытаюсь создать функцию рекомендации с использованием ES на основе этой статьи на среднем https://towardsdatascience.com/how-to-build-a-recommendation-engine-quick-and-simple-aec8c71a823e.

. Я сохраняю данные поиска в виде массива объектов, а не в виде массива строк, потому что мне нужно отфильтровать другие поля, чтобы получитьправильный результат списка ведра. Вот отображение индекса:

{
  "mapping": {
    "properties": {
      "user": {
        "type": "keyword",
        "ignore_above": 256
      },
      "comic_subscribes": {
        "properties": {
          "genres": {
            "type": "keyword",
            "ignore_above": 256
          },
          "id": {
            "type": "keyword",
            "ignore_above": 256
          },
          "type": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      }
    }
  }
}

У меня есть 2 условия для фильтрации:

  1. comic_subscribees.type должен быть только "последовательным"
  2. comic_subscribees.genreне должно быть в "хентай" или "эчии"

Я уже пробовал два способа применения условий. Сначала я попытался отфильтровать его с помощью запроса bool следующим образом:

{
    "size": 0,
    "query": {
        "bool": {
            "should": [
                {
                    "term": {
                        "comic_subscribes.id": "1"
                    }
                }
            ],
            "minimum_should_match": 1,
            "filter": {
                "term": {
                    "comic_subscribes.type": "serial"
                }
            },
            "must_not": [
                {
                    "bool": {
                        "should": [
                            {
                                "term": {
                                    "comic_subscribes.genres": "hentai"
                                }
                            },
                            {
                                "term": {
                                    "comic_subscribes.genres": "echii"
                                }
                            }
                        ],
                        "minimum_should_match": 1
                    }
                }
            ]
        }
    },
    "aggs": {
        "recommendations": {
            "significant_terms": {
                "field": "comic_subscribes.id",
                "exclude": ["1"],
                "min_doc_count": 1,
                "size": 10
            }
        }
    }
}

И метод агрегации фильтра:

{
    "size": 0,
    "query": {
        "bool": {
            "should": [
                {
                    "term": {
                        "comic_subscribes.id": "1"
                    }
                }
            ],
            "minimum_should_match": 1
        }
    },
    "aggs": {
        "filtered": {
            "filter": {
                "bool": {
                    "filter": {
                        "term": {
                            "comic_subscribes.type": "serial"
                        }
                    },
                    "must_not": [
                        {
                            "bool": {
                                "should": [
                                    {
                                        "term": {
                                            "comic_subscribes.genres": "hentai"
                                        }
                                    },
                                    {
                                        "term": {
                                            "comic_subscribes.genres": "echii"
                                        }
                                    }
                                ],
                                "minimum_should_match": 1
                            }
                        }
                    ]
                }
            },
            "aggs": {
                "recommendations": {
                    "significant_terms": {
                        "field": "comic_subscribes.id",
                        "exclude": ["1"],
                        "min_doc_count": 1,
                        "size": 10
                    }
                }
            }
        }
    }
}

Но все же оба метода дают мне нефильтрованные списки комиксов. Есть ли другой способ достичь этих требуемых условий? Должен ли я создать еще одно поле, в котором будет храниться предварительно отфильтрованный список комиксов, который будет использоваться в качестве значимого термина исходного поля? Большое спасибо.

1 Ответ

1 голос
/ 25 октября 2019

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

На основе документации эластичного поиска Значимые параметры агрегирования терминов , что относится к Значение фильтрации агрегации терминов. Нет другого параметра, кроме фильтра, использующего выражения секций и значений фильтра с точными значениями (которые я использовал, как указано выше, "exclude" param).

Поэтому я создаю другой путь, получая комические идентификаторы, которые я хочу исключить, и сохраняю их как переменную excludeComics в массиве. Затем используйте переменную excludeComics в exclude param. И бум, вот и все. Отфильтрованный результат списка агрегирования значимых терминов.

...