0

次のような状況があります。インデックスを作成するドキュメントのコレクションがあります。しかし、インデックスするものは厳選する必要があります。

選択基準: ドキュメントには、特定のキーワードのいずれかが含まれている必要がありますSet

その部分は簡単です。これらのキーワードのいずれかがドキュメントに存在するかどうかを確認してから、ドキュメントにインデックスを付けることができます。トリッキーな状況は (とにかく私にとって!)、これらのキーワードだけをインデックスに登録したいということです。そして、これらのキーワードは複数語にすることも、正規表現にすることもできます。

これらのキーワードがどうなるかは、この投稿では意味がありません。なぜなら、それを抽象化できるからです。インデックスを作成する必要があるキーワードのリストを生成できます。

使用できる既存の TokenStream、Analyzer、Filter の組み合わせはありますか? そうでない場合は、誰かが私を正しい方向に向けてください。


私の質問が十分に明確でない場合:

HashSet<String> impKeywords = new HashSet<String>(new String[] {"Java", "Lucene"});

私が使用するクラスContentがあります。

Content content = new Content("I am only interested in Java, Lucene, Nutch, Luke, CommonLisp.");

そして、一致するキーワードを取得する方法があるとします。

HashSet<String> matchingKeywords = content.getMatchingKeywords(impKeywords); // returns a set with "Java" and "Lucene"

そして、matchingKeywords がある場合にのみ、ドキュメントのインデックス作成に進みます。それで:

if(!matchingKeywords.isEmpty()) {
    // prepare document for indexing, and index.
    // But what should be my Analyzer and TokenStream?
}

これらの一致するキーワードのみを返す TokenStream を使用して Analyzer を作成できるようにしたいので、これらのトークンのみがインデックス化されます。

終わりの注記: 1 つの可能性として、各ドキュメントに対して、一致するキーワードごとに可変数のフィールドを追加することが考えられます。これらのフィールドはインデックス化されていますが、 を使用して分析されていませんField.Index.NOT_ANALYZED。ただし、フィールドをいじる代わりに、この目的のために既存の Analyzer/TokenStream を見つけ出すことができればより良いでしょう。

4

1 に答える 1

0

@femtoRgon のアドバイスに従って、上記の問題を次のように解決しました。

質問で説明したように、私は以下を持っています:

HashSet<String> impKeywords = new HashSet<String>(new String[] {"Java", "Lucene"});

そして、私が使用するクラスContentがあります。次のように言います。

Content content = new Content("I am only interested in Java, Lucene, Nutch, Luke, CommonLisp.");

そして、一致するキーワードを取得する方法があります。

HashSet<String> matchingKeywords = content.getMatchingKeywords(impKeywords); // returns a set with "Java" and "Lucene" for this example `content`.

そして、matchingKeywords がある場合にのみ、ドキュメントのインデックス作成に進みます。インデックス作成中に次のことを行いました。

if(!matchingKeywords.isEmpty()) {
    Document doc = new Document();
    for(String keyword: matchingKeywords) {   
        doc.add(new Field("keyword", keyword, Field.Store.YES, Field.Index.NOT_ANALYZED);
    }
    iwriter.addDocument(doc); // iwriter is the instance of IndexWriter
}

次に、検索中に次のブールクエリを作成しました。

BooleanQuery boolQuery = new BooleanQuery();

for(String queryKeyword: searchKeywords)) {
    boolQuery.add(new TermQuery(new Term("keyword", queryKeyword)), BooleanClause.Occur.SHOULD);
}

ScoreDoc[] hits = isearcher.search(boolQuery, null, 1000).scoreDocs; // isearcher is the instance of IndexSearcher

この回答が、同様のニーズを持つ人に役立つことを願っています。

于 2013-07-16T10:20:19.427 に答える