如何将搜索字符串与python中的内容匹配

问题描述:

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

我想要做的是相反的。给出搜索字符串列表和一个故事,找出哪些搜索字符串与该故事匹配。

现在这可以用re来完成,但这里的情况是我想用solr支持的复杂搜索查询。 query syntax here的全部细节。注意:我不会使用提升。

基本上我想在下面的示例代码中获得一些指针,用于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") 

也许缓慢,但简单的解决方案:

制作对故事的查询以及搜索引擎的每个字符串。如果它返回任何内容,则匹配。

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

+0

使用我的搜索引擎(solr)的问题是,列表搜索字符串上方的代码中会有10,000个短语。每个故事的搜索服务器达到10,000次是不理想的。会非常昂贵。 我没有使用任何复杂的东西,只:和,或,行情和括号 我想写一个函数将其转换为正则表达式,但考虑到我有限的正则表达式技能,我想调查,如果这样的函数已经存在python ... – sajal 2009-07-09 14:35:26

前段时间我找了个lucene的python实现,我来到了Woosh这是一个纯粹的基于python文本的研究引擎。也许它会确定你的需求。你可以试试pyLucene,但我没有调查过这个。

这是伪代码的建议。我假设您在索引中存储了一个包含搜索条件的故事标识符,以便您可以使用搜索结果进行检索。

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 
+0

问题是我的索引是solr在另一台服务器上运行的,而search_strings将有超过10,000+个词条。运行这么多的查询在时间和资源方面会很昂贵。 – sajal 2009-07-09 14:46:16

+0

搜索字符串多久改变一次? – 2009-07-09 16:18:08

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

发现,使正则表达式布尔注意代码:http://code.activestate.com/recipes/252526/

问题看起来解决了现在。

这对你来说现在可能不那么有趣了,因为你已经解决了你的问题,但是你描述的内容听起来像是Prospective Search,这就是你首先查询并且想要匹配它时的称呼反对文件。

Lucene的MemoryIndex是一个专门为此类设计的类,在您的情况下,它可能足够高效,可以针对单个文档运行多个查询。不过,这与Python无关。在java中写这样的东西可能会更好。

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