Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用斯芬克斯建筑摘录_Python_Full Text Search_Sphinx - Fatal编程技术网

Python 如何使用斯芬克斯建筑摘录

Python 如何使用斯芬克斯建筑摘录,python,full-text-search,sphinx,Python,Full Text Search,Sphinx,所以,我设置了一个Sphinx配置文件。我有一个非常简单的模式,有两个字段,title和body,其中title是小说的名称,body是完整的小说本身。为了简单起见,我只增加了一本小说。索引器工作得很好,pythonapi使查询sphinxd变得轻而易举。到目前为止,我印象非常深刻,这似乎是我迄今为止研究过的最容易设置全文搜索引擎的方法(比Lucene或Solr容易得多,比Woosh快得多) 我跳过了任何数据库后端。我的小说是纯.txt格式的,我已经添加了 使用这个简单xml的示例(通过xmlp

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

我跳过了任何数据库后端。我的小说是纯.txt格式的,我已经添加了 使用这个简单xml的示例(通过xmlpipe)

我最终想要的是这样的:

[
  {
    '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个单词都可以)。我想我必须使用构建摘录,但是如何使用呢


另外,如果我想同时匹配tartaruga(海龟)和tartarughe(海龟),我想发出一个类似
Tartarugh*
的查询。如何做到这一点是斯芬克斯?提前感谢。

我对我的一个项目也做了同样的事情。我的建议是,将整本书作为单个字段加载并不是一个好主意,除非您只使用一本书,而不是多本书。我是这样做的

  • 书存储在MySQL数据库中,每次存储一页
  • 在包含数百万页文本的数据库中运行sphinx- 工作速度非常快,返回每个页面和您正在查找的文本(或者根据数据库中的页数,只需获取前30页或其他内容)
  • 使用摘录生成器从页面获取摘录,然后突出显示搜索阶段
  • 如果Python无法访问摘录生成器(可能仅限于php),那么使用正则表达式也可以轻松地完成同样的工作——只需找到搜索短语并执行一个正则表达式来查找任意一侧的大量文本,然后使用另一个正则表达式来添加高亮显示
  • 您可以编写一个python脚本(我使用从bashshell运行的PHP脚本)一次提取一个页面的文本,对其进行清理,然后将其添加到数据库中

    您需要一个至少包含两个表的数据库,如

    书籍(可以调用字段、id、姓名、作者)

    页面(字段将是id、book\u id、page\u text)

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

    从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
    }
    
    然后还需要在sphinx搜索中指定要使用的匹配模式。我不知道python语法,但sphinx手册比我能做的更好:


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

    我知道PHP API有BuildExceprts来完成这项工作,您可以在这里找到一个示例:我不确定python API是否具有相同的EHMMM,这是否意味着如果我有100本不同书籍中的100个匹配项,我必须在内存中加载100本小说?是的。您需要加载文本,然后将其发送到sphinx以生成摘录。
    [
      {
        '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.'
      },
    ]
    
    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
    }