2

私は文字通り、この新しいAPIと、NRTManagerのようなコアなものの例の欠如に苦しんでいます。

私はこの例に従い、最終結果は次のとおりです。

NRTマネージャーの構築方法は次のとおりです。

analyzer = new StopAnalyzer(Version.LUCENE_40);
config = new IndexWriterConfig(Version.LUCENE_40, analyzer);
writer = new IndexWriter(FSDirectory.open(new File(ConfigUtil.getProperty("lucene.directory"))), config);
mgrWriter = new NRTManager.TrackingIndexWriter(writer);
ReferenceManager<IndexSearcher> mgr = new NRTManager(mgrWriter, new SearcherFactory(), true);

NRTマネージャーのライターに新しい要素を追加します。

long gen = -1;
try{
    Document userDoc = DocumentManager.getDocument(user);
    gen = mgrWriter.addDocument(userDoc);
} catch (Exception e) {}
return gen;

しばらくして、前のドキュメントを更新する必要があります。

// Acquire a searcher from the NRTManager. I am using the generation obtained in the creation step
((NRTManager)mgr).waitForGeneration(gen);
searcher = mgr.acquire();

//Search for the document based on some user id
Term idTerm = new Term(USER_ID, Integer.toString(userId));
Query idTermQuery = new TermQuery(term);
TopDocs result = searcher.search(idTermQuery, 1);
if (result.totalHits > 0) resultDoc = searcher.doc(result.scoreDocs[0].doc);
else resultDoc = null;

問題は、それresultDocが常にnullになることです。私は何が欠けていますか?これらの変更を確認するためにcommit()、またはその他の方法で使用するべきではありません。flush()

ここNRTManagerReopenThreadに例示されているようにを使用しています。

LEuserDocの作成

public static Document getDocument(User user) {
    Document doc = new Document();
    FieldType storedType = new FieldType();
    storedType.setStored(true);
    storedType.setIndexed(false);

    // Store user data
    doc.add(new Field(USER_ID, user.getId().toString(), storedType));
    doc.add(new Field(USER_NAME, user.getFirstName() + user.getLastName(), storedType));

    FieldType unstoredType = new FieldType();
    unstoredType.setStored(false);
    unstoredType.setIndexed(true);
    Field field = null;

    // Analyze Location
    String tokens = "";
    if (user.getLocation() != null && ! user.getLocation().isEmpty()){
        for (Tag location : user.getLocation()) tokens += location.getName() + " ";

        field = new Field(USER_LOCATION, tokens, unstoredType);
        field.setBoost(Constants.LOCATION);
        doc.add(field);
    }

    // Analyze Language
    if (user.getLanguage() != null && ! user.getLanguage().isEmpty()){
        // Same as Location
}

    // Analyze Career
    if (user.getCareer() != null && ! user.getCareer().isEmpty()){
        // Same as Location
    }
    return doc;
}
4

1 に答える 1

1

あなたの問題はNRT関連ではありません。インデックスが作成されていませんが、USER_IDフィールドを再度検索していますが、これは機能しません。IDフィールドをトークン化したくない場合は、FieldType#setTokenized(false)を呼び出すだけです(または、StringFieldを使用します。これは、デフォルトで正確に実行されます。トークン化されていないことでインデックスが作成されます)。

于 2012-12-05T15:02:20.123 に答える