Оценка Elasticsearch от 0 до 1 за поиск документов, похожих на существующий

#elasticsearch #elasticsearch-dsl

#elasticsearch #elasticsearch-dsl

Вопрос:

Нужно вычислить относительную оценку от 0 до 1 при поиске документов, похожих на существующий? Таким образом, существующий имеет оценку 1, и все остальные соответствующие документы должны быть рассчитаны в соответствии с этим, и оценка будет <= 1. Но существующий документ должен быть исключен из поиска. Возможно ли это сделать на стороне elasticsearch, а не просто вычислять оценку вручную на языке программирования, таком как:

 match_doc_score/search_doc_score
  

Давайте представим, что у нас есть индекс person с отображением:

 {
  "properties": {
    "person_id": {
      "type": "keyword"
    },
    "fullname": {
      "type": "text"
    },
    "email": {
      "type": "keyword"
    },
    "phone": {
      "type": "keyword"
    },
    "country_of_birth": {
      "type": "keyword"
    }
  }
}
  

И у меня есть 3 человека внутри индекса:
Пользователь 1:

 {
  "person_id": 1,
  "fullname": "John Snow",
  "email": "john@gmail.com",
  "phone": "111-11-11",
  "country_of_birth": "Denmark"
}
  

Участник 2:

 {
  "person_id": 2,
  "fullname": "Snow John",
  "email": "john@gmail.com",
  "phone": "222-22-22",
  "country_of_birth": "Denmark"
}
  

Участник 3:

 {
  "person_id": 3,
  "fullname": "Peter Wislow",
  "email": "peter@gmail.com",
  "phone": "111-11-11",
  "country_of_birth": "Denmark"
}
  

Мы находим людей, похожих на Person 1, с помощью этого запроса:

 {
    "query": {
        "bool": {
            "should": [
                {
                    "match": {
                        "fullname": {
                            "query": "John Snow",
                            "boost": 6
                        }
                    }
                },
                {
                    "term": {
                        "email": {
                            "value": "john@gmail.com",
                            "boost": 5
                        }
                    }
                },
                {
                    "term": {
                        "phone": {
                            "value": "111-11-11",
                            "boost": 4
                        }
                    }
                },
                {
                    "term": {
                        "country_of_birth": {
                            "value": "Denmark",
                            "boost": 2
                        }
                    }
                }
            ],
            "must_not": [
                {
                    "term": {
                        "person_id": 123
                    }
                }
            ]
        }
    }
}
  

Как вы можете видеть:

  • человек 1 и человек 2 совпадают по: полному имени, электронной почте, стране рождения.
  • человек 1 и человек 3 совпадают по: телефону, стране рождения.

Возможно ли получить оценку 0 .. 1, если у нас есть заказ с полным совпадением в индексе (человек 1)?

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

Ответ №1:

Не пробовал, но похоже, что коэффициент значения поля оценки функции может решить ваш запрос.