2017-06-06 217 views
0

故事: 我需要搜索一个transactionIds列表是一个给定的用户名查询,例如“Peter M *”。Lucene 6如何避免重复条目

问题:如何保持存储的transactionIds独特?

我已填充我的指数有下列文件:

Document doc = new Document(); 
doc.add(new StoredField(TRANSACTION_ID, data.getTransactionId())); 
doc.add(new TextField(MARCHANT_NAME, data.getName(), Store.NO)); 

我已经尝试了媒体链接两种策略(避免重复的条目),以添加新条目。

  1. IndexWriter.updateDocument带有一个Term来存储transactionId。
  2. 搜索当前的transactionId,删除它,并将其存储:

回答

1

您使用的是StoredField为TRANSACTION_ID领域。这意味着它可以从索引中检索,但没有编入索引并且不能被搜索,因此它不能用作updateDocument的关键字。改为使用StringField

+0

我明白了。那么也可以使用LongPoint? –

+0

我通常不会推荐它。要做到这一点,你想避免'updateDocument',而是做一个删除,然后添加一个新的文档,所以你可以使用一个'查询'来匹配文件删除,而不是'期限'。我通常建议不要使用数字字段,例如'LongPoint'来标识标识符。如果它是一个恰好由数字组成的标识符,则使用'StringField'。如果它实际上是一个数字(即数字范围查询会很有用),那么“LongPoint”将是一个不错的选择。 – femtoRgon