Здравствуйте!
Есть индекс специалистов, у специалистов есть, например, ключевые навыки (множественное поле). Пользователь в фильтре выбирает ключевые навыки - например, PHP, JS, Java. Так вот специалисты, у которых например, совпадают три навыка, должны выдаваться в списке выше, чем те, у кого совпадает два.
{"query":{"nested":{"path":"key_skills","query":{"bool":{"should":[{"term":{"key_skills.slug":"kn-zr-1"}},{"term":{"key_skills.slug":"key-skill-01"}}],"minimum_should_match":1}}}},"from":0,"size":10000,"_source":["index","key_skills"],"sort":"_score"}
В теории, по-умолчанию эластик так и должен работать. Когда я провожу тесты и заполняю поле key_skills предопределенным набором значений: [ks1] или [ks1, ks2] или [ks1, ks2, ks3] - то все работает. Однако, когда в поле реальные данные из базы - сортировка не верная.
Более того, я проводил эксперимент на одном специалисте и происходит мистика. У него три ключевых скила key-skill-1, key-skill-01, key-skill-20.
Когда я делаю запрос с одним фильтром "key_skills.slug":"key-skill-01", получаю оценку 10.14
{"query":{"bool":{"must":[{"nested":{"path":"key_skills","query":{"bool":{"should":[{"term":{"key_skills.slug":"key-skill-01"}}],"minimum_should_match":1}}}},{"term":{"index":"219"}}]}},"from":0,"size":10000,"_source":["index","key_skills"],"sort":"_score"}
Если же я делаю запрос с двумя значениями в фильтре, оценка понижается до 9.7
{"query":{"bool":{"must":[{"nested":{"path":"key_skills","query":{"bool":{"should":[{"term":{"key_skills.slug":"key-skill-01"}},{"term":{"key_skills.slug":"key-skill-1"}}],"minimum_should_match":1}}}},{"term":{"index":"219"}}]}},"from":0,"size":10000,"_source":["index","key_skills"],"sort":"_score"}