Как использовать Sphinx BuildExcerpts - PullRequest
1 голос
/ 07 февраля 2012

Итак, я настроил файл конфигурации Sphinx.У меня есть очень простая схема с двумя полями, заголовок и тело, где заголовок - это название романа, а тело - сам роман.Для простоты я добавил только один роман.Индексатор работал просто отлично, а API-интерфейс Python сделал запрос sphinxd быстрым.Я до сих пор очень впечатлен, это кажется самым простым в настройке механизма полнотекстового поиска, который я исследовал до сих пор (намного проще, чем Lucene или Solr и быстрее, чем Woosh).

Я пропустил любую БДбэкенд.У меня есть свои романы в простом формате .txt, и я добавил пример с этим простым xml (через xmlpipe)

<?xml version="1.0" encoding="utf-8"?>
<sphinx:docset>
       <sphinx:document id="1">
             <title><![CDATA[Dan Simmons - I Canti di Hyperion 3 - Endymion]]></title>
             <body><![CDATA[ * ALL THE NOVEL HERE * ]]></body>
       </sphinx:document>
</sphinx:docset>

Кстати, я ищу в архиве «tartaruga», этоитальянский для "черепаха", и я уверен, что слово это файл.На самом деле, найден три раза, и я думаю, это то, что Сфинкс возвращает мне ('hits': 3).Вот полный результат:

{'attrs': [],
'error': '',
'fields': ['title', 'body'],
'matches': [{'attrs': {}, 'id': 1, 'weight': 1}],
'status': 0,
'time': '0.392',
'total': 1,
'total_found': 1,
'warning': '',
'words': [{'docs': 1, 'hits': 3, 'word': 'tartaruga'}]}

В конечном итоге я хочу получить что-то вроде этого:

[
  {
    'title': 'Dan Simmons - I Canti di Hyperion 3 - Endymion',
    'body': 'il vecchio mostrò quel suo sorriso a becco di tartaruga. — non bisogna dimenticare il palazzo dello shrike, né il nostro vecchio amico shrike, giusto? non ce ne sono altre?'
  },
  {
    'title': 'Dan Simmons - I Canti di Hyperion 3 - Endymion',
    'body': '— vieni più vicino, raul endymion. — la voce pareva il rumore di una lama spuntata che sfregasse su pergamena. le labbra si muovevano come il becco d\'una tartaruga.'
  },
  {
    'title': 'Dan Simmons - I Canti di Hyperion 3 - Endymion',
    'body': 'il becco di tartaruga ebbe una contrazione, la grossa testa si mosse in un cenno d\'assenso. notai ora che il viso del vecchio, malgrado i danni provocati dai secoli, aveva ancora tratti netti e spigolosi... un\'aria da satiro.'
  },
]

Я имею в виду массив событий с книгойвзят отрывок и слово из контекста (я выбрал предложения, но n слова до или после совпадения будут работать).Я думаю, что я должен использовать BuildExcerpts, но как?

Кроме того, если я хочу сопоставить как tartaruga (черепаха), так и tartarughe (черепахи), я бынравится выдавать запрос как tartarug*.Как это сделать Сфинкс?Заранее спасибо.

1 Ответ

0 голосов
/ 24 февраля 2012

Я делаю то же самое для проекта, над которым работаю.Мое предложение будет заключаться в том, что загрузка всей книги в виде одного поля не является хорошей идеей, если только вы не собираетесь работать только с одной книгой, а не со многими книгами.Вот как я это делаю.

  1. Книга хранится в базе данных MySQL по одной странице за раз.
  2. Запуск sphinx по базе данных с несколькими миллионами страниц текста - работает очень быстро, возвращает каждыйстраница с текстом, который вы ищете (или в зависимости от количества страниц в БД, просто получите первые 30 или что-то еще.)
  3. Используйте Excerpt Builder, чтобы получить отрывок со страницы, а затем выделитеФаза поиска.
  4. Если у Python нет доступа к компоновщику отрывков (это может быть только php), то вы можете выполнить ту же работу без особых сложностей, используя регулярные выражения - вам просто нужно найти свой поискфразу и сделайте регулярное выражение, чтобы найти столько текста с обеих сторон, и другое регулярное выражение для добавления выделения.

Вы можете написать скрипт на python (я использую скрипт PHP, запускаемый из оболочки bash), чтобы извлечь вашотправляйте по тексту одну страницу за раз, очищайте ее и добавляйте в базу данных.

Вам потребуется база данных, по крайней мере, с двумя таблицами, например,

books (fields could be called, id, name, author)

pages (fields would be id, book_id, page_text)

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

SELECT page_text FROM pages WHERE id = $idreturnedbysphinx;

Затем вы отправляете этот возвращенный текст текстовому выделителю / текстовой подсветке.

Sphinx может либо искать точные слова, либо слова с основами (и многое другое), но вам необходимо настроить это в файле sphinx.conf..

Вам нужно как минимум два определения индекса:

indexer indexname1
{
     #source database connection and sql query
      source                = src1
      path                  = /var/data/indexname1
     [... other settings ...]
     #make sure stemming is switched off
     morphology             = none


}
#child index inherits the above, and add stemming
index indexname1stemmed : indexname1
{
    path            = /var/data/indexname1stemmed
    morphology      = stem_en
    index_exact_words   = 1
}

Затем вам также нужно будет указать в поиске сфинксов режим соответствия, который вы хотите использовать.Я не знаю синтаксис python, но руководство по sphinx излагает его лучше, чем я могу: http://sphinxsearch.com/docs/current.html#matching-modes

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

...