如何使用Sphinx BuildExtrapts

2024-06-07 12:02:15 发布

您现在位置:Python中文网/ 问答频道 /正文

所以,我设置了一个Sphinx配置文件。我有一个非常简单的模式,有两个字段,标题和正文,其中标题是小说的名字,正文是完整的小说本身。为了简单起见,我只加了一本小说。索引器工作得很好,pythonapi使查询sphinxd变得轻而易举。到目前为止我真的印象深刻,这似乎是我研究过的最容易建立全文搜索引擎(比Lucene或Solr容易得多,比Woosh快得多)。在

我跳过了任何数据库后端。我有纯文本格式的小说,我添加了 使用这个简单的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”,意大利语中是“turtle”的意思,我确信这个词就是文件。事实上,被发现了三次,我想这就是斯芬克斯返回给我的('hits': 3)。这是完整的结果:

^{pr2}$

最后,我想要的是这样:

[
  {
    '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.'
  },
]

我的意思是,节选书中出现的一系列事件以及上下文中的单词(我选择了判决,但是在匹配之前或之后的单词都可以)。我想我必须使用BuildExtracts,但是怎么用呢?在

另外,如果我想同时匹配tartartaruga(turtles)和tartarughe(turtles),我想发出一个类似tartarug*的查询。怎么做到这是斯芬克斯?提前谢谢。在


Tags: titlesphinxbody小说ilhyperiondanuna
1条回答
网友
1楼 · 发布于 2024-06-07 12:02:15

我为我工作的项目做同样的事情。我的建议是,将整本书作为一个单独的字段加载不是一个好主意,除非你只处理一本书,而不是很多书。我是这样做的。在

  1. 这本书一页一页地存储在MySQL数据库中。在
  2. 在包含数百万页文本的数据库中运行sphinx- 工作非常快,返回每一页与你正在寻找的文本(或根据在数据库中的页数,只得到前30页或其他什么)。在
  3. 使用摘录生成器从页面获取摘要,然后突出显示搜索阶段。在
  4. 如果Python不能访问extract builder(可能只有php),那么您可以使用正则表达式轻松地完成相同的工作—您只需要找到搜索短语并执行regex,以便在两侧查找如此多的文本,并使用另一个regex添加突出显示。在

您可以编写一个python脚本(我使用从bashshell运行的PHP脚本),一次提取一个页面的文本,对其进行清理,然后将其添加到数据库中。在

你需要一个至少有两个表的数据库

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

pages (fields would be id, book_id, page_text)

Sphinx将返回一个页面id,然后使用一个简单的查询从MySQL获取页面。。。在

SELECT page_text FROM pages WHERE id = $idreturnedbysphinx;

然后将返回的文本发送到文本摘录器/文本高亮显示器。在

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
}

然后还需要在sphinx搜索中指定要使用的匹配模式。我不知道python语法,但sphinx手册对它的阐述比我所能做的更好: http://sphinxsearch.com/docs/current.html#matching-modes

你可以不使用SQL数据库来完成所有这些,并将其保存在文本文件中,但我可能会选择每页一个文本文件作为更易于管理的工作方式,否则你将返回整个电子书作为搜索结果。在

相关问题 更多 >

    热门问题