Полезная нагрузка Lucene 3.1 - PullRequest
3 голосов
/ 09 июля 2011

Я пытаюсь выяснить, как работают полезные нагрузки в Lucene, и я не могу понять это.Моя ситуация выглядит следующим образом:

Мне нужно проиндексировать документ, который имеет одно поле содержимого, и прикрепить к каждому токену из текста в этом поле полезную нагрузку (около 10 байтов).Анализатор, который мне нужно использовать, является базовым анализатором пробелов.

Из различных статей, которые я читал в Интернете, способ работы с полезными нагрузками будет состоять в том, чтобы создать собственный анализатор и подключить полезные данные во время работы.шаг токенизации.Я создал следующий код для моего нового пользовательского анализатора:

public TokenStream tokenStream(String fieldName, Reader reader) {
    TokenStream tokenStream = new WhitespaceTokenizer(Version.LUCENE_31,
            reader);

    OffsetAttribute offsetAttribute = tokenStream
            .getAttribute(OffsetAttribute.class);
    CharTermAttribute termAttribute = tokenStream
            .getAttribute(CharTermAttribute.class);
    if (!tokenStream.hasAttribute(PayloadAttribute.class)) {
        tokenStream.addAttribute(PayloadAttribute.class);
    }
    PayloadAttribute payloadAttribute = tokenStream
            .getAttribute(PayloadAttribute.class);

    try {
        while (tokenStream.incrementToken()) {
            int startOffset = offsetAttribute.startOffset();
            int endOffset = offsetAttribute.endOffset();

            String token;

            try{
                token = (termAttribute.subSequence(startOffset, endOffset)).toString();
            }
            catch(IndexOutOfBoundsException ex){
                token = new String(termAttribute.buffer());
            }

            byte[] payloadBytes = payloadGenerator.generatePayload(token,
                    frequencyClassDigest);
            payloadAttribute.setPayload(new Payload(payloadBytes));
        }
        tokenStream.reset();

        return tokenStream;
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
}

У меня возникают следующие проблемы:

  1. Я не могу правильно прочитатьиндивидуальные токены.Я не уверен, что использование CharTermAttribute является правильным способом сделать это, но я знаю, что это просто не работает.Мне нужно добраться до отдельного токена, чтобы правильно рассчитать полезную нагрузку, но каким-то образом WithespaceTokenizer возвращает отдельные слова, склеенные вместе (по 3 слова за раз).
  2. Я не знаю, если использование PayloadAttributeправильный способ прикрепить полезную нагрузку к токену.Может быть, вы знаете другой способ

Где я могу найти хороший учебник о том, как на самом деле использовать полезные нагрузки в Lucene?Я попытался выполнить поиск в Интернете, и единственная хорошая статья, которую мне удалось найти, заключалась в следующем: Учебное пособие по Lucene Payload Однако оно не совсем соответствует моим потребностям.

Спасибо

Не могу найти хороший учебник

1 Ответ

2 голосов
/ 11 августа 2011

Вы можете инкапсулировать логику генерации полезной нагрузки в фильтр, который будет генерировать полезную нагрузку для каждого токена, проходящего через фильтр.Я смоделировал это от DelimitedPayloadTokenFilter.

public final class PayloadGeneratorFilter extends TokenFilter {
  private final CharTermAttribute termAtt = addAttribute(CharTermAttribute.class);
  private final PayloadAttribute payAtt = addAttribute(PayloadAttribute.class);
  private final PayloadGenerator payloadGenerator;
  private final FrequencyClassDigest frequencyClassDigest;


  public PayloadGeneratorFilter(TokenStream input, PayloadGenerator payloadGenerator,
                                FrequencyClassDigest frequencyClassDigest) {
    super(input);
    this.payloadGenerator = payloadGenerator;
    this.frequencyClassDigest = frequencyClassDigest;
  }

  @Override
  public boolean incrementToken() throws IOException {
    if (input.incrementToken()) {
      final char[] buffer = termAtt.buffer();
      final int length = termAtt.length();
      String token = buffer.toString();
      byte[] payloadBytes = payloadGenerator.generatePayload(token, frequencyClassDigest);
      payAtt.setPayload(new Payload(payloadBytes));
      return true;
    }

    return false;
  }
}

от Lucene. Это сделало бы ваш код анализатора очень простым:их в тексте, который вы отправляете в Lucene, а затем используйте DelimitedPayloadTokenFilter.text text text text станет text|1.0 text|2.2 text|0.5 text|10.5

http://sujitpal.blogspot.com/2010/10/denormalizing-maps-with-lucene-payloads.html также является хорошим ресурсом.

...