Elastic Search - тестирование релевантности

6 авг. 2019 г.

Всем привет! Сегодня поговорим об отладке и тестировании поиска на базе Elastic Search. Конкретно, о тестировании релевантности. Из коробки Elastic работает неплохо. Но, вероятно, может понадобится донастроить релевантность поиска. Например, установить вес различных полей в поиске. Также могут быть другие факторы, влияющие на релевантность. Подробнее про настройку и о том как все устроено можно почитать тут: https://codedzen.ru/elasticsearch-urok-6-4-relevantnost/

При этом важно понимать, что изменения настроек влияют на весь поиск. К примеру, нам не нравится результаты поиска по запросу "Fiat 500", но при этом устраивают результаты по запросам "Renault Logan", "Nissan Micra" и т.д. Если мы поменяем настройки и подгоним результаты под запрос "Fiat 500", то не факт, что все остальное будет работать нормально.

Зачастую заказщики, или даже тестировщики этого не понимают. И говорят что-то вроде "По запросу Fiat 500 выводится какая-то что-то не то, пофикси ASAP".

На самом деле, лучше, чтобы по всем запросам выводились относительно релевантные результаты. Чем если по одному запросу выводится то, что хочет видеть тестировщик, а по всем остальным что-то непонятное.

Также у каждого запроса есть популярность или определенная ценность. Вероятно, есть некоторое количество запросов(20, 30, 50 и т.д.), по которым ищут чаще всего. Что-то вроде семантического ядра. И есть остальные, менее важные. Возможно, ценность запроса и популярность это не совсем одно и то же. Но, допустим, что самые частые запросы - самые важные.

Таким образом мы можем составить список из нескольких десятков(сотен) запросов. Дальше проводить поиск по каждому запросу. И проверять первые 10 результатов.

Делать это вручную для всех запросов неудобно, поэтому искать будем автоматически, обращаясь к API Elastic. Все это можно сделать одним скриптом и выводить сводный результат.

Сам поиск можно настраивать. Можно задать вес полей. Можно задать сортировку, но это автоматически значит, что мы сортируем не по релевантности. Можно поменять настройки индекса или добавить определенные поля, оптимизированные для поиска.

Затем можно создать несколько конфигураций, запустить скрипт и сравнить результаты по разным запросам.

php search_debug.php

Вывод будет примерно такой:

Query: Honda
    Honda Ridgeline 2006
    Honda Ridgeline 2010
    Honda Prelude 1986
    ...
Query: Ford
    Ford F250 2006
    Ford Escort 2002
    Ford Fiesta 2012
    ...
Query: Chrysler
    Chrysler Concorde 1997
    Chrysler 300M 1999
    Chrysler Imperial 1993
    ...

Код доступен на github: https://github.com/antonshell/elastic_search_debug

На этом пока все. Спасибо за внимание!