2011-12-28 4 views
0

Luceneインデックスを検索して、フィールド "patterns"に含まれるドキュメントのみを取得するにはどうすればよいですか?「C」は少なくとも4回、 "少なくとも4回、そして" N "という言葉は少なくとも2回?少なくとも与えられた検索語頻度を持つすべてのLuceneドキュメントを見つける

は、ここで私がやっているものです:

は、私はゆっくりとのLuceneとのグリップを取得していますが、長い道のりがまだあります。私は、水(H2O)のような化合物が "OHHOH OH"とメタノール(CH3OH)のパターンを含む "文書"に翻訳される化学探索アイデアのためにそれを使用しています。 "CHHHOH CH CH CH CO OH "

(実際のコードは、水素を省略し、数千の「言葉」は、多くの反復を含む平均文書にありますサイズ7にサブストラクチャを使用しています。このアプローチは便利である場合、私は研究しています。)

私はすべての語幹をしたくないので、私は唯一のWhitespaceAnalyzerを使用してい

dirname = SimpleFSDirectory(File(indexDir)) 
analyzer = WhitespaceAnalyzer(Version.LUCENE_30) 
writer = IndexWriter(dirname, analyzer, True, IndexWriter.MaxFieldLength.UNLIMITED) 

for compound_id, patterns in process_molecules(input_molecules): 
    doc = Document() 
    doc.add(Field("compound_id", compound_id, Field.Store.YES, Field.Index.ANALYZED)) 
    f = Field("patterns", patterns, Field.Store.YES, Field.Index.ANALYZED) 
    f.setOmitNorms(True) 
    doc.add(f) 
    writer.addDocument(doc) 

writer.optimize() 
writer.close() 

は、私のようなものを(これはpyluceneインタフェースを介してである)を使用してインデックスを作成しました。私はOmitNorms()を使用しています。なぜなら、私は任意の長さの正規化を望んでいないからです。 (私は他の何かをしなければならないでしょうか?)

類似性検索コードは、私がもう少しテストする必要がありますが、大丈夫な結果をもたらします。

「サブストラクチャ検索」のインデックスも使用します。つまり、ある環(炭素4個と窒素2個)に6個の原子を持つ化学構造をスケッチすると、その環を基礎構造とするすべての構造を与えたいと思います。

複雑なケースでは、これにはサブグラフ同型検索が必要です。これをテキスト検索のケースに変換することで、明らかな不一致を拒否できます。そのリングのパターン文書は「C C N C C N CN CC CN CN CC CN」です。この環部分構造を含む全ての化合物は、少なくとも4 "C"、2 "N"、4 "CN"および2 "CC"を有する対応するパターン文書を有しなければならない。したがって、私は高価な部分グラフ同型検索コードの一部をパターン周波数に基づいたフィルタに置き換えることができます。

問題は、頻度ベースのクエリを指定する方法がわかりません。

答えて

0

構造を変更すると、フィルタで簡単に検索できます。

化合物の原子数を保持する各要素について異なるフィールドを考えてみましょう。したがって、H2Oはh:2、O:1、C:0、 CH 3 OHはC:1、H:4、O:1として索引付けされる。 OHのような化合物に別のフィールドを追加することもできます。

この文書構造では、検索のためにフィルタと範囲クエリを使用できます。 たとえば、最初のクエリはC:[4 TO 10000] AND CN:[4 TO 10000] AND N:[2 TO 10000]

+0

のようになります。 (私は銅のための[Cu]のような用語を持っているので、いくつかのフィールドをエンコードする必要がありますが、それは難しくありません)また、これらのフィールドを類似性のために使うことはできますか? –

+0

私が示唆しているのは、周期表の各原子のフィールドを作ることです。各フィールドには、原子の数を格納します。類似部分については、同じ量の原子を有していれば、それらの間の結合を捨てても同様であれば、他のフィールドは必要ない。範囲クエリで検索するだけです。しかし、結合が重要な場合は、パターン:OH COのようなパターンを保持するためのフィールドを追加します。 – hkn

関連する問題