Можно ли отфильтровать результаты списка сегментов значительных совокупностей терминов, используя несколько полей для фильтрации? Я пытаюсь создать функцию рекомендации с использованием 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 условия для фильтрации:
- comic_subscribees.type должен быть только "последовательным"
- 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
}
}
}
}
}
}
Но все же оба метода дают мне нефильтрованные списки комиксов. Есть ли другой способ достичь этих требуемых условий? Должен ли я создать еще одно поле, в котором будет храниться предварительно отфильтрованный список комиксов, который будет использоваться в качестве значимого термина исходного поля? Большое спасибо.