#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:
Не пробовал, но похоже, что коэффициент значения поля оценки функции может решить ваш запрос.