#lucene
#lucene
Вопрос:
Простой тест с Lucene 4.9. используйте RAMDirectory для индексации двух документов шириной 3 файла [longdata, stringdata, textdata].
документы
[2000000L, «привет g», «привет g»] [4000000L, «мир», «world»]
вот мой код
public static void main(String[] args) throws IOException {
Directory directory = null;
IndexWriter iwriter = null;
Analyzer analyzer = new SmartChineseAnalyzer(Version.LUCENE_4_9);
directory = new RAMDirectory();
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_4_9, analyzer);
iwriter = new IndexWriter(directory, config);
Document doc = new Document();
doc.add(new LongField("longdata", 2000000L, Field.Store.YES));
doc.add(new LongField("longdata", 4000000L, Field.Store.YES));
doc.add(new StringField("stringdata", "hello g", Field.Store.YES));
doc.add(new StringField("stringdata", "world", Field.Store.YES));
doc.add(new TextField("textdata", "hello g", Field.Store.YES));
doc.add(new TextField("textdata", "world", Field.Store.YES));
iwriter.addDocument(doc);
iwriter.close();
DirectoryReader ireader = DirectoryReader.open(directory);
Fields fields = MultiFields.getFields(ireader);
System.out.println("longdata========");
Terms terms = fields.terms("longdata");
TermsEnum iterator = terms.iterator(null);
BytesRef byteRef = null;
while ((byteRef = iterator.next()) != null) {
System.out.println(NumericUtils.prefixCodedToLong(byteRef));
}
System.out.println("stringdata========");
Terms strterms = fields.terms("stringdata");
TermsEnum striterator = strterms.iterator(null);
BytesRef strbyteRef = null;
while ((strbyteRef = striterator.next()) != null) {
System.out.println(strbyteRef.utf8ToString());
}
System.out.println("textdata========");
Terms textterms = fields.terms("textdata");
TermsEnum textiterator = textterms.iterator(null);
BytesRef textbyteRef = null;
while ((textbyteRef = textiterator.next()) != null) {
System.out.println(textbyteRef.utf8ToString());
}
ireader.close();
directory.close();
}
это ВЫВОД
longdata========
2000000
4000000
1966080
3997696
0
0
stringdata========
hello g
world
textdata========
g
hello
world
Мой вопрос в том, почему существует так много long term?
Ответ №1:
Lucene индексирует числовые поля в скобках с все меньшим и меньшим шагом точности (контролируемым шагом точности), что позволяет ему более эффективно (и быстро) находить правильные соответствия.
Если вы взглянете на двоичное представление этих чисел, станет немного более очевидно, что происходит:
4000000 = 0b1111010000100100000000
3997696 = 0b1111010000000000000000
2000000 = 0b111101000010010000000
1966080 = 0b111100000000000000000