ES-запрос, чтобы соответствовать как можно большему количеству слов из запроса

У меня есть несколько миллионов документов в моем индексе. У меня есть предложение, и я хочу получить документ, который соответствует как можно большему количеству слов. Мне нужно искать только одно поле content

curl -X GET "xxx.com:9200/test/_search?pretty" -H 'Content-Type: application/json' -d'
{
    "query" : {
        "bool" : { "must" : [{"term": {"content": {"value": "popular artworks of Banksy"}}}]
    }}
}
'

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


person suprita shankar    schedule 27.09.2020    source источник
comment
Используйте match_phrase с помоями...   -  person Abhijit Bashetti    schedule 27.09.2020


Ответы (1)


Добавление рабочего примера с данными индекса, поисковым запросом и результатом поиска.

См. документацию ES по адресу match_phrase запрос и логические запросы, чтобы получить подробное объяснение.

Данные индекса:

{
    "content":"popular popular popular artworks artworks Banksy"
}
{
    "content":"popular artworks Banksy"
}
{
    "content":"popular popular artworks Banksy"
}
{
    "content": "popular artworks Banksy Banksy"
}
{
    "content": "popular popular popular artworks artworks artworks Banksy"
}

Поисковый запрос:

    {
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "content": "popular artworks of Banksy"
          }
        },
        {
          "match_phrase":{
            "content":"popular artworks Banksy Banksy"
          }
        }
      ]
    }
  }
}

Результат поиска:

"hits": [
      {
        "_index": "test1",
        "_type": "_doc",
        "_id": "4",
        "_score": 0.4776722,
        "_source": {
          "content": "popular artworks Banksy Banksy"
        }
      },
      {
        "_index": "test1",
        "_type": "_doc",
        "_id": "5",
        "_score": 0.22413516,
        "_source": {
          "content": "popular popular popular artworks artworks artworks Banksy"
        }
      },
      {
        "_index": "test1",
        "_type": "_doc",
        "_id": "1",
        "_score": 0.22279418,
        "_source": {
          "content": "popular popular popular artworks artworks Banksy"
        }
      },
      {
        "_index": "test1",
        "_type": "_doc",
        "_id": "3",
        "_score": 0.21652403,
        "_source": {
          "content": "popular popular artworks Banksy"
        }
      },
      {
        "_index": "test1",
        "_type": "_doc",
        "_id": "2",
        "_score": 0.21318543,
        "_source": {
          "content": "popular artworks Banksy"
        }
      }
    ]
person ESCoder    schedule 27.09.2020
comment
Спасибо за подробный пример. Допустим, у меня есть другой документ с popular artworks Banksy Banksy -- я бы хотел, чтобы он присвоил ему более высокий рейтинг, чем остальным. Поскольку слова популярны, произведения искусства более распространены. Ты думаешь это возможно? - person suprita shankar; 27.09.2020
comment
Можете ли вы помочь мне понять вложенную структуру bool, must? И еще функция? Несколько комментариев очень помогли бы. - person suprita shankar; 27.09.2020
comment
@supritashankar, пожалуйста, просмотрите мой обновленный запрос (который намного упрощен) и дайте мне знать, решило ли это вашу проблему? - person ESCoder; 28.09.2020
comment
@supritashankar спасибо, что приняли мой ответ :) Было бы здорово, если бы вы могли также проголосовать за мой ответ :) +1 за ваш вопрос :) - person ESCoder; 28.09.2020