2009-07-09 15 views
0

通常、検索すると、ストーリーのリストがあり、検索ストリングを提供し、特定の検索ストリングがストーリーと一致する結果のリストを返すことを期待しています。検索文字列をPythonのコンテンツに一致させる方法

私がやりたいことは、反対です。検索文字列と1つのストーリーのリストを与え、そのストーリーに一致する検索文字列を見つけます。

これはreで行うことができますが、ここではsolrでサポートされているような複雑な検索クエリを使用したいと考えています。 query syntax hereの詳細注:私はブーストを使用しないでください。

基本的に私は、下のサンプルコードでは、doesitmatch関数のいくつかのポインタを取得したいと思います。

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)を使用する際の問題は、リストsearchstringsの上のコードが10,000語のフレーズを持つことです。ストーリーごとに10,000回の検索サーバーにヒットすることは理想的ではありません。非常に高価になります。 私は複雑なものを使用していません:AND、OR、引用符と括弧 私は、正規表現に変換する関数を書こうと思っていますが、私のような関数が既にPython ... – sajal

0

私はluceneのpython実装を探していましたが、純粋なpythonのテキストベースのリサーチエンジンであるWooshを見つけました。たぶんそれはあなたの必要性を定めるでしょう。

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

問題は、私のインデックスが別のサーバー上で実行されていることであり、search_stringsには10,000以上の用語が含まれているということです。非常に多くのクエリを実行すると、時間とリソースの点で高価になります。 – sajal

+0

検索文字列はどのくらいの頻度で変更されますか? –

+0

1日に数回(今後の予定はまだ決まっていません)...> 1時間/時間 – sajal

1

大規模なグーグルの後、私はブーリアン検索をしています。正規表現のブール値を意識するコードが見つかり

http://code.activestate.com/recipes/252526/

問題は、今のところ解決に見えます。

0

あなたの問題をすでに解決しているので、これはおそらくあまり面白くないかもしれませんが、質問が最初にあってそれにマッチさせたい場合には、Prospective Search彼らが来るときにドキュメントに対して。

LuceneのMemoryIndexは、このような目的で特別に設計されたクラスであり、単一のドキュメントに対して多くのクエリを実行するのに十分な効率があります。

これはPythonとは関係ありません。あなたはおそらくjavaのようなものを書いた方が良いでしょう。

+0

興味深いですが、私はすでにsolr(luceneベース)を使っています。 idがPythonにあることを好む理由は、imがdjangoプロジェクト内でそれを使用しているからです。さらに、私はJavaでhello worldを書くこともできません:) – sajal

+0

これは古い質問/コメントですが、これを読んでいる人はElasticSearchがパーコレーション機能を備えているということに興味があるかもしれません。 – herman

関連する問題