Есть два прохода.Во-первых, он генерирует список всех терминов, которые соответствуют регулярному выражению.Во втором он находит все документы с терминами, соответствующими этому регулярному выражению.
Основной код, который вы хотите просмотреть, находится в 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;
}
Две вещи:
- Булевый запрос создается с помощью координат.Таким образом, применяется стандартная оценка координат (т. Е. Чем больше терминов вы получите, тем лучше).
- Повышение запроса термина дается функцией 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) между членами.Но пока он ничего не делает.