2009-07-09 106 views
0

通常當我們搜索時,我們有一個故事列表,我們提供一個搜索字符串,並期望返回給定搜索字符串匹配故事的結果列表。如何將搜索字符串與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") 

回答

0

也許緩慢,但簡單的解決方案:

製作對故事的查詢以及搜索引擎的每個字符串。如果它返回任何內容,則匹配。

否則,您需要自己實現搜索語法。如果這包括諸如「標題:」之類的東西,那麼這可能相當複雜。如果它只是你例子中的AND和OR,那麼它是一個不太毛茸茸的遞歸函數。

+0

使用我的搜索引擎(solr)的問題是,列表搜索字符串上方的代碼中會有10,000個短語。每個故事的搜索服務器達到10,000次是不理想的。會非常昂貴。 我沒有使用任何複雜的東西,只:和,或,行情和括號 我想寫一個函數將其轉換爲正則表達式,但考慮到我有限的正則表達式技能,我想調查,如果這樣的函數已經存在python ... – sajal 2009-07-09 14:35:26

0

前段時間我找了個lucene的python實現,我來到了Woosh這是一個純粹的基於python文本的研究引擎。也許它會確定你的需求。你可以試試pyLucene,但我沒有調查過這個。

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

問題是我的索引是solr在另一臺服務器上運行的,而search_strings將有超過10,000+個詞條。運行這麼多的查詢在時間和資源方面會很昂貴。 – sajal 2009-07-09 14:46:16

+0

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

0

這對你來說現在可能不那麼有趣了,因爲你已經解決了你的問題,但是你描述的內容聽起來像是Prospective Search,這就是你首先查詢並且想要匹配它時的稱呼反對文件。

Lucene的MemoryIndex是一個專門爲此類設計的類,在您的情況下,它可能足夠高效,可以針對單個文檔運行多個查詢。不過,這與Python無關。在java中寫這樣的東西可能會更好。

相關問題