2012-02-07 50 views
1

因此,我建立了一個Sphinx配置文件。我有一個非常簡單的模式,有兩個字段,標題和正文,其中標題是小說的名稱,身體是完整的小說本身。爲了簡單起見,我只添加了一本小說。索引器工作得很好,Python API使查詢sphinxd變得輕而易舉。到目前爲止,我印象深刻,這似乎是迄今爲止我設置的全文搜索引擎最簡單的方法(比Lucene或Solr更容易,而且比Woosh更快)。如何使用Sphinx BuildExcerpts

我跳過了任何DB後端。我有我的純.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*。如何做到這一點是獅身人面像?提前致謝。

+0

我知道PHP API有BuildExceprts來做到這一點,你可以在這裏找到一個例子:http://sphinxsearch.com/wiki/doku.php?id=php_api_docs#buildexcerpts_documents_index_words_options我不知道如果python API有同樣的 – 2012-02-07 20:16:17

+0

嗯,這是否意味着我必須在內存中加載100個小說,如果我有來自100本不同書籍的100個匹配? – pistacchio 2012-02-07 20:58:00

+0

是的。你需要加載文本,然後發送給獅身人面像來構建摘錄。 – barryhunter 2012-02-09 15:05:50

回答

0

我爲我工作的項目做同樣的事情。我的建議是,將整本書作爲一個單獨的領域加載並不是一個好主意,除非你只會使用一本書而不是很多書。這是我如何做到的。

  1. 本書一次存儲在MySQL數據庫中的一頁。
  2. 在數據庫上運行sphinx,數百萬頁文本 - 工作速度非常快,每個頁面都帶有您正在查找的文本(或取決於數據庫中的頁面數量,只需獲得前30個或其他)。
  3. 使用摘錄生成器從頁面中摘錄摘要,然後突出顯示搜索階段。
  4. 如果Python無法訪問摘錄構建器(它可能僅用於PHP),那麼您可以使用正則表達式來完成相同的工作,而不會有太多困難 - 您只需找到搜索短語並執行一個正則表達式找到這麼多的文本,另一個正則表達式來添加突出顯示。

您可以編寫一個python腳本(我使用從bash shell運行的PHP腳本)一次提取一頁文本,清理它並將其添加到數據庫中。

你需要一個數據庫至少有兩個表像

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

pages (fields would be id, book_id, page_text)

獅身人面像會回報你一個頁面的id,你再得到使用簡單的查詢從MySQL的頁面...

SELECT page_text FROM pages WHERE id = $idreturnedbysphinx;

然後發送retur ned text to the text excerpter/text highlighter。

獅身人面像可以搜索確切的單詞或詞幹的單詞(還有更多),但是您需要在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語法,但獅身人面像手動設置好它比我能: http://sphinxsearch.com/docs/current.html#matching-modes

你可以做這一切,沒有一個SQL數據庫,並保持它在文本文件中,但我可能會去每頁一個文本文件作爲一種更易於管理的工作方式,否則您將返回將整個電子書作爲搜索結果返回。