java - Lucene 4.0 API - NRTManager 简单案例使用

标签 java lucene

我确实在为这个新的 API 而苦苦挣扎,并且缺少 NRT 管理器等核心内容的示例。

我关注了this示例,这是最终结果:

这就是 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 Manager 的编写器添加一个新元素:

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 作为示例 here .

LE userDoc 创建

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;
}

最佳答案

您的问题与 NRT 无关。您正在再次搜索 USER_ID 字段,尽管它尚未编入索引,但这是行不通的。如果您不希望您的 ID 字段被标记化,只需调用 FieldType#setTokenized(false)(或仅使用 StringField,它在默认情况下正是这样做的:按未标记化索引)。

关于java - Lucene 4.0 API - NRTManager 简单案例使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13653343/

相关文章:

java应用程序部署在red hat上的tomcat服务器上?

Java收银机: Getting change from in different subunits

java - 从执行命令行多行程序获取输出

Java解析部分日期

java - 在 Pax Exam 包含的测试中访问编译资源

java - hibernate 搜索索引不起作用

mysql - 使用 solr 索引和搜索 MySQL

java - 如何计算文档集的词频?

lucene - 是否可以在一个 JVM 中运行多个 map 任务?

java - 如何获取lucene索引的所有文件?