【问题标题】:How to match search strings to content in python如何将搜索字符串与python中的内容匹配
【发布时间】:2010-11-09 09:00:01
【问题描述】:

通常当我们搜索时,我们有一个故事列表,我们提供一个搜索字符串,并期望返回一个给定搜索字符串与故事匹配的结果列表。

我想做的恰恰相反。给出一个搜索字符串列表和一个故事,然后找出与该故事匹配的搜索字符串。

现在这可以通过 re 完成,但这里的情况是我想使用 solr 支持的复杂搜索查询。 query syntax here 的完整详细信息。注意:我不会使用 boost。

基本上我想在下面的示例代码中为 doitmatch 函数获取一些指针。

def doesitmatch(contents, searchstring):
    """
    returns result of searching contents for searchstring (True or False)
    """
    ???????
    ???????


story = "big chunk of story 200 to 1000 words long"
searchstrings = ['sajal' , 'sajal AND "is a jerk"' , 'sajal kayan' , 'sajal AND (kayan OR bangkok OR Thailand OR ( webmaster AND python))' , 'bangkok']

matches = [[searchstr] for searchstr in searchstrings if doesitmatch(story, searchstr) ]

编辑:另外还想知道是否有任何模块可以将如下所示的 lucene 查询转换为正则表达式:

sajal AND (kayan OR bangkok OR Thailand OR ( webmaster AND python) OR "is a jerk")

【问题讨论】:

    标签: python search lucene solr


    【解决方案1】:

    经过广泛的谷歌搜索,我意识到我要做的是布尔搜索。

    找到了使正则表达式布尔值感知的代码:http://code.activestate.com/recipes/252526/

    问题看起来已经解决了。

    【讨论】:

      【解决方案2】:

      可能很慢,但很容易解决:

      对故事和搜索引擎的每个字符串进行查询。如果它返回任何东西,那么它匹配。

      否则您需要自己实现搜索语法。如果这包括诸如“标题:”之类的东西,这可能会相当复杂。如果它只是您的示例中的 AND 和 OR,那么它是一个不太复杂的递归函数。

      【讨论】:

      • 使用我的搜索引擎 (solr) 的问题是列表 searchstrings 上方的 in 代码将有 10,000 个短语。每个故事访问搜索服务器 10,000 次并不理想。会很贵。我没有使用任何复杂的东西,只使用:AND、OR、引号和括号我正在考虑编写一个函数将其转换为正则表达式,但鉴于我有限的正则表达式技能,我想调查一下 python 中是否已经存在这样的函数......
      【解决方案3】:

      前段时间,我在寻找 lucene 的 python 实现,偶然发现了Woosh,这是一个纯 Python 基于文本的研究引擎。也许它会满足你的需求。

      你也可以试试pyLucene,但我没有调查这个。

      【讨论】:

        【解决方案4】:

        这是伪代码的建议。我假设您将带有搜索词的故事标识符存储在索引中,以便您可以使用搜索结果检索它。

        def search_strings_matching(story_id_to_match, search_strings):
            result = set()
            for s in search_strings:
                result_story_ids = query_index(s) # query_index returns an id iterable
                if story_id_to_match in result_story_ids:
                    result.add(s)
            return result 
        

        【讨论】:

        • 问题是我的索引是在另一台服务器上运行的 solr,而 search_strings 中将有超过 10,000 多个术语。运行如此多的查询会耗费大量时间和资源。
        • 搜索字符串多久更改一次?
        • 一天几次(尚未完全决定其即将开展的项目)...但 > 1ce/小时
        【解决方案5】:

        现在这对您来说可能不那么有趣了,因为您已经解决了您的问题,但是您所描述的内容听起来像 Prospective Search,当您首先有查询并且想要匹配时,这就是您所说的它会在文档出现时针对它们。

        Lucene 的 MemoryIndex 是专门为此类事情设计的类,在您的情况下,它可能足以对单个文档运行许多查询。

        不过,这与 Python 无关。你最好用java写这样的东西。

        【讨论】:

        • 看起来很有趣,我已经在使用 solr(基于 lucene)来做一些事情,看看是否可以使用它。 id 喜欢它在 python 中的原因是因为我在 django 项目中使用它。而且我什至不能用java写hello world :)
        • 我知道这是一个老问题/评论,但阅读这篇文章的人可能会对 ElasticSearch 为其提供渗透功能这一事实感兴趣。
        【解决方案6】:

        如果您在 AppEngine 上编写 Python,则可以使用 AppEngine 预期搜索服务来实现您在此处尝试执行的操作。见:http://code.google.com/appengine/docs/python/prospectivesearch/overview.html

        【讨论】:

          猜你喜欢
          • 2020-06-23
          • 1970-01-01
          • 2021-08-30
          • 1970-01-01
          • 2011-06-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-11
          相关资源
          最近更新 更多