Релевантность результатов поиска очень субъективна, поэтому тестирование релевантности запросов также субъективно.
Один метод, который существует в области поиска информации, — это использование списков суждений; Обсуждаемый здесь альтернативный подход состоит в том, чтобы следовать методологии Поведение, управляемой поведением, используя критерии приемлемости пользовательской истории — я кратко назвал эту разработку, основанную на релевантности, или 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/

