Подсчет полезных нагрузок Lucene - PullRequest
1 голос
/ 27 июня 2011

Я хочу выяснить, как работает оценка полезной нагрузки в lucene. Поскольку я не понимаю, куда входит PayloadFunction, думаю, я не совсем понимаю, как она работает. Попробовал поискать в Google, но не смог найти ничего, кроме советов по поиску источника. Хорошо, было бы неплохо, если бы кто-то мог объяснить это здесь, иначе исходный код это:)

1 Ответ

3 голосов
/ 28 июня 2011

Есть три его части. Прежде всего, вы должны генерировать полезные данные во время анализа. Это можно сделать с помощью PayloadAttribute. Вам просто нужно добавить этот атрибут в термины, которые вы хотите во время анализа.

class MyFilter extends TokenFilter {

  private PayloadAttribute attr;

  public MyFilter() {
    attr = addAttribute(PayloadAttribute.class);
  }

  public final boolean incrementToken() throws IOException {
    if (input.incrementToken()) {
      Payload p = new Payload(PayloadHelper.encodeFloat(42));
      attr.setPayload(p);
    } else {
      attr.setPayload(null);
    }
}

Тогда при поиске следует использовать специальный класс запросов PayloadTermQuery. Этот класс ведет себя как SpanTermQuery, но отслеживает полезные данные в индексе. Используя пользовательскую реализацию Similarity, вы можете оценить каждое вхождение полезной нагрузки в документе.

public class MySimilarity extends DefaultSimilarity {

  public float scorePayload(int docID, String fieldName,
                            int start, int end, byte[] payload,
                            int offset, int length) {
    if (payload != null) {
      return PayloadHelper.decodeFloat(payload, offset);
    } else {
      return 1.0f;
    }
  }
}

Наконец, используя PayloadFunction, вы можете агрегировать оценки полезной нагрузки по документу для получения окончательной оценки документа.

...