Как Lucene оценивает результаты в RegexQuery? - PullRequest
2 голосов
/ 28 сентября 2010

Я вижу, как можно сравнивать два значения при обычном / нечетком полнотекстовом поиске, чтобы определить, какое из них «лучше» (т. Е. Одно значение содержит больше ключевых слов, чем другое, одно содержит меньше не-ключевых слов, чемother).

Однако, как Lucene вычисляет оценку при выполнении запросов регулярных выражений с использованием RegexQuery?Это логический запрос - значение поля либо совместимо с регулярным выражением, либо нет.Lucene не может взять ключевые слова из моего запроса на регулярное выражение и выполнить обычную магию ...

Ответы [ 2 ]

4 голосов
/ 28 сентября 2010

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

Основной код, который вы хотите просмотреть, находится в MultiTermQuery:

public Query rewrite(IndexReader reader) throws IOException {
  FilteredTermEnum enumerator = getEnum(reader);
  BooleanQuery query = new BooleanQuery();
  try {
    do {
      Term t = enumerator.term();
      if (t != null) {
        TermQuery tq = new TermQuery(t);      // found a match
        tq.setBoost(getBoost() * enumerator.difference()); // set the boost
        query.add(tq, false, false);          // add to query
      }
    } while (enumerator.next());
  } finally {
    enumerator.close();
  }
  return query;
}

Две вещи:

  1. Булевый запрос создается с помощью координат.Таким образом, применяется стандартная оценка координат (т. Е. Чем больше терминов вы получите, тем лучше).
  2. Повышение запроса термина дается функцией enumerator.difference ().Однако, начиная с 3.0.1, это просто возвращает 1:
    <code>
    @Override
    public final float difference() {
    // TODO: adjust difference based on distance of searchTerm.text() and term().text()
    return 1.0f;
    }
    
    Так что в какой-то момент это вернет расстояние (вероятно, levenstein) между членами.Но пока он ничего не делает.
1 голос
/ 28 сентября 2010

Это всего лишь дикая догадка, но одной из возможных метрик может быть количество шагов возврата, необходимых движку регулярных выражений для соответствия строкам поиска.

Конечно, эти значения также сильно зависят от качества вашего регулярного выражения, но при сравнении нескольких совпадений тот, который "легче сопоставить", можно считать лучшим совпадением, чем тот, который должен был пройти движок регулярных выражений. искажения для.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...