1

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

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

现在这可以用 re 完成,但这里的情况是我想使用 solr 支持的复杂搜索查询。查询语法的完整细节在这里。注意:我不会使用 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")
4

6 回答 6

2

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

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

问题现在看起来已经解决了。

于 2009-07-09T18:01:33.783 回答
0

如果您在 AppEngine 上编写 Python,则可以使用 AppEngine Prospective Search Service 来准确实现您在此处尝试执行的操作。请参阅:http ://code.google.com/appengine/docs/python/prospectivesearch/overview.html

于 2011-08-22T19:44:27.650 回答
0

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

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 
于 2009-07-09T14:15:58.307 回答
0

可能很慢,但很简单的解决方案:

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

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

于 2009-07-09T13:25:06.297 回答
0

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

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

于 2009-07-09T13:42:29.143 回答
0

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

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

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

于 2009-07-10T14:25:31.837 回答