Статьи

Релевантная разработка с помощью Solr

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

Рисунок 1: Вывод из командной строки в удобной печатной форме EasyB

Если мы теперь изменим SolrQuery.ORDER.desc на SolrQuery.ORDER.asc и повторно запустим, мы увидим вывод ошибки, как показано на рисунке 2.

Рисунок 2: Выход ошибки EasyB

Обратите внимание, что аргумент -txtstory заставит EasyB выводить истории в «удобочитаемой для бизнеса» форме.

проблемы

  • Загрузчик классов EasyB предотвращает использование встроенного Solr с конфигурацией Solr по умолчанию (например, org.apache.solr.common.SolrException: ошибка при загрузке класса ‘solr.FastLRUCache’)

Solr-RDD Backlog

Первая итерация использует vanilla EasyB, но есть код, который нужно написать, чтобы избавить от необходимости большого количества стандартного кода:

  1. DSL для абстрагирования клиентской библиотеки SolrJ ( включая построитель запросов )
  2. Интеграция загрузки данных
  3. Упрощение управления зависимостями
  4. Плагин EasyB / расширение синтаксиса (на основе вышеупомянутых пунктов)
  5. Интеграция Дженкинса / Хадсона

Не стесняйтесь предлагать дополнительные функции или участвовать через молодой проект на GitHub .

Рекомендации

* Вы можете получить более старую версию выступления Эрика здесь .

 

От http://leanjavaengineering.wordpress.com/2011/10/24/solr-rdd/