I've tried to use cross_field query to search over multiple fields with completely different boosts. But TF/IDF makes the results so bad because I just want to see if a term exist in the fields or not (but if exists, apply each field's boost to calculate the final score). Unfortunately when I use constant_score to disable TF/IDF on my multi_match query, all boosts ignored.
can anyone help me to write a correct query for this situation?
What you can do is wrapping the multi_match query in filter query inside function_score query with a weight.
function_score: {
boost_mode: "sum",
weight: "3.0",
query: {
bool: {
filter: {
multi_match: {
query: "test",
fields: [:field_1, :field_2, :field3],
type: "cross_fields",
operator: "and"
}
}
}
}
}
So the idea here that the filter does not contribute to the score (query_score = 0).
The function_score is 3, calculated as such:
A constant score of 1 (because no function is provided) * 3 (which is the weight).
Therefore the final score of the function_score query would be calculated as follows
Score = 0 + (3*1) = 3