我想检查 600M 阿拉伯语句子的精确重复项(每个句子少于 150 个字符)。因此,我使用 Lucene 对文本及其哈希值建立了索引。 我对文本进行了哈希处理,如下所示:
MessageDigest digester = MessageDigest.getInstance("SHA-256");
digester.update(sentence.getBytes());
int hashValue = new String(digester.digest()).hashCode();
我的索引有以下字段:
text: <sentence>
hash: <hashValue>
我的想法是,我有一个句子列表,我想获得它们的精确重复项,这样我就可以使用它们的哈希值搜索 lucene。
ScoreDoc[] results;
TopScoreDocCollector collector = TopScoreDocCollector.create(1000);
Query rangeQuery = LegacyNumericRangeQuery.newIntRange("hash", hashValue, hashValue, true, true);
searcher.search(rangeQuery, collector);
results = collector.topDocs().scoreDocs;
问题是,当我这样做时,我得到了具有相同哈希值的不同句子!所以,我没能实现我想要的!
所以我想得到以下问题的答案:
- 如果使用此哈希函数对单词而不是句子进行哈希处理,冲突是否会减少?
- 有没有更好、集合更少的哈希函数?
- 有更好的方法来完成我的任务吗?
- 即使哈希函数使用字节,哈希语言是否也相关,那么它们对于 utf-8 文本来说是更好的哈希吗?
感谢您的回复! 问候, 雷姆
最佳答案
如果您使用 Lucene 对它们进行索引,那么您实际上并不需要哈希值。只需将句子存储为(未标记化的)StringField
并使用带有确切句子的 TermQuery
即可。
关于600M 句子的 Java 哈希字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40671983/