почему термины для longfield неверны?

#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