2012-02-07 88 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数据库,并保持它在文本文件中,但我可能会去每页一个文本文件作为一种更易于管理的工作方式,否则您将返回将整个电子书作为搜索结果返回。