У эластичного поиска должны быть разные оценки
Я получаю документы путем фильтрации и использования логического запроса для оценки. Например:
{
"query": {
"bool": {
"should": [
{
"term":
{
"color": "Yellow"
}
},
{
"term":
{
"color": "Red"
}
},
{
"term":
{
"color": "Blue"
}
}
],
"minimum_should_match": 1
}
}
Если данные имеют только «желтый», это дает мне оценку «1,5», но если данные имеют только «красный», они дают мне оценку «1,4». И я хотел, чтобы оценка была такой же. Каждые данные имеют только одно совпадение, так почему же оценки разные? Есть ли что-нибудь, чтобы игнорировать порядок терминов в запросе следует? Когда у меня только 1 матч, «желтый» всегда будет с высоким счетом ...
3 ответа
Как уже упоминалось, оценка зависит от множества факторов. Однако, если вы хотите игнорировать их все, вы можете использовать
constant_score
присвоить постоянную оценку, если документ соответствует определенному термину, например:
{
"query": {
"bool": {
"should": [
{
"constant_score": {
"filter": {
"term": {
"color": "Yellow"
}
},
"boost": 1
}
},
{
"constant_score": {
"filter": {
"term": {
"color": "Red"
}
},
"boost": 1
}
},
{
"constant_score": {
"filter": {
"term": {
"color": "Blue"
}
},
"boost": 1
}
}
],
"minimum_should_match": 1
}
}
}
Я считаю, что это должно соответствовать вашим требованиям.
@ESCoder, используя приведенный выше пример, у меня есть:
"Желтый"
{
"value" : 1.5995531,
"description" : "idf, computed as log(1 + (N - n + 0.5) / (n + 0.5)) from:",
"details" : [
{
"value" : 30,
"description" : "n, number of documents containing term",
"details" : [ ]
},
{
"value" : 150,
"description" : "N, total number of documents with field",
"details" : [ ]
}
]
},
"Красный"
{
"value" : 1.0375981,
"description" : "idf, computed as log(1 + (N - n + 0.5) / (n + 0.5)) from:",
"details" : [
{
"value" : 53,
"description" : "n, number of documents containing term",
"details" : [ ]
},
{
"value" : 150,
"description" : "N, total number of documents with field",
"details" : [ ]
}
]
},
Каждый из них (красный и желтый) появляется в каждом документе только один раз. Я хочу иметь такой же балл, если у меня красный или желтый. Меня не волнует, сколько документов у каждого. Если один документ имеет только желтый цвет, а другой - только красный, я хотел бы иметь одинаковую оценку для обоих. Является ли это возможным?
Вы можете использовать filter
пункт вместе с
bool/should
пункт, если оценка для вас не важна
Контекст фильтра избегает оценочной части и представляет собой обычный запрос типа "да / нет". Таким образом, для совпадающих документов оценка всегда будет 0,0.
{
"query": {
"bool": {
"filter": {
"bool": {
"should": [
{
"term": {
"color.keyword": "Yellow"
}
},
{
"term": {
"color.keyword": "Black"
}
},
{
"term": {
"color.keyword": "Purple"
}
}
],
"minimum_should_match": 1
}
}
}
}
}
Оценка сопоставленных документов зависит от нескольких факторов, таких как длина поля, частота термина, общее количество документов и т. Д.
Вы можете узнать больше о том, как рассчитывается оценка, используя объяснительный API
GET /_search?explain=true