Соответствующий фрагмент при использовании Lucene's RegexQuery - PullRequest
0 голосов
/ 02 марта 2011

Я выполняю операции запроса по индексу Lucene с помощью RegexQuery.Например, я делаю RegexQuery для получения всех документов, содержащих URL, используя new RegexQuery(new Term("text", "https?://[^\\s]+") (я знаю, что RegEx слишком упрощен).

Теперь я хочу получить фрагмент текста, который фактически соответствует моемузапрос, как http://example.com.Поэтому Lucene предлагает эффективную возможность?Или мне нужно снова обработать весь текст, используя Java RegEx matcher?

1 Ответ

1 голос
/ 02 марта 2011

Я думаю, что то, что вы точно хотите, невозможно, но вот другой подход, который имеет аналогичный эффект:

Откройте Indexreader, получите все термины, следующие после «http» (упорядочено по лексикографическому порядку 1 ) до тех пор, пока они не начнутся с "http://" или" https://":

    final IndexReader reader = IndexReader.open(IndexHelper.DIRECTORY, true);
    final TermEnum termEnum = reader.terms(new Term("text", "http"));
    final List<Term> terms = new ArrayList<Term>();
    Term foundTerm = termEnum.term();

    // if the first term does not match url pattern: advance until it first matches
    if (!(foundTerm.text().startsWith("https://") || foundTerm.text().startsWith("http://"))) {
        while (termEnum.next()) {
            foundTerm = termEnum.term();
            if (foundTerm.text().startsWith("https://") || foundTerm.text().startsWith("http://")) {
                break;
            }
        }
    }
    // collect all terms
    while ((foundTerm.text().startsWith("https://") || foundTerm.text().startsWith("http://")) && termEnum.next()) {
        foundTerm = termEnum.term();
        terms.add(foundTerm);
    }

Полученные URL-адреса затем будут в списке "терминов", как термины lucene..

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

Способ, которым я лежалздесь это не очень гибко (но, возможно, быстрее для достижения цели), но вы, конечно, можете вернуться к шаблонам для достижения большей гибкости.Тогда вы замените все foundTerm.text().startsWith("https://") || foundTerm.text().startsWith("http://") на yourPattern.matches(foundTerm.text()).

И извините, что я так много написал ^^.

Надеюсь, это поможет.

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