2011-06-24 9 views
0

F.e.私は3つの文書を持っています。
1.「犬猫ボール」
2.「犬ボールの猫」
3.「犬猫、ボールと象」Solr:より大きなフレーズを除く検索

Soが「犬AND猫ANDボール」を照会することで、最初の2つの文書のみを受け取りたい。
だから。私が要求した単語だけを結果に含めるという主なアイデアです。

アドバイスをいただければ幸いです。
ありがとうございます。

+0

あなたの問題は何ですか?なぜ "犬と猫とボール"はあなたのために働かないのですか? – Xodarap

+0

私は、犬、猫、そしてボールよりも洗練された書類は必要ありません。そう。私は検索結果に3番目のケースは必要ありません。 – denys

+0

あなたは '+ dog + cat + ball -elephant'を行うことができます。 (または "... AND(象はない)")しかし、あなたが望んでいない単語はすべて明示的に除外しなければなりません。 – Xodarap

答えて

1

を作成しているときに、Documentをインデックスに追加する前に、TermVector.YESを使用している場合は、コレクタをオーバーライドしてTermVectorを保存することもできます。ここでは、単純な(スコアなしで文書だけを返す)実装です:あなたはそれを受け入れられるのであれば、文書にする必要がありますどのように多くの用語を知っている:今

private static class MyCollector extends Collector { 
    private IndexReader ir; 
    private int numberOfTerms; 
    private Set<Integer> set = new HashSet<Integer>(); 

    public MyCollector(IndexReader ir,int numberOfTerms) { 
     this.ir = ir; 
     this.numberOfTerms = numberOfTerms; 

    } 

    @Override 
    public void setScorer(Scorer scorer) throws IOException { } //we do not use a scorer in this example 

    @Override 
    public void setNextReader(IndexReader reader, int docBase) { 
     //ignore 
    } 

    @Override 
    public void collect(int doc) throws IOException { 
     TermFreqVector vector = ir.getTermFreqVector(doc, CONTENT_FIELD); 
        //CONTENT_FILED is the name of the field you are searching in... 
     if (vector != null) { 
      if (vector.getTerms().length == numberOfTerms) { 
       set.add(doc); 
      } 
     } else { 
      set.add(doc); //well, assume it doesn't happen, because you stored your TermVectors. 
     } 

    } 

    @Override 
    public boolean acceptsDocsOutOfOrder() { 
     return true; 
    } 
    public Set<Integer> getSet() { 
     return set; 
    } 
}; 

は、アイデアがあるIndexSearcher#search(Query,Collector)

を使用あなたはそれを確認し、このルールに合致する文書だけを収集するだけです。もちろん、これはもっと複雑になることがあります(ベクトルの特定の用語を探す、ベクトルの単語の順番)が、これは一般的な考えです。

実際にTermVectorを保存すると、ほとんど何でもできるので、それを使ってみてください。

+0

そう...あなたが意味するのは、後処理ですか? – denys

+0

@denys:ドキュメントがsearch()内のクエリと一致する場合、 'Collector#collect(int docID)'が呼び出されます。 – amit

+0

@amitありがとうございます。私はあなたのことを理解しました。今、あなたがSolrでこのIndexSearcherを使用できる場所を教えてください。私はSolrIndexSearcherに自分の変更を加えるべきですか? – denys

1

ハッシング機能を備えたフィルタファクトリ/トークナイザのペアを実装できます。あなたは

  • 用語をトークン化する必要が

    1. 使用copyfieldディレクティブ
    2. アルファベット順にストップワード(あなたの例では)
    3. ソート条件を削除しても、検索するために問合せを拡張ハッシュ
    4. を保存ハッシュ何かのように:

    somestring:"dog AND cat AND ball" AND somehash:"dog AND cat AND ball"

    2番目の検索クエリ部分はクエリ処理で暗黙的にハッシュされます。

    これは

    P.S.(偽陽性の非常に非常に非現実的な確率で)完全一致のみになりますあなたはtermvectorsを格納する必要はありません。目立つ小さな指数になるでしょう。

  • 関連する問題