Как выполнить поиск по нескольким полям и агрегировать баллы?

Я пытаюсь найти решение того, как я должен структурировать свои запросы для поиска ответов на вопросы людей. Например, на основе набора данных, который я вставлю в конце этого поста, я хотел бы запросить «Шоу о романтике» и, возможно, получить такие результаты:

{
  "hits": [
    {
      "_score": "31",
      "_source": {
        "anime": "Grisaia no Kajitsu"
      }
    },
    {
      "_score": "12",
      "_source": {
        "anime": "Mirai Nikki"
      }
    },
    {
      "_score": "7",
      "_source": {
        "anime": "Bakemonogatari"
      }
    }
  ]
}

Grisaia no Kajitsu показывается как первый результат, потому что он показан в нескольких соответствующих вопросах, а Mirai Nikki занимает второе место, потому что у него более высокий балл, чем у Bakemonogatari.

По сути, я хотел бы получить ответы, соответствующие полям question, score и tags. Вопросы, на которые есть повторяющиеся ответы, должны иметь более высокий балл. Какие-либо предложения?

Мой набор данных:

[
  {
    "question": "Looking for romance anime",
    "score": 4,
    "answers": [
      {
        "anime": "Mirai Nikki",
        "score": 8,
        "tags": ["action", "adventure", "death game", "romance"]
      },
      {
        "anime": "Bakemonogatari",
        "score": 3,
        "tags": ["action", "comedy", "romance", "seinen"]
      }
    ]
  },
  {
    "question": "Survival Anime",
    "score": 10,
    "answers": [
      {
        "anime": "Grisaia no Kajitsu",
        "score": 4,
        "tags": ["school", "drama", "survival", "romance"]
      },
      {
        "anime": "Kanata no Astra",
        "score": 7,
        "tags": ["action", "comedy", "drama", "space"]
      }
    ]
  },
  {
    "question": "Horror and romance anime?",
    "score": 12,
    "answers": [
      {
        "anime": "Grisaia no Kajitsu",
        "score": 15,
        "tags": ["school", "drama", "survival", "romance"]
      }
    ]
  }
]
0
0
163
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это должно работать для вас, вы можете настроить различные параметры повышения здесь и посмотреть, как это повлияет на ваши результаты.

{
 "_source": ["answers.anime"],
    "query": {
        "bool": {
            "should": [
                {
                    "term": {
                        "answers.tags": {
                            "value": "Shows about romance",
                            "boost": 2 //weight of tags field
                        }
                    }
                },
                {
                    "match": {
                        "question": {
                            "query": "Shows about romance",
                            "boost": 2 //weight of question field
                        }
                    }
                },
                {
                    "function_score": {
                        "min_score": 0.9,
                        "functions": [
                            {
                                "field_value_factor": {
                                    "factor": 1, //weight of score field
                                    "field": "answers.score",
                                    "modifier": "log2p"
                                }
                            }
                        ]
                    }
                }
            ]
        }
    }
}

Большое спасибо! Должен ли термин запрос быть answers.tags? Также возможно ли просто получить answer.anime вместо всего источника?

Sosa 27.12.2020 17:45

Кроме того, по моему опыту, лучше иметь поле, которое вы ищете (аниме здесь), в качестве объекта верхнего уровня в вашей схеме, т.е. - создать новую схему, в отличие от здесь, вам нужно будет отфильтровать имя аниме из вопрос- >название->аниме, также, возможно, придется беспокоиться о дубликатах

Aditya Agarwal 27.12.2020 22:04

Другие вопросы по теме