Релевантность результатов поиска очень субъективна, поэтому тестирование релевантности запросов также субъективно.
Один метод, который существует в области поиска информации, — это использование списков суждений; Обсуждаемый здесь альтернативный подход состоит в том, чтобы следовать методологии Поведение, управляемой поведением, используя критерии приемлемости пользовательской истории — я кратко назвал эту разработку, основанную на релевантности, или RDD .
Я хотел бы поблагодарить Эрика Пью за отличную дискуссию о тестировании в поисковых системах и за то, что он дал мне гостевой слот в своем выступлении « Лучшее тестирование в поисковых системах » * на Lucene EuroCon Barcelona 2011 на прошлой неделе, чтобы упомянуть RDD. Первая итерация Solr-RDD объединяет мою страсть к автоматизированному тестированию и мою страсть к Groovy благодаря использованию EasyB (среды тестирования Groovy BDD).
Фон — Тестирование Solr
Я применял некоторые из лучших практик, которые я использовал в проектах Java / Grails, к Solr, но изначально он был сосредоточен на аспектах производительности с использованием (производственного) журнала запросов «доступа» от Solr, JMeter, плюс Access Log Sampler и Конечно Дженкинс. Чтобы справиться с эволюционной природой схемы и запроса (когда не используется (e) dismax), это сопровождалось некоторыми скриптами Groovy для «миграции»:
- Скрипт демпфера индекса — для обхода индекса Lucene и экспорта документов в XML-формат обновления Solr
- Сценарий модификатора данных — для изменения набора данных XML
- Сценарий обработки журнала доступа — для обновления запросов, которые были воспроизведены
плюс delete_all.xml и optimize.xml для использования с Solr post.sh .
Хотя это давало уверенность в том, что мы могли отслеживать тенденции производительности при любых изменениях запросов или настройке конфигурации — это не учитывало актуальность. Для этого у нас был другой сценарий, известный как SolrJ Query Tool, для выполнения предварительно консервированных запросов — хотя в нем не было автоматического цикла обратной связи, так как результаты были отправлены по электронной почте клиенту для оценки (не было список суждений из-за нехватки времени).
Важность контролируемого / ограниченного набора данных
Если вы читаете между строк выше, мы будем воссоздавать данные в известном состоянии перед каждым запуском теста.
Это очень важно, если вы хотите сделать правильные утверждения о результатах поиска.
Solr-РДД
Цель состоит в том, чтобы использовать формат истории для описания релевантности запроса, например
учитывая наш набор данных о продукте,
когда я ищу «велотренажер»
и сортирую по убыванию цены,
я должен получить два результата с идентификаторами [PRD-123, PRD-234],
а PRD-123 имеет более высокий балл, чем PRD-234
При использовании SolrJ это следует рассматривать как интеграционный тест непосредственно против Solr, а не как функциональный тест, который использует HTTP-клиент для взаимодействия с основным веб-приложением.
Итерация 1
По сути, это была реализация альфа-класса, и для этого прогона я использовал Solr 1.4.1, так как он использовался для проекта, который конкретизировал идею.
Предпосылки
- Solr установил и запустил ядро примера (например, cd /Applications/apache-solr-1.4.1/example/; java -jar start.jar)
- Загрузите копию EasyB с http://www.easyb.org/download.html
- Вам также понадобится Ivy, если вы хотите использовать Groovy для управления зависимостями
зависимости
Я настоятельно рекомендую mvnrepository.com для отслеживания зависимостей, и они имеют их непосредственно в форме Groovy @Grab.
@Grab(group='org.apache.solr', module='solr-solrj', version='1.4.1') @Grab(group='org.slf4j', module='slf4j-nop', version='1.6.2') Imports import org.apache.solr.client.solrj.* import org.apache.solr.client.solrj.impl.CommonsHttpSolrServer import org.apache.solr.client.solrj.response.* import org.apache.solr.common.* The before fixture SolrServer server before "configure search client", { url = 'http://localhost:8983/solr' server = new CommonsHttpSolrServer(url) } before "set up constrained data", { given "our sample product data set", { SolrInputDocument doc1 = new SolrInputDocument() doc1.addField("id", "PRD-123", 1.0f) doc1.addField("name", "Best exercise bike", 1.5f) doc1.addField("price", 100) SolrInputDocument doc2 = new SolrInputDocument() doc2.addField("id", "PRD-234", 1.0f) doc2.addField("name", "Old exercise bike", 1.0f) doc2.addField("price", 20) Collection docs = new ArrayList() docs.add(doc1) docs.add(doc2) server.add(docs) server.commit() } } The sample scenario scenario "Exercise bikes",{ SolrQuery query = new SolrQuery() def rdocs when "I search for 'exercise bike'", { query.setQuery("name:\"exercise bike\"") query.addField('score') } and "I sort by price descending", { query.addSortField("price", SolrQuery.ORDER.desc) } then "I should get two results with ids [PRD-123,PRD-234]", { QueryResponse rsp = server.query(query) rdocs = rsp.getResults() rdocs.size().shouldBe(2) rdocs[0].id.shouldBe('PRD-123') rdocs[1].id.shouldBe('PRD-234') } and "PRD-123 has a higher score than PRD-234", { rdocs[0].score.shouldBeGreaterThan(rdocs[1].score) } }
Выполнение из командной строки
Код из четырех разделов выше был сохранен как « BaseSearch.story » — суффикс указывает EasyB, что это Story (в отличие от спецификации ).
Ввод следующей команды в каталоге установки EasyB приводит к выводу, как показано на рисунке 1:
java -cp easyb-0.9.8.jar: lib / commons-cli-1.2.jar: lib / groovy-all-1.7.5.jar: $ GRAILS_HOME / lib / ivy-2.2.0.jar org.easyb.BehaviorRunner ~ / Проекты / rbramley / solr-rdd / Stories / BaseSearch.story -prettyprint
Если мы теперь изменим SolrQuery.ORDER.desc на SolrQuery.ORDER.asc и повторно запустим, мы увидим вывод ошибки, как показано на рисунке 2.
Обратите внимание, что аргумент -txtstory заставит EasyB выводить истории в «удобочитаемой для бизнеса» форме.
проблемы
- Загрузчик классов EasyB предотвращает использование встроенного Solr с конфигурацией Solr по умолчанию (например, org.apache.solr.common.SolrException: ошибка при загрузке класса ‘solr.FastLRUCache’)
Solr-RDD Backlog
Первая итерация использует vanilla EasyB, но есть код, который нужно написать, чтобы избавить от необходимости большого количества стандартного кода:
- DSL для абстрагирования клиентской библиотеки SolrJ ( включая построитель запросов )
- Интеграция загрузки данных
- Упрощение управления зависимостями
- Плагин EasyB / расширение синтаксиса (на основе вышеупомянутых пунктов)
- Интеграция Дженкинса / Хадсона
Не стесняйтесь предлагать дополнительные функции или участвовать через молодой проект на GitHub .
Рекомендации
* Вы можете получить более старую версию выступления Эрика здесь .
От http://leanjavaengineering.wordpress.com/2011/10/24/solr-rdd/